From 086158b53cd7e0412f880556c7dff0337002183b Mon Sep 17 00:00:00 2001 From: Phuong Do Date: Mon, 28 Mar 2022 09:26:44 +0700 Subject: [PATCH] commit new version --- .DS_Store | Bin 0 -> 6148 bytes .dockerignore | 2 + .gitignore | 9 +- CHANGELOG.md | 96 - LICENSE | 205 - Makefile | 67 +- README-BITBUCKET.MD | 13 - README.md | 66 +- app.go | 418 - app/app.go | 726 + app/export.go | 185 + app/genesis.go | 21 + cmd/Shareledgerd/cli/fee.go | 44 + cmd/Shareledgerd/cli/fee_convert.go | 27 + cmd/Shareledgerd/cli/middleware.go | 8 + cmd/Shareledgerd/main.go | 56 + cmd/Shareledgerd/sub/import_key.go | 61 + cmd/Shareledgerd/tools/genaccountoperator.go | 50 + cmd/Shareledgerd/tools/genauthority.go | 46 + cmd/Shareledgerd/tools/genesis.go | 92 + cmd/Shareledgerd/tools/gentreasure.go | 46 + cmd/Shareledgerd/tools/genvalidator.go | 50 + cmd/debug/main.go | 256 - cmd/shareledger/add-special-accounts.go | 274 - cmd/shareledger/genaccounts.go | 112 - cmd/shareledger/main.go | 91 - cmd/shareledger/migrate-genesis.go | 316 - cmd/shareledger/testnetCmd.go | 390 - cmd/slcli/createKey.go | 222 - cmd/slcli/delete-key.go | 46 - cmd/slcli/distribution.go | 57 - cmd/slcli/getPersistentPeers.go | 57 - cmd/slcli/import-key.go | 56 - cmd/slcli/main.go | 180 - cmd/slcli/node-config.go | 260 - cmd/slcli/node-privval.go | 136 - cmd/slcli/show-address.go | 120 - cmd/slcli/validator.go | 365 - config.yml | 82 + deploy/.env | 9 + deploy/docker-compose.yaml | 106 + deploy/docker/Dockerfile | 22 + deploy/testnet_config/genesis.json | 48124 +++++++++++++++ deploy/testnet_config/nginx/nginx.conf | 41 + deploy/testnet_config/node0/config/app.toml | 199 + .../testnet_config/node0/config/client.toml | 17 + .../testnet_config/node0/config/config.toml | 401 + .../testnet_config/node0/config/node_key.json | 1 + .../node0/config/priv_validator_key.json | 11 + .../node0/data/priv_validator_state.json | 5 + deploy/testnet_config/node1/config/app.toml | 199 + .../testnet_config/node1/config/client.toml | 17 + .../testnet_config/node1/config/config.toml | 401 + .../testnet_config/node1/config/node_key.json | 1 + .../node1/config/priv_validator_key.json | 11 + .../node1/data/priv_validator_state.json | 5 + deploy/testnet_config/node2/config/app.toml | 199 + .../testnet_config/node2/config/client.toml | 17 + .../testnet_config/node2/config/config.toml | 401 + .../testnet_config/node2/config/node_key.json | 1 + .../node2/config/priv_validator_key.json | 11 + .../node2/data/priv_validator_state.json | 5 + deploy/testnet_config/node3/config/app.toml | 199 + .../testnet_config/node3/config/client.toml | 17 + .../testnet_config/node3/config/config.toml | 401 + .../testnet_config/node3/config/node_key.json | 1 + .../node3/config/priv_validator_key.json | 11 + .../node3/data/priv_validator_state.json | 5 + deploy/testnet_config/script/setup.sh | 12 + docker-compose.yml | 67 - docs/configuration.md | 7 - docs/docs.go | 6 + docs/gentlemint.md | 40 - docs/keys.md | 8 - docs/migrate-genesis.md | 22 - docs/rate.md | 20 - docs/start-single-node.md | 46 - docs/start-testnet.md | 8 - docs/static/openapi.yml | 48974 ++++++++++++++++ go.mod | 35 +- go.sum | 908 +- proto/asset/asset.proto | 12 + proto/asset/genesis.proto | 14 + proto/asset/query.proto | 33 + proto/asset/tx.proto | 46 + proto/booking/booking.proto | 12 + proto/booking/genesis.proto | 14 + proto/booking/query.proto | 33 + proto/booking/tx.proto | 32 + proto/document/doc_basic_state.proto | 11 + proto/document/doc_detail_state.proto | 11 + proto/document/document.proto | 13 + proto/document/genesis.proto | 14 + proto/document/query.proto | 66 + proto/document/tx.proto | 56 + proto/electoral/acc_state.proto | 13 + proto/electoral/authority.proto | 12 + proto/electoral/genesis.proto | 18 + proto/electoral/query.proto | 172 + proto/electoral/treasurer.proto | 12 + proto/electoral/tx.proto | 104 + proto/gentlemint/action_level_fee.proto | 13 + proto/gentlemint/exchange_rate.proto | 12 + proto/gentlemint/genesis.proto | 18 + proto/gentlemint/level_fee.proto | 22 + proto/gentlemint/query.proto | 117 + proto/gentlemint/tx.proto | 111 + proto/id/base_id.proto | 13 + proto/id/genesis.proto | 14 + proto/id/id.proto | 13 + proto/id/query.proto | 49 + proto/id/tx.proto | 57 + testnet/docker/Makefile | 10 - testnet/docker/rest-server/Dockerfile | 15 - testnet/docker/rest-server/wrapper.sh | 21 - testnet/docker/shareledgernode/Dockerfile | 23 - testnet/docker/shareledgernode/wrapper.sh | 31 - testnet/main.go | 7 - testnet/testnet.go | 112 - tests/README.md | 1 - tests/document_test.go | 650 - tests/genesis-v0.0.1.json | 1 - tests/genesis.v0.0.2.json | 368 - tests/gentlemint_load_and_burn_test.go | 296 - tests/gentlemint_test.go | 713 - tests/id_test.go | 544 - tests/main_test.go | 101 - tests/test_helpers.go | 919 - tests/test_helpers_document_module.go | 71 - tests/test_helpers_gentlemint.go | 154 - testutil/keeper/asset.go | 38 + testutil/keeper/booking.go | 47 + testutil/keeper/document.go | 41 + testutil/keeper/electoral.go | 41 + testutil/keeper/gentlemint.go | 40 + testutil/keeper/id.go | 38 + testutil/network/config.go | 28 + testutil/network/flags.go | 29 + testutil/network/keys.go | 46 + testutil/network/network.go | 155 + testutil/network/utils.go | 142 + testutil/sample/sample.go | 11 + testutil/simapp/simapp.go | 49 + types/address.go | 37 - vue/package-lock.json | 15864 +++++ x/ante/ante.go | 42 + x/ante/auth.go | 114 + x/ante/cosmos.go | 53 + x/ante/dependences.go | 30 + x/ante/fee.go | 40 + x/ante/load_fee.go | 30 + x/asset/alias.go | 37 - x/asset/client/cli/query.go | 47 +- x/asset/client/cli/query_asset_by_uuid.go | 49 + x/asset/client/cli/tx.go | 166 +- x/asset/client/cli/tx_create.go | 55 + x/asset/client/cli/tx_delete.go | 43 + x/asset/client/cli/tx_update.go | 55 + x/asset/client/rest/rest.go | 15 - x/asset/client/tests/cli_test.go | 25 + x/asset/client/tests/suite.go | 348 + x/asset/client/tests/test_helpers.go | 53 + x/asset/genesis.go | 40 +- x/asset/genesis_test.go | 23 + x/asset/handler.go | 108 +- x/asset/keeper/asset.go | 69 + x/asset/keeper/grpc_query.go | 7 + x/asset/keeper/grpc_query_asset_by_uuid.go | 27 + x/asset/keeper/keeper.go | 85 +- x/asset/keeper/msg_server.go | 17 + x/asset/keeper/msg_server_create.go | 38 + x/asset/keeper/msg_server_delete.go | 36 + x/asset/keeper/msg_server_test.go | 16 + x/asset/keeper/msg_server_update.go | 43 + x/asset/keeper/querier.go | 33 - x/asset/module.go | 169 +- x/asset/types/asset.pb.go | 498 + x/asset/types/codec.go | 36 +- x/asset/types/errors.go | 6 +- x/asset/{ => types}/events.go | 2 +- x/asset/types/expected_keepers.go | 1 + x/asset/types/genesis.go | 22 + x/asset/types/genesis.pb.go | 330 + x/asset/types/genesis_test.go | 39 + x/asset/types/key.go | 15 - x/asset/types/keys.go | 28 + x/asset/types/message_create.go | 52 + x/asset/types/message_create_test.go | 42 + x/asset/types/message_delete.go | 49 + x/asset/types/message_delete_test.go | 42 + x/asset/types/message_update.go | 52 + x/asset/types/message_update_test.go | 42 + x/asset/types/msgs.go | 146 - x/asset/types/querier.go | 21 - x/asset/types/query.pb.go | 587 + x/asset/types/query.pb.gw.go | 189 + x/asset/types/tx.pb.go | 1590 + x/asset/types/types.go | 26 +- x/booking/GenID_test.go | 30 - x/booking/alias.go | 34 - x/booking/client/cli/query.go | 47 +- x/booking/client/cli/query_booking.go | 47 + x/booking/client/cli/tx.go | 110 +- x/booking/client/cli/tx_book.go | 48 + x/booking/client/cli/tx_complete.go | 43 + x/booking/client/rest/rest.go | 15 - x/booking/client/tests/cli_test.go | 24 + x/booking/client/tests/suite.go | 338 + x/booking/client/tests/test_helpers.go | 46 + x/booking/genesis.go | 41 +- x/booking/genesis_test.go | 23 + x/booking/handler.go | 122 +- x/booking/keeper/asset_keeper.go | 19 + x/booking/keeper/bank_keeper.go | 23 + x/booking/keeper/booking.go | 70 + x/booking/keeper/grpc_query.go | 7 + x/booking/keeper/grpc_query_booking.go | 26 + x/booking/keeper/keeper.go | 119 +- x/booking/keeper/msg_server.go | 17 + x/booking/keeper/msg_server_book.go | 83 + x/booking/keeper/msg_server_complete.go | 71 + x/booking/keeper/msg_server_test.go | 16 + x/booking/keeper/querier.go | 31 - x/booking/module.go | 169 +- x/booking/types/booking.pb.go | 496 + x/booking/types/codec.go | 31 +- x/booking/types/errors.go | 22 +- x/booking/{ => types}/events.go | 2 +- x/booking/types/expected_keepers.go | 1 + x/booking/types/genesis.go | 22 + x/booking/types/genesis.pb.go | 330 + x/booking/types/genesis_test.go | 39 + x/booking/types/key.go | 15 - x/booking/types/keys.go | 27 + x/booking/types/message_book.go | 53 + x/booking/types/message_book_test.go | 43 + x/booking/types/message_complete.go | 49 + x/booking/types/message_complete_test.go | 41 + x/booking/types/msgs.go | 102 - x/booking/types/querier.go | 21 - x/booking/types/query.pb.go | 587 + x/booking/types/query.pb.gw.go | 189 + x/booking/types/tx.pb.go | 988 + x/booking/types/types.go | 20 +- x/booking/utils.go | 21 - x/constant/fee.go | 22 + x/document/client/cli/query.go | 36 + .../client/cli/query_document_by_holder_id.go | 54 + .../client/cli/query_document_by_proof.go | 54 + .../cli/query_document_of_holder_by_issuer.go | 55 + x/document/client/cli/tx.go | 39 + x/document/client/cli/tx_create_document.go | 54 + x/document/client/cli/tx_create_documents.go | 54 + x/document/client/cli/tx_revoke_document.go | 45 + x/document/client/cli/tx_update_document.go | 47 + x/document/client/tests/cli_test.go | 24 + x/document/client/tests/suite.go | 512 + x/document/client/tests/test_helpers.go | 79 + x/document/genesis.go | 31 + x/document/genesis_test.go | 23 + x/document/handler.go | 38 + x/document/keeper/document.go | 101 + x/document/keeper/grpc_query.go | 7 + .../grpc_query_document_by_holder_id.go | 30 + .../keeper/grpc_query_document_by_proof.go | 27 + ...grpc_query_document_of_holder_by_issuer.go | 30 + x/document/keeper/keeper.go | 39 + x/document/keeper/msg_server.go | 17 + .../keeper/msg_server_create_document.go | 53 + .../msg_server_create_document_in_batch.go | 59 + .../keeper/msg_server_revoke_document.go | 46 + x/document/keeper/msg_server_test.go | 16 + .../keeper/msg_server_update_document.go | 58 + x/document/module.go | 169 + x/document/types/codec.go | 39 + x/document/types/doc_basic_state.pb.go | 367 + x/document/types/doc_detail_state.pb.go | 351 + x/document/types/document.go | 111 + x/document/types/document.pb.go | 506 + x/document/types/errors.go | 17 + x/document/types/events.go | 12 + x/document/types/expected_keepers.go | 1 + x/document/types/genesis.go | 22 + x/document/types/genesis.pb.go | 331 + x/document/types/genesis_test.go | 32 + x/document/types/keys.go | 36 + x/document/types/message_create_document.go | 59 + .../types/message_create_document_test.go | 43 + x/document/types/message_create_documents.go | 59 + .../types/message_create_documents_test.go | 43 + x/document/types/message_revoke_document.go | 54 + .../types/message_revoke_document_test.go | 42 + x/document/types/message_update_document.go | 59 + .../types/message_update_document_test.go | 43 + x/document/types/query.pb.go | 1406 + x/document/types/query.pb.gw.go | 413 + x/document/types/tx.pb.go | 2079 + x/document/types/types.go | 1 + x/electoral/alias.go | 32 - x/electoral/client/cli/query.go | 60 +- .../client/cli/query_account_operator.go | 47 + .../client/cli/query_account_operators.go | 43 + .../client/cli/query_document_issuer.go | 47 + .../client/cli/query_document_issuers.go | 43 + x/electoral/client/cli/query_get_loader.go | 87 + x/electoral/client/cli/query_get_loaders.go | 43 + x/electoral/client/cli/query_get_voter.go | 47 + x/electoral/client/cli/query_get_voters.go | 43 + x/electoral/client/cli/query_id_signer.go | 47 + x/electoral/client/cli/query_id_signers.go | 43 + x/electoral/client/cli/tx.go | 130 +- .../client/cli/tx_enroll_account_operators.go | 41 + .../client/cli/tx_enroll_doc_issuers.go | 42 + .../client/cli/tx_enroll_id_signers.go | 86 + x/electoral/client/cli/tx_enroll_loaders.go | 86 + x/electoral/client/cli/tx_enroll_voter.go | 43 + .../client/cli/tx_revoke_account_operators.go | 42 + .../client/cli/tx_revoke_doc_issuer.go | 42 + .../client/cli/tx_revoke_id_signers.go | 42 + x/electoral/client/cli/tx_revoke_loaders.go | 86 + x/electoral/client/cli/tx_revoke_voter.go | 43 + x/electoral/client/rest/rest.go | 15 - x/electoral/client/tests/cli_test.go | 24 + x/electoral/client/tests/suite.go | 531 + x/electoral/client/tests/test_helpers.go | 152 + x/electoral/events.go | 10 - x/electoral/genesis.go | 73 +- x/electoral/genesis_test.go | 41 + x/electoral/handler.go | 88 +- x/electoral/keeper/acc_state.go | 181 + x/electoral/keeper/acc_state_test.go | 58 + x/electoral/keeper/authority.go | 33 + x/electoral/keeper/authority_test.go | 33 + x/electoral/keeper/dependency.go | 7 + x/electoral/keeper/grpc_query.go | 7 + x/electoral/keeper/grpc_query_acc_state.go | 57 + .../keeper/grpc_query_acc_state_test.go | 111 + .../keeper/grpc_query_account_operator.go | 35 + .../keeper/grpc_query_account_operators.go | 32 + .../keeper/grpc_query_document_issuer.go | 36 + .../keeper/grpc_query_document_issuers.go | 31 + x/electoral/keeper/grpc_query_id_signer.go | 35 + x/electoral/keeper/grpc_query_id_signers.go | 31 + x/electoral/keeper/grpc_query_loader.go | 35 + x/electoral/keeper/grpc_query_loaders.go | 32 + x/electoral/keeper/grpc_query_voter.go | 37 + x/electoral/keeper/grpc_query_voters.go | 32 + x/electoral/keeper/keeper.go | 106 +- x/electoral/keeper/msg_server.go | 17 + .../msg_server_enroll_account_operator.go | 40 + .../keeper/msg_server_enroll_doc_issuer.go | 36 + .../keeper/msg_server_enroll_id_signer.go | 38 + .../keeper/msg_server_enroll_loaders.go | 31 + x/electoral/keeper/msg_server_enroll_voter.go | 20 + .../msg_server_revoke_account_operator.go | 41 + .../keeper/msg_server_revoke_doc_issuer.go | 40 + .../keeper/msg_server_revoke_id_signer.go | 39 + .../keeper/msg_server_revoke_loaders.go | 31 + x/electoral/keeper/msg_server_revoke_voter.go | 23 + x/electoral/keeper/msg_server_test.go | 16 + x/electoral/keeper/querier.go | 31 - x/electoral/keeper/role_keeper.go | 34 + x/electoral/keeper/treasurer.go | 33 + x/electoral/keeper/treasurer_test.go | 33 + x/electoral/module.go | 166 +- x/electoral/types/acc_state.pb.go | 418 + x/electoral/types/authority.pb.go | 316 + x/electoral/types/codec.go | 63 +- x/electoral/types/errors.go | 12 + x/electoral/types/expected_keepers.go | 1 + x/electoral/types/genesis.go | 36 + x/electoral/types/genesis.pb.go | 454 + x/electoral/types/genesis_test.go | 67 + x/electoral/types/key.go | 15 - x/electoral/types/key_acc_state.go | 43 + x/electoral/types/keys.go | 51 + .../types/message_enroll_account_operators.go | 52 + .../message_enroll_account_operators_test.go | 41 + .../types/message_enroll_doc_issuers.go | 52 + .../types/message_enroll_doc_issuers_test.go | 41 + .../types/message_enroll_id_signers.go | 52 + .../types/message_enroll_id_signers_test.go | 41 + x/electoral/types/message_enroll_loaders.go | 52 + .../types/message_enroll_loaders_test.go | 41 + x/electoral/types/message_enroll_voter.go | 47 + .../types/message_enroll_voter_test.go | 41 + .../types/message_revoke_account_operators.go | 52 + .../message_revoke_account_operators_test.go | 41 + .../types/message_revoke_doc_issuers.go | 52 + .../types/message_revoke_doc_issuers_test.go | 41 + .../types/message_revoke_id_signers.go | 52 + .../types/message_revoke_id_signers_test.go | 41 + x/electoral/types/message_revoke_loaders.go | 52 + .../types/message_revoke_loaders_test.go | 41 + x/electoral/types/message_revoke_voter.go | 48 + .../types/message_revoke_voter_test.go | 41 + x/electoral/types/msgs.go | 87 - x/electoral/types/querier.go | 21 - x/electoral/types/query.pb.go | 4702 ++ x/electoral/types/query.pb.gw.go | 1102 + x/electoral/types/treasurer.pb.go | 316 + x/electoral/types/tx.pb.go | 4008 ++ x/electoral/types/types.go | 27 - x/electoral/utils.go | 21 - x/fee/fee_table.go | 131 + x/fee/fee_table_test.go | 19 + x/gatecheck/authante.go | 32 - x/gatecheck/authcheck.go | 69 - x/gatecheck/feecheck.go | 96 - x/gatecheck/feeensure.go | 32 - x/gatecheck/gatecheck.go | 21 - x/gatecheck/valcheck.go | 30 - x/gentlemint/alias.go | 72 - x/gentlemint/client/cli/query.go | 112 +- .../client/cli/query_account_operator.go | 50 - .../client/cli/query_action_level_fee.go | 69 + .../client/cli/query_action_level_fee_test.go | 30 + x/gentlemint/client/cli/query_balances.go | 50 + x/gentlemint/client/cli/query_check_fees.go | 45 + .../client/cli/query_document_issuer.go | 50 - x/gentlemint/client/cli/query_get_exchange.go | 38 + x/gentlemint/client/cli/query_id.go | 50 - x/gentlemint/client/cli/query_level_fee.go | 69 + x/gentlemint/client/cli/tx.go | 673 +- .../client/cli/tx_account_operator.go | 123 - .../client/cli/tx_action_level_fee.go | 73 + x/gentlemint/client/cli/tx_burn.go | 47 + x/gentlemint/client/cli/tx_buy_shr.go | 44 + x/gentlemint/client/cli/tx_document_issuer.go | 123 - x/gentlemint/client/cli/tx_id_signer.go | 193 - x/gentlemint/client/cli/tx_level_fee.go | 77 + x/gentlemint/client/cli/tx_load.go | 47 + x/gentlemint/client/cli/tx_send.go | 50 + x/gentlemint/client/cli/tx_set_exchange.go | 44 + x/gentlemint/client/rest/rest.go | 13 - x/gentlemint/client/rest/tx.go | 1 - x/gentlemint/client/tests/cli_test.go | 24 + x/gentlemint/client/tests/suite.go | 615 + x/gentlemint/client/tests/test_helpers.go | 96 + x/gentlemint/genesis.go | 121 +- x/gentlemint/genesis_test.go | 47 + x/gentlemint/handler.go | 376 +- x/gentlemint/handler_account_operator.go | 106 - x/gentlemint/handler_document_issuer.go | 88 - x/gentlemint/handler_id_signer.go | 90 - x/gentlemint/keeper/action_level_fee.go | 63 + x/gentlemint/keeper/action_level_fee_test.go | 56 + x/gentlemint/keeper/exchange_rate.go | 41 + x/gentlemint/keeper/exchange_rate_test.go | 36 + x/gentlemint/keeper/fee.go | 71 + x/gentlemint/keeper/grpc_query.go | 7 + .../keeper/grpc_query_action_level_fees.go | 67 + x/gentlemint/keeper/grpc_query_balances.go | 35 + x/gentlemint/keeper/grpc_query_check_fees.go | 64 + .../keeper/grpc_query_exchange_rate.go | 24 + .../keeper/grpc_query_exchange_rate_test.go | 44 + x/gentlemint/keeper/grpc_query_level_fees.go | 87 + .../keeper/grpc_query_level_fees_test.go | 64 + x/gentlemint/keeper/keeper.go | 375 +- x/gentlemint/keeper/keeper_acc_op.go | 58 - x/gentlemint/keeper/keeper_document.go | 65 - x/gentlemint/keeper/keeper_test.go | 86 - x/gentlemint/keeper/level_fee.go | 71 + x/gentlemint/keeper/level_fee_test.go | 56 + x/gentlemint/keeper/msg_server.go | 17 + .../keeper/msg_server_action_level_fee.go | 54 + .../msg_server_action_level_fee_test.go | 144 + x/gentlemint/keeper/msg_server_burn.go | 27 + x/gentlemint/keeper/msg_server_buy_shr.go | 30 + x/gentlemint/keeper/msg_server_level_fee.go | 50 + .../keeper/msg_server_level_fee_test.go | 143 + x/gentlemint/keeper/msg_server_load.go | 55 + x/gentlemint/keeper/msg_server_load_fee.go | 15 + x/gentlemint/keeper/msg_server_send.go | 36 + .../keeper/msg_server_set_exchange.go | 14 + x/gentlemint/keeper/querier.go | 157 - x/gentlemint/keeper/test_common.go | 35 - x/gentlemint/module.go | 172 +- x/gentlemint/types/action_level_fee.pb.go | 419 + x/gentlemint/types/codec.go | 81 +- x/gentlemint/types/errors.go | 15 +- x/gentlemint/types/exchange_rate.pb.go | 316 + x/gentlemint/types/expected_keepers.go | 25 + x/gentlemint/types/genesis.go | 47 + x/gentlemint/types/genesis.pb.go | 458 + x/gentlemint/types/genesis_test.go | 86 + x/gentlemint/types/key.go | 30 - x/gentlemint/types/key_action_level_fee.go | 23 + x/gentlemint/types/key_level_fee.go | 23 + x/gentlemint/types/keys.go | 71 + x/gentlemint/types/level_fee.pb.go | 764 + x/gentlemint/types/message_burn.go | 52 + x/gentlemint/types/message_burn_test.go | 40 + x/gentlemint/types/message_buy_shr.go | 53 + x/gentlemint/types/message_buy_shr_test.go | 41 + x/gentlemint/types/message_load.go | 58 + x/gentlemint/types/message_load_fee.go | 44 + x/gentlemint/types/message_load_fee_test.go | 40 + x/gentlemint/types/message_load_test.go | 44 + x/gentlemint/types/message_send.go | 59 + x/gentlemint/types/message_send_test.go | 44 + x/gentlemint/types/message_set_exchange.go | 48 + .../types/message_set_exchange_test.go | 42 + .../types/messages_action_level_fee.go | 91 + .../types/messages_action_level_fee_test.go | 102 + x/gentlemint/types/messages_level_fee.go | 102 + x/gentlemint/types/messages_level_fee_test.go | 115 + x/gentlemint/types/msgs.go | 523 - x/gentlemint/types/msgs_acc_operator.go | 109 - x/gentlemint/types/msgs_document.go | 108 - x/gentlemint/types/msgs_id.go | 108 - x/gentlemint/types/query.pb.go | 3076 + x/gentlemint/types/query.pb.gw.go | 651 + x/gentlemint/types/tx.pb.go | 4290 ++ x/gentlemint/types/types.go | 73 - x/id/client/cli/query.go | 34 + x/id/client/cli/query_id_by_address.go | 54 + x/id/client/cli/query_id_by_id.go | 54 + x/id/client/cli/tx.go | 39 + x/id/client/cli/tx_create_id.go | 56 + x/id/client/cli/tx_create_ids.go | 57 + x/id/client/cli/tx_replace_id_owner.go | 45 + x/id/client/cli/tx_update_id.go | 45 + x/id/client/tests/cli_test.go | 23 + x/id/client/tests/suite.go | 491 + x/id/client/tests/test_helpers.go | 74 + x/id/genesis.go | 31 + x/id/genesis_test.go | 23 + x/id/handler.go | 38 + x/id/keeper/grpc_query.go | 7 + x/id/keeper/grpc_query_id_by_address.go | 28 + x/id/keeper/grpc_query_id_by_id.go | 26 + x/id/keeper/id.go | 103 + x/id/keeper/keeper.go | 35 + x/id/keeper/msg_server.go | 17 + x/id/keeper/msg_server_create_id.go | 41 + x/id/keeper/msg_server_create_id_batch.go | 53 + x/id/keeper/msg_server_replace_id_owner.go | 54 + x/id/keeper/msg_server_test.go | 16 + x/id/keeper/msg_server_update_id.go | 44 + x/id/module.go | 169 + x/id/types/base_id.pb.go | 471 + x/id/types/codec.go | 39 + x/id/types/errors.go | 17 + x/id/types/events.go | 13 + x/id/types/expected_keepers.go | 1 + x/id/types/genesis.go | 22 + x/id/types/genesis.pb.go | 330 + x/id/types/genesis_test.go | 39 + x/id/types/id.go | 32 + x/id/types/id.pb.go | 376 + x/id/types/keys.go | 34 + x/id/types/message_create_id.go | 83 + x/id/types/message_create_id_batch.go | 83 + x/id/types/message_create_id_batch_test.go | 71 + x/id/types/message_create_id_test.go | 44 + x/id/types/message_replace_id_owner.go | 54 + x/id/types/message_replace_id_owner_test.go | 42 + x/id/types/message_update_id.go | 50 + x/id/types/message_update_id_test.go | 42 + x/id/types/query.pb.go | 971 + x/id/types/query.pb.gw.go | 290 + x/id/types/tx.pb.go | 2137 + x/id/types/types.go | 1 + x/identity/alias.go | 37 - x/identity/client/cli/query.go | 73 - x/identity/client/cli/tx.go | 309 - x/identity/client/rest/rest.go | 13 - x/identity/client/rest/tx.go | 1 - x/identity/events.go | 10 - x/identity/genesis.go | 55 - x/identity/handler.go | 150 - x/identity/keeper/keeper.go | 140 - x/identity/keeper/querier.go | 45 - x/identity/module.go | 116 - x/identity/types/codec.go | 21 - x/identity/types/errors.go | 10 - x/identity/types/key.go | 15 - x/identity/types/msgs.go | 232 - x/identity/types/types.go | 26 - x/utils/demo/denom.go | 155 + x/utils/demo/denom_test.go | 96 + x/utils/utils.go | 65 + 583 files changed, 174472 insertions(+), 15670 deletions(-) create mode 100644 .DS_Store create mode 100644 .dockerignore delete mode 100644 CHANGELOG.md delete mode 100644 LICENSE delete mode 100644 README-BITBUCKET.MD delete mode 100644 app.go create mode 100644 app/app.go create mode 100644 app/export.go create mode 100644 app/genesis.go create mode 100644 cmd/Shareledgerd/cli/fee.go create mode 100644 cmd/Shareledgerd/cli/fee_convert.go create mode 100644 cmd/Shareledgerd/cli/middleware.go create mode 100644 cmd/Shareledgerd/main.go create mode 100644 cmd/Shareledgerd/sub/import_key.go create mode 100644 cmd/Shareledgerd/tools/genaccountoperator.go create mode 100644 cmd/Shareledgerd/tools/genauthority.go create mode 100644 cmd/Shareledgerd/tools/genesis.go create mode 100644 cmd/Shareledgerd/tools/gentreasure.go create mode 100644 cmd/Shareledgerd/tools/genvalidator.go delete mode 100644 cmd/debug/main.go delete mode 100644 cmd/shareledger/add-special-accounts.go delete mode 100644 cmd/shareledger/genaccounts.go delete mode 100644 cmd/shareledger/main.go delete mode 100644 cmd/shareledger/migrate-genesis.go delete mode 100644 cmd/shareledger/testnetCmd.go delete mode 100644 cmd/slcli/createKey.go delete mode 100644 cmd/slcli/delete-key.go delete mode 100644 cmd/slcli/distribution.go delete mode 100644 cmd/slcli/getPersistentPeers.go delete mode 100644 cmd/slcli/import-key.go delete mode 100644 cmd/slcli/main.go delete mode 100644 cmd/slcli/node-config.go delete mode 100644 cmd/slcli/node-privval.go delete mode 100644 cmd/slcli/show-address.go delete mode 100644 cmd/slcli/validator.go create mode 100644 config.yml create mode 100644 deploy/.env create mode 100644 deploy/docker-compose.yaml create mode 100644 deploy/docker/Dockerfile create mode 100755 deploy/testnet_config/genesis.json create mode 100644 deploy/testnet_config/nginx/nginx.conf create mode 100644 deploy/testnet_config/node0/config/app.toml create mode 100644 deploy/testnet_config/node0/config/client.toml create mode 100644 deploy/testnet_config/node0/config/config.toml create mode 100644 deploy/testnet_config/node0/config/node_key.json create mode 100644 deploy/testnet_config/node0/config/priv_validator_key.json create mode 100644 deploy/testnet_config/node0/data/priv_validator_state.json create mode 100644 deploy/testnet_config/node1/config/app.toml create mode 100644 deploy/testnet_config/node1/config/client.toml create mode 100644 deploy/testnet_config/node1/config/config.toml create mode 100644 deploy/testnet_config/node1/config/node_key.json create mode 100644 deploy/testnet_config/node1/config/priv_validator_key.json create mode 100644 deploy/testnet_config/node1/data/priv_validator_state.json create mode 100644 deploy/testnet_config/node2/config/app.toml create mode 100644 deploy/testnet_config/node2/config/client.toml create mode 100644 deploy/testnet_config/node2/config/config.toml create mode 100644 deploy/testnet_config/node2/config/node_key.json create mode 100644 deploy/testnet_config/node2/config/priv_validator_key.json create mode 100644 deploy/testnet_config/node2/data/priv_validator_state.json create mode 100644 deploy/testnet_config/node3/config/app.toml create mode 100644 deploy/testnet_config/node3/config/client.toml create mode 100644 deploy/testnet_config/node3/config/config.toml create mode 100644 deploy/testnet_config/node3/config/node_key.json create mode 100644 deploy/testnet_config/node3/config/priv_validator_key.json create mode 100644 deploy/testnet_config/node3/data/priv_validator_state.json create mode 100644 deploy/testnet_config/script/setup.sh delete mode 100644 docker-compose.yml delete mode 100644 docs/configuration.md create mode 100644 docs/docs.go delete mode 100644 docs/gentlemint.md delete mode 100644 docs/keys.md delete mode 100644 docs/migrate-genesis.md delete mode 100644 docs/rate.md delete mode 100644 docs/start-single-node.md delete mode 100644 docs/start-testnet.md create mode 100644 docs/static/openapi.yml create mode 100644 proto/asset/asset.proto create mode 100644 proto/asset/genesis.proto create mode 100644 proto/asset/query.proto create mode 100644 proto/asset/tx.proto create mode 100644 proto/booking/booking.proto create mode 100644 proto/booking/genesis.proto create mode 100644 proto/booking/query.proto create mode 100644 proto/booking/tx.proto create mode 100644 proto/document/doc_basic_state.proto create mode 100644 proto/document/doc_detail_state.proto create mode 100644 proto/document/document.proto create mode 100644 proto/document/genesis.proto create mode 100644 proto/document/query.proto create mode 100644 proto/document/tx.proto create mode 100644 proto/electoral/acc_state.proto create mode 100644 proto/electoral/authority.proto create mode 100644 proto/electoral/genesis.proto create mode 100644 proto/electoral/query.proto create mode 100644 proto/electoral/treasurer.proto create mode 100644 proto/electoral/tx.proto create mode 100644 proto/gentlemint/action_level_fee.proto create mode 100644 proto/gentlemint/exchange_rate.proto create mode 100644 proto/gentlemint/genesis.proto create mode 100644 proto/gentlemint/level_fee.proto create mode 100644 proto/gentlemint/query.proto create mode 100644 proto/gentlemint/tx.proto create mode 100644 proto/id/base_id.proto create mode 100644 proto/id/genesis.proto create mode 100644 proto/id/id.proto create mode 100644 proto/id/query.proto create mode 100644 proto/id/tx.proto delete mode 100644 testnet/docker/Makefile delete mode 100644 testnet/docker/rest-server/Dockerfile delete mode 100755 testnet/docker/rest-server/wrapper.sh delete mode 100644 testnet/docker/shareledgernode/Dockerfile delete mode 100755 testnet/docker/shareledgernode/wrapper.sh delete mode 100644 testnet/main.go delete mode 100644 testnet/testnet.go delete mode 100644 tests/README.md delete mode 100644 tests/document_test.go delete mode 100644 tests/genesis-v0.0.1.json delete mode 100644 tests/genesis.v0.0.2.json delete mode 100644 tests/gentlemint_load_and_burn_test.go delete mode 100644 tests/gentlemint_test.go delete mode 100644 tests/id_test.go delete mode 100644 tests/main_test.go delete mode 100644 tests/test_helpers.go delete mode 100644 tests/test_helpers_document_module.go delete mode 100644 tests/test_helpers_gentlemint.go create mode 100644 testutil/keeper/asset.go create mode 100644 testutil/keeper/booking.go create mode 100644 testutil/keeper/document.go create mode 100644 testutil/keeper/electoral.go create mode 100644 testutil/keeper/gentlemint.go create mode 100644 testutil/keeper/id.go create mode 100644 testutil/network/config.go create mode 100644 testutil/network/flags.go create mode 100644 testutil/network/keys.go create mode 100644 testutil/network/network.go create mode 100644 testutil/network/utils.go create mode 100644 testutil/sample/sample.go create mode 100644 testutil/simapp/simapp.go delete mode 100644 types/address.go create mode 100644 vue/package-lock.json create mode 100644 x/ante/ante.go create mode 100644 x/ante/auth.go create mode 100644 x/ante/cosmos.go create mode 100644 x/ante/dependences.go create mode 100644 x/ante/fee.go create mode 100644 x/ante/load_fee.go delete mode 100644 x/asset/alias.go create mode 100644 x/asset/client/cli/query_asset_by_uuid.go create mode 100644 x/asset/client/cli/tx_create.go create mode 100644 x/asset/client/cli/tx_delete.go create mode 100644 x/asset/client/cli/tx_update.go delete mode 100644 x/asset/client/rest/rest.go create mode 100644 x/asset/client/tests/cli_test.go create mode 100644 x/asset/client/tests/suite.go create mode 100644 x/asset/client/tests/test_helpers.go create mode 100644 x/asset/genesis_test.go create mode 100644 x/asset/keeper/asset.go create mode 100644 x/asset/keeper/grpc_query.go create mode 100644 x/asset/keeper/grpc_query_asset_by_uuid.go create mode 100644 x/asset/keeper/msg_server.go create mode 100644 x/asset/keeper/msg_server_create.go create mode 100644 x/asset/keeper/msg_server_delete.go create mode 100644 x/asset/keeper/msg_server_test.go create mode 100644 x/asset/keeper/msg_server_update.go delete mode 100644 x/asset/keeper/querier.go create mode 100644 x/asset/types/asset.pb.go rename x/asset/{ => types}/events.go (96%) create mode 100644 x/asset/types/expected_keepers.go create mode 100644 x/asset/types/genesis.go create mode 100644 x/asset/types/genesis.pb.go create mode 100644 x/asset/types/genesis_test.go delete mode 100644 x/asset/types/key.go create mode 100644 x/asset/types/keys.go create mode 100644 x/asset/types/message_create.go create mode 100644 x/asset/types/message_create_test.go create mode 100644 x/asset/types/message_delete.go create mode 100644 x/asset/types/message_delete_test.go create mode 100644 x/asset/types/message_update.go create mode 100644 x/asset/types/message_update_test.go delete mode 100644 x/asset/types/msgs.go delete mode 100644 x/asset/types/querier.go create mode 100644 x/asset/types/query.pb.go create mode 100644 x/asset/types/query.pb.gw.go create mode 100644 x/asset/types/tx.pb.go delete mode 100644 x/booking/GenID_test.go delete mode 100644 x/booking/alias.go create mode 100644 x/booking/client/cli/query_booking.go create mode 100644 x/booking/client/cli/tx_book.go create mode 100644 x/booking/client/cli/tx_complete.go delete mode 100644 x/booking/client/rest/rest.go create mode 100644 x/booking/client/tests/cli_test.go create mode 100644 x/booking/client/tests/suite.go create mode 100644 x/booking/client/tests/test_helpers.go create mode 100644 x/booking/genesis_test.go create mode 100644 x/booking/keeper/asset_keeper.go create mode 100644 x/booking/keeper/bank_keeper.go create mode 100644 x/booking/keeper/booking.go create mode 100644 x/booking/keeper/grpc_query.go create mode 100644 x/booking/keeper/grpc_query_booking.go create mode 100644 x/booking/keeper/msg_server.go create mode 100644 x/booking/keeper/msg_server_book.go create mode 100644 x/booking/keeper/msg_server_complete.go create mode 100644 x/booking/keeper/msg_server_test.go delete mode 100644 x/booking/keeper/querier.go create mode 100644 x/booking/types/booking.pb.go rename x/booking/{ => types}/events.go (92%) create mode 100644 x/booking/types/expected_keepers.go create mode 100644 x/booking/types/genesis.go create mode 100644 x/booking/types/genesis.pb.go create mode 100644 x/booking/types/genesis_test.go delete mode 100644 x/booking/types/key.go create mode 100644 x/booking/types/keys.go create mode 100644 x/booking/types/message_book.go create mode 100644 x/booking/types/message_book_test.go create mode 100644 x/booking/types/message_complete.go create mode 100644 x/booking/types/message_complete_test.go delete mode 100644 x/booking/types/msgs.go delete mode 100644 x/booking/types/querier.go create mode 100644 x/booking/types/query.pb.go create mode 100644 x/booking/types/query.pb.gw.go create mode 100644 x/booking/types/tx.pb.go delete mode 100644 x/booking/utils.go create mode 100644 x/constant/fee.go create mode 100644 x/document/client/cli/query.go create mode 100644 x/document/client/cli/query_document_by_holder_id.go create mode 100644 x/document/client/cli/query_document_by_proof.go create mode 100644 x/document/client/cli/query_document_of_holder_by_issuer.go create mode 100644 x/document/client/cli/tx.go create mode 100644 x/document/client/cli/tx_create_document.go create mode 100644 x/document/client/cli/tx_create_documents.go create mode 100644 x/document/client/cli/tx_revoke_document.go create mode 100644 x/document/client/cli/tx_update_document.go create mode 100644 x/document/client/tests/cli_test.go create mode 100644 x/document/client/tests/suite.go create mode 100644 x/document/client/tests/test_helpers.go create mode 100644 x/document/genesis.go create mode 100644 x/document/genesis_test.go create mode 100644 x/document/handler.go create mode 100644 x/document/keeper/document.go create mode 100644 x/document/keeper/grpc_query.go create mode 100644 x/document/keeper/grpc_query_document_by_holder_id.go create mode 100644 x/document/keeper/grpc_query_document_by_proof.go create mode 100644 x/document/keeper/grpc_query_document_of_holder_by_issuer.go create mode 100644 x/document/keeper/keeper.go create mode 100644 x/document/keeper/msg_server.go create mode 100644 x/document/keeper/msg_server_create_document.go create mode 100644 x/document/keeper/msg_server_create_document_in_batch.go create mode 100644 x/document/keeper/msg_server_revoke_document.go create mode 100644 x/document/keeper/msg_server_test.go create mode 100644 x/document/keeper/msg_server_update_document.go create mode 100644 x/document/module.go create mode 100644 x/document/types/codec.go create mode 100644 x/document/types/doc_basic_state.pb.go create mode 100644 x/document/types/doc_detail_state.pb.go create mode 100644 x/document/types/document.go create mode 100644 x/document/types/document.pb.go create mode 100644 x/document/types/errors.go create mode 100644 x/document/types/events.go create mode 100644 x/document/types/expected_keepers.go create mode 100644 x/document/types/genesis.go create mode 100644 x/document/types/genesis.pb.go create mode 100644 x/document/types/genesis_test.go create mode 100644 x/document/types/keys.go create mode 100644 x/document/types/message_create_document.go create mode 100644 x/document/types/message_create_document_test.go create mode 100644 x/document/types/message_create_documents.go create mode 100644 x/document/types/message_create_documents_test.go create mode 100644 x/document/types/message_revoke_document.go create mode 100644 x/document/types/message_revoke_document_test.go create mode 100644 x/document/types/message_update_document.go create mode 100644 x/document/types/message_update_document_test.go create mode 100644 x/document/types/query.pb.go create mode 100644 x/document/types/query.pb.gw.go create mode 100644 x/document/types/tx.pb.go create mode 100644 x/document/types/types.go delete mode 100644 x/electoral/alias.go create mode 100644 x/electoral/client/cli/query_account_operator.go create mode 100644 x/electoral/client/cli/query_account_operators.go create mode 100644 x/electoral/client/cli/query_document_issuer.go create mode 100644 x/electoral/client/cli/query_document_issuers.go create mode 100644 x/electoral/client/cli/query_get_loader.go create mode 100644 x/electoral/client/cli/query_get_loaders.go create mode 100644 x/electoral/client/cli/query_get_voter.go create mode 100644 x/electoral/client/cli/query_get_voters.go create mode 100644 x/electoral/client/cli/query_id_signer.go create mode 100644 x/electoral/client/cli/query_id_signers.go create mode 100644 x/electoral/client/cli/tx_enroll_account_operators.go create mode 100644 x/electoral/client/cli/tx_enroll_doc_issuers.go create mode 100644 x/electoral/client/cli/tx_enroll_id_signers.go create mode 100644 x/electoral/client/cli/tx_enroll_loaders.go create mode 100644 x/electoral/client/cli/tx_enroll_voter.go create mode 100644 x/electoral/client/cli/tx_revoke_account_operators.go create mode 100644 x/electoral/client/cli/tx_revoke_doc_issuer.go create mode 100644 x/electoral/client/cli/tx_revoke_id_signers.go create mode 100644 x/electoral/client/cli/tx_revoke_loaders.go create mode 100644 x/electoral/client/cli/tx_revoke_voter.go delete mode 100644 x/electoral/client/rest/rest.go create mode 100644 x/electoral/client/tests/cli_test.go create mode 100644 x/electoral/client/tests/suite.go create mode 100644 x/electoral/client/tests/test_helpers.go delete mode 100644 x/electoral/events.go create mode 100644 x/electoral/genesis_test.go create mode 100644 x/electoral/keeper/acc_state.go create mode 100644 x/electoral/keeper/acc_state_test.go create mode 100644 x/electoral/keeper/authority.go create mode 100644 x/electoral/keeper/authority_test.go create mode 100644 x/electoral/keeper/dependency.go create mode 100644 x/electoral/keeper/grpc_query.go create mode 100644 x/electoral/keeper/grpc_query_acc_state.go create mode 100644 x/electoral/keeper/grpc_query_acc_state_test.go create mode 100644 x/electoral/keeper/grpc_query_account_operator.go create mode 100644 x/electoral/keeper/grpc_query_account_operators.go create mode 100644 x/electoral/keeper/grpc_query_document_issuer.go create mode 100644 x/electoral/keeper/grpc_query_document_issuers.go create mode 100644 x/electoral/keeper/grpc_query_id_signer.go create mode 100644 x/electoral/keeper/grpc_query_id_signers.go create mode 100644 x/electoral/keeper/grpc_query_loader.go create mode 100644 x/electoral/keeper/grpc_query_loaders.go create mode 100644 x/electoral/keeper/grpc_query_voter.go create mode 100644 x/electoral/keeper/grpc_query_voters.go create mode 100644 x/electoral/keeper/msg_server.go create mode 100644 x/electoral/keeper/msg_server_enroll_account_operator.go create mode 100644 x/electoral/keeper/msg_server_enroll_doc_issuer.go create mode 100644 x/electoral/keeper/msg_server_enroll_id_signer.go create mode 100644 x/electoral/keeper/msg_server_enroll_loaders.go create mode 100644 x/electoral/keeper/msg_server_enroll_voter.go create mode 100644 x/electoral/keeper/msg_server_revoke_account_operator.go create mode 100644 x/electoral/keeper/msg_server_revoke_doc_issuer.go create mode 100644 x/electoral/keeper/msg_server_revoke_id_signer.go create mode 100644 x/electoral/keeper/msg_server_revoke_loaders.go create mode 100644 x/electoral/keeper/msg_server_revoke_voter.go create mode 100644 x/electoral/keeper/msg_server_test.go delete mode 100644 x/electoral/keeper/querier.go create mode 100644 x/electoral/keeper/role_keeper.go create mode 100644 x/electoral/keeper/treasurer.go create mode 100644 x/electoral/keeper/treasurer_test.go create mode 100644 x/electoral/types/acc_state.pb.go create mode 100644 x/electoral/types/authority.pb.go create mode 100644 x/electoral/types/errors.go create mode 100644 x/electoral/types/expected_keepers.go create mode 100644 x/electoral/types/genesis.go create mode 100644 x/electoral/types/genesis.pb.go create mode 100644 x/electoral/types/genesis_test.go delete mode 100644 x/electoral/types/key.go create mode 100644 x/electoral/types/key_acc_state.go create mode 100644 x/electoral/types/keys.go create mode 100644 x/electoral/types/message_enroll_account_operators.go create mode 100644 x/electoral/types/message_enroll_account_operators_test.go create mode 100644 x/electoral/types/message_enroll_doc_issuers.go create mode 100644 x/electoral/types/message_enroll_doc_issuers_test.go create mode 100644 x/electoral/types/message_enroll_id_signers.go create mode 100644 x/electoral/types/message_enroll_id_signers_test.go create mode 100644 x/electoral/types/message_enroll_loaders.go create mode 100644 x/electoral/types/message_enroll_loaders_test.go create mode 100644 x/electoral/types/message_enroll_voter.go create mode 100644 x/electoral/types/message_enroll_voter_test.go create mode 100644 x/electoral/types/message_revoke_account_operators.go create mode 100644 x/electoral/types/message_revoke_account_operators_test.go create mode 100644 x/electoral/types/message_revoke_doc_issuers.go create mode 100644 x/electoral/types/message_revoke_doc_issuers_test.go create mode 100644 x/electoral/types/message_revoke_id_signers.go create mode 100644 x/electoral/types/message_revoke_id_signers_test.go create mode 100644 x/electoral/types/message_revoke_loaders.go create mode 100644 x/electoral/types/message_revoke_loaders_test.go create mode 100644 x/electoral/types/message_revoke_voter.go create mode 100644 x/electoral/types/message_revoke_voter_test.go delete mode 100644 x/electoral/types/msgs.go delete mode 100644 x/electoral/types/querier.go create mode 100644 x/electoral/types/query.pb.go create mode 100644 x/electoral/types/query.pb.gw.go create mode 100644 x/electoral/types/treasurer.pb.go create mode 100644 x/electoral/types/tx.pb.go delete mode 100644 x/electoral/utils.go create mode 100644 x/fee/fee_table.go create mode 100644 x/fee/fee_table_test.go delete mode 100644 x/gatecheck/authante.go delete mode 100644 x/gatecheck/authcheck.go delete mode 100644 x/gatecheck/feecheck.go delete mode 100644 x/gatecheck/feeensure.go delete mode 100644 x/gatecheck/gatecheck.go delete mode 100644 x/gatecheck/valcheck.go delete mode 100644 x/gentlemint/alias.go delete mode 100644 x/gentlemint/client/cli/query_account_operator.go create mode 100644 x/gentlemint/client/cli/query_action_level_fee.go create mode 100644 x/gentlemint/client/cli/query_action_level_fee_test.go create mode 100644 x/gentlemint/client/cli/query_balances.go create mode 100644 x/gentlemint/client/cli/query_check_fees.go delete mode 100644 x/gentlemint/client/cli/query_document_issuer.go create mode 100644 x/gentlemint/client/cli/query_get_exchange.go delete mode 100644 x/gentlemint/client/cli/query_id.go create mode 100644 x/gentlemint/client/cli/query_level_fee.go delete mode 100644 x/gentlemint/client/cli/tx_account_operator.go create mode 100644 x/gentlemint/client/cli/tx_action_level_fee.go create mode 100644 x/gentlemint/client/cli/tx_burn.go create mode 100644 x/gentlemint/client/cli/tx_buy_shr.go delete mode 100644 x/gentlemint/client/cli/tx_document_issuer.go delete mode 100644 x/gentlemint/client/cli/tx_id_signer.go create mode 100644 x/gentlemint/client/cli/tx_level_fee.go create mode 100644 x/gentlemint/client/cli/tx_load.go create mode 100644 x/gentlemint/client/cli/tx_send.go create mode 100644 x/gentlemint/client/cli/tx_set_exchange.go delete mode 100644 x/gentlemint/client/rest/rest.go delete mode 100644 x/gentlemint/client/rest/tx.go create mode 100644 x/gentlemint/client/tests/cli_test.go create mode 100644 x/gentlemint/client/tests/suite.go create mode 100644 x/gentlemint/client/tests/test_helpers.go create mode 100644 x/gentlemint/genesis_test.go delete mode 100644 x/gentlemint/handler_account_operator.go delete mode 100644 x/gentlemint/handler_document_issuer.go delete mode 100644 x/gentlemint/handler_id_signer.go create mode 100644 x/gentlemint/keeper/action_level_fee.go create mode 100644 x/gentlemint/keeper/action_level_fee_test.go create mode 100644 x/gentlemint/keeper/exchange_rate.go create mode 100644 x/gentlemint/keeper/exchange_rate_test.go create mode 100644 x/gentlemint/keeper/fee.go create mode 100644 x/gentlemint/keeper/grpc_query.go create mode 100644 x/gentlemint/keeper/grpc_query_action_level_fees.go create mode 100644 x/gentlemint/keeper/grpc_query_balances.go create mode 100644 x/gentlemint/keeper/grpc_query_check_fees.go create mode 100644 x/gentlemint/keeper/grpc_query_exchange_rate.go create mode 100644 x/gentlemint/keeper/grpc_query_exchange_rate_test.go create mode 100644 x/gentlemint/keeper/grpc_query_level_fees.go create mode 100644 x/gentlemint/keeper/grpc_query_level_fees_test.go delete mode 100644 x/gentlemint/keeper/keeper_acc_op.go delete mode 100644 x/gentlemint/keeper/keeper_document.go delete mode 100644 x/gentlemint/keeper/keeper_test.go create mode 100644 x/gentlemint/keeper/level_fee.go create mode 100644 x/gentlemint/keeper/level_fee_test.go create mode 100644 x/gentlemint/keeper/msg_server.go create mode 100644 x/gentlemint/keeper/msg_server_action_level_fee.go create mode 100644 x/gentlemint/keeper/msg_server_action_level_fee_test.go create mode 100644 x/gentlemint/keeper/msg_server_burn.go create mode 100644 x/gentlemint/keeper/msg_server_buy_shr.go create mode 100644 x/gentlemint/keeper/msg_server_level_fee.go create mode 100644 x/gentlemint/keeper/msg_server_level_fee_test.go create mode 100644 x/gentlemint/keeper/msg_server_load.go create mode 100644 x/gentlemint/keeper/msg_server_load_fee.go create mode 100644 x/gentlemint/keeper/msg_server_send.go create mode 100644 x/gentlemint/keeper/msg_server_set_exchange.go delete mode 100644 x/gentlemint/keeper/querier.go delete mode 100644 x/gentlemint/keeper/test_common.go create mode 100644 x/gentlemint/types/action_level_fee.pb.go create mode 100644 x/gentlemint/types/exchange_rate.pb.go create mode 100644 x/gentlemint/types/expected_keepers.go create mode 100644 x/gentlemint/types/genesis.go create mode 100644 x/gentlemint/types/genesis.pb.go create mode 100644 x/gentlemint/types/genesis_test.go delete mode 100644 x/gentlemint/types/key.go create mode 100644 x/gentlemint/types/key_action_level_fee.go create mode 100644 x/gentlemint/types/key_level_fee.go create mode 100644 x/gentlemint/types/keys.go create mode 100644 x/gentlemint/types/level_fee.pb.go create mode 100644 x/gentlemint/types/message_burn.go create mode 100644 x/gentlemint/types/message_burn_test.go create mode 100644 x/gentlemint/types/message_buy_shr.go create mode 100644 x/gentlemint/types/message_buy_shr_test.go create mode 100644 x/gentlemint/types/message_load.go create mode 100644 x/gentlemint/types/message_load_fee.go create mode 100644 x/gentlemint/types/message_load_fee_test.go create mode 100644 x/gentlemint/types/message_load_test.go create mode 100644 x/gentlemint/types/message_send.go create mode 100644 x/gentlemint/types/message_send_test.go create mode 100644 x/gentlemint/types/message_set_exchange.go create mode 100644 x/gentlemint/types/message_set_exchange_test.go create mode 100644 x/gentlemint/types/messages_action_level_fee.go create mode 100644 x/gentlemint/types/messages_action_level_fee_test.go create mode 100644 x/gentlemint/types/messages_level_fee.go create mode 100644 x/gentlemint/types/messages_level_fee_test.go delete mode 100644 x/gentlemint/types/msgs.go delete mode 100644 x/gentlemint/types/msgs_acc_operator.go delete mode 100644 x/gentlemint/types/msgs_document.go delete mode 100644 x/gentlemint/types/msgs_id.go create mode 100644 x/gentlemint/types/query.pb.go create mode 100644 x/gentlemint/types/query.pb.gw.go create mode 100644 x/gentlemint/types/tx.pb.go create mode 100644 x/id/client/cli/query.go create mode 100644 x/id/client/cli/query_id_by_address.go create mode 100644 x/id/client/cli/query_id_by_id.go create mode 100644 x/id/client/cli/tx.go create mode 100644 x/id/client/cli/tx_create_id.go create mode 100644 x/id/client/cli/tx_create_ids.go create mode 100644 x/id/client/cli/tx_replace_id_owner.go create mode 100644 x/id/client/cli/tx_update_id.go create mode 100644 x/id/client/tests/cli_test.go create mode 100644 x/id/client/tests/suite.go create mode 100644 x/id/client/tests/test_helpers.go create mode 100644 x/id/genesis.go create mode 100644 x/id/genesis_test.go create mode 100644 x/id/handler.go create mode 100644 x/id/keeper/grpc_query.go create mode 100644 x/id/keeper/grpc_query_id_by_address.go create mode 100644 x/id/keeper/grpc_query_id_by_id.go create mode 100644 x/id/keeper/id.go create mode 100644 x/id/keeper/keeper.go create mode 100644 x/id/keeper/msg_server.go create mode 100644 x/id/keeper/msg_server_create_id.go create mode 100644 x/id/keeper/msg_server_create_id_batch.go create mode 100644 x/id/keeper/msg_server_replace_id_owner.go create mode 100644 x/id/keeper/msg_server_test.go create mode 100644 x/id/keeper/msg_server_update_id.go create mode 100644 x/id/module.go create mode 100644 x/id/types/base_id.pb.go create mode 100644 x/id/types/codec.go create mode 100644 x/id/types/errors.go create mode 100644 x/id/types/events.go create mode 100644 x/id/types/expected_keepers.go create mode 100644 x/id/types/genesis.go create mode 100644 x/id/types/genesis.pb.go create mode 100644 x/id/types/genesis_test.go create mode 100644 x/id/types/id.go create mode 100644 x/id/types/id.pb.go create mode 100644 x/id/types/keys.go create mode 100644 x/id/types/message_create_id.go create mode 100644 x/id/types/message_create_id_batch.go create mode 100644 x/id/types/message_create_id_batch_test.go create mode 100644 x/id/types/message_create_id_test.go create mode 100644 x/id/types/message_replace_id_owner.go create mode 100644 x/id/types/message_replace_id_owner_test.go create mode 100644 x/id/types/message_update_id.go create mode 100644 x/id/types/message_update_id_test.go create mode 100644 x/id/types/query.pb.go create mode 100644 x/id/types/query.pb.gw.go create mode 100644 x/id/types/tx.pb.go create mode 100644 x/id/types/types.go delete mode 100644 x/identity/alias.go delete mode 100644 x/identity/client/cli/query.go delete mode 100644 x/identity/client/cli/tx.go delete mode 100644 x/identity/client/rest/rest.go delete mode 100644 x/identity/client/rest/tx.go delete mode 100644 x/identity/events.go delete mode 100644 x/identity/genesis.go delete mode 100644 x/identity/handler.go delete mode 100644 x/identity/keeper/keeper.go delete mode 100644 x/identity/keeper/querier.go delete mode 100644 x/identity/module.go delete mode 100644 x/identity/types/codec.go delete mode 100644 x/identity/types/errors.go delete mode 100644 x/identity/types/key.go delete mode 100644 x/identity/types/msgs.go delete mode 100644 x/identity/types/types.go create mode 100644 x/utils/demo/denom.go create mode 100644 x/utils/demo/denom_test.go create mode 100644 x/utils/utils.go diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0=1.15 -* [`make`](https://www.gnu.org/software/make/) - compile tool +To launch your blockchain live on multiple nodes, use `starport network` commands. Learn more about [Starport Network](https://github.com/tendermint/spn). +### Web Frontend -#### Get Source Code +Starport has scaffolded a Vue.js-based web app in the `vue` directory. Run the following commands to install dependencies and start the app: ``` -git clone https://github.com/sharering/shareledger.git -cd shareledger +cd vue +npm install +npm run serve ``` -#### Compile (_Work on Linux only_) +The frontend app is built using the `@starport/vue` and `@starport/vuex` packages. For details, see the [monorepo for Starport front-end development](https://github.com/tendermint/vue). + +## Release +To release a new version of your blockchain, create and push a new tag with `v` prefix. A new draft release with the configured targets will be created. + ``` -make build +git tag v0.1 +git push origin v0.1 ``` -This will compile ShareLedger and put the binary in `./build` - +After a draft release is created, make your final changes from the release page and publish it. -# Run +### Install +To install the latest version of your blockchain node's binary, execute the following command on your machine: -* To start a ShareLedger node ``` -./shareledger init -./shareledger start +curl https://get.starport.network/ShareRing/Shareledger@latest! | sudo bash ``` -* Start single node for testing purpose: [start single node](./docs/start-single-node.md) - - - Run `./build/shareledger -h` _to get more detailed information on how to execute ShareLedger_ +`ShareRing/Shareledger` should match the `username` and `repo_name` of the Github repository to which the source code was pushed. Learn more about [the install process](https://github.com/allinbits/starport-installer). +## Learn more ---- -## Notes -* Get code from branch feature/upgrade-2019-10-22 \ No newline at end of file +- [Starport](https://github.com/tendermint/starport) +- [Starport Docs](https://docs.starport.network) +- [Cosmos SDK documentation](https://docs.cosmos.network) +- [Cosmos SDK Tutorials](https://tutorials.cosmos.network) +- [Discord](https://discord.gg/cosmosnetwork) diff --git a/app.go b/app.go deleted file mode 100644 index 22e38a16..00000000 --- a/app.go +++ /dev/null @@ -1,418 +0,0 @@ -package app - -import ( - "encoding/json" - "os" - - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - tmtypes "github.com/tendermint/tendermint/types" - dbm "github.com/tendermint/tm-db" - - "github.com/cosmos/cosmos-sdk/baseapp" - bam "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/simapp" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/vesting" - "github.com/cosmos/cosmos-sdk/x/bank" - distr "github.com/cosmos/cosmos-sdk/x/distribution" - - "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/cosmos/cosmos-sdk/x/params" - "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/cosmos-sdk/x/supply" - - "github.com/ShareRing/modules/document" - "github.com/ShareRing/modules/id" - "github.com/sharering/shareledger/x/asset" - booking "github.com/sharering/shareledger/x/booking" - "github.com/sharering/shareledger/x/electoral" - "github.com/sharering/shareledger/x/gatecheck" - "github.com/sharering/shareledger/x/gentlemint" - "github.com/sharering/shareledger/x/identity" -) - -const ( - appName = "shareledger" - stakingTokenDenom = "shr" - minGasPrice = "0.00000015shr" -) - -var ( - // default home directories for the application CLI - DefaultCLIHome = os.ExpandEnv("$HOME/.slcli") - - // DefaultNodeHome sets the folder where the applcation data and configuration will be stored - DefaultNodeHome = os.ExpandEnv("$HOME/.shareledger") - - // NewBasicManager is in charge of setting up basic module elements - ModuleBasics = module.NewBasicManager( - genutil.AppModuleBasic{}, - auth.AppModuleBasic{}, - bank.AppModuleBasic{}, - staking.AppModuleBasic{}, - distr.AppModuleBasic{}, - params.AppModuleBasic{}, - slashing.AppModuleBasic{}, - supply.AppModuleBasic{}, - - gentlemint.AppModule{}, - electoral.AppModule{}, - asset.AppModule{}, - booking.AppModule{}, - identity.AppModule{}, - id.AppModule{}, - document.AppModule{}, - ) - // account permissions - maccPerms = map[string][]string{ - auth.FeeCollectorName: nil, - distr.ModuleName: nil, - booking.ModuleName: nil, - staking.BondedPoolName: {supply.Burner, supply.Staking}, - staking.NotBondedPoolName: {supply.Burner, supply.Staking}, - gentlemint.ModuleName: {supply.Minter, supply.Burner}, - } -) - -// MakeCodec generates the necessary codecs for Amino -func MakeCodec() *codec.Codec { - var cdc = codec.New() - - ModuleBasics.RegisterCodec(cdc) - vesting.RegisterCodec(cdc) - sdk.RegisterCodec(cdc) - codec.RegisterCrypto(cdc) - - return cdc -} -func init() { - setGenesisDefaults() - // sdk.PowerReduction = sdk.NewInt(1) -} - -func setGenesisDefaults() { - staking.DefaultGenesisState = createStakingGenesisState -} - -func createStakingGenesisState() stakingtypes.GenesisState { - genesisState := stakingtypes.DefaultGenesisState() - genesisState.Params.BondDenom = stakingTokenDenom - return genesisState -} - -type shareledgerApp struct { - *bam.BaseApp - cdc *codec.Codec - - // keys to access the substores - keys map[string]*sdk.KVStoreKey - tkeys map[string]*sdk.TransientStoreKey - - // subspaces - subspaces map[string]params.Subspace - - // Keepers - accountKeeper auth.AccountKeeper - bankKeeper bank.Keeper - stakingKeeper staking.Keeper - slashingKeeper slashing.Keeper - distrKeeper distr.Keeper - supplyKeeper supply.Keeper - paramsKeeper params.Keeper - gmKeeper gentlemint.Keeper - electoralKeeper electoral.Keeper - assetKeeper asset.Keeper - bookingKeeper booking.Keeper - identityKeeper identity.Keeper - idKeeper id.Keeper - docKeeper document.Keeper - // Module Manager - mm *module.Manager - - // simulation manager - sm *module.SimulationManager -} - -// verify app interface at compile time -var _ simapp.App = (*shareledgerApp)(nil) - -// NewshareledgerApp is a constructor function for shareledgerApp -func NewshareledgerApp( - logger log.Logger, db dbm.DB, baseAppOptions ...func(*bam.BaseApp), -) *shareledgerApp { - - // First define the top level codec that will be shared by the different modules - cdc := MakeCodec() - - // BaseApp handles interactions with Tendermint through the ABCI protocol - bApp := bam.NewBaseApp(appName, logger, db, auth.DefaultTxDecoder(cdc), baseAppOptions...) - - bApp.SetAppVersion(version.Version) - - keys := sdk.NewKVStoreKeys(bam.MainStoreKey, auth.StoreKey, staking.StoreKey, - supply.StoreKey, distr.StoreKey, slashing.StoreKey, params.StoreKey, - gentlemint.StoreKey, electoral.StoreKey, asset.StoreKey, booking.StoreKey, - identity.StoreKey, id.StoreKey, document.StoreKey) - - tkeys := sdk.NewTransientStoreKeys(params.TStoreKey) - - // Here you initialize your application with the store keys it requires - var app = &shareledgerApp{ - BaseApp: bApp, - cdc: cdc, - keys: keys, - tkeys: tkeys, - subspaces: make(map[string]params.Subspace), - } - app.SetMinimumGasPrices(minGasPrice) - // The ParamsKeeper handles parameter storage for the application - app.paramsKeeper = params.NewKeeper(app.cdc, keys[params.StoreKey], tkeys[params.TStoreKey]) - // Set specific supspaces - app.subspaces[auth.ModuleName] = app.paramsKeeper.Subspace(auth.DefaultParamspace) - app.subspaces[bank.ModuleName] = app.paramsKeeper.Subspace(bank.DefaultParamspace) - app.subspaces[staking.ModuleName] = app.paramsKeeper.Subspace(staking.DefaultParamspace) - app.subspaces[distr.ModuleName] = app.paramsKeeper.Subspace(distr.DefaultParamspace) - app.subspaces[slashing.ModuleName] = app.paramsKeeper.Subspace(slashing.DefaultParamspace) - - // The AccountKeeper handles address -> account lookups - app.accountKeeper = auth.NewAccountKeeper( - app.cdc, - keys[auth.StoreKey], - app.subspaces[auth.ModuleName], - auth.ProtoBaseAccount, - ) - - // The BankKeeper allows you perform sdk.Coins interactions - app.bankKeeper = bank.NewBaseKeeper( - app.accountKeeper, - app.subspaces[bank.ModuleName], - app.ModuleAccountAddrs(), - ) - - // The SupplyKeeper collects transaction fees and renders them to the fee distribution module - app.supplyKeeper = supply.NewKeeper( - app.cdc, - keys[supply.StoreKey], - app.accountKeeper, - app.bankKeeper, - maccPerms, - ) - - // The staking keeper - stakingKeeper := staking.NewKeeper( - app.cdc, - keys[staking.StoreKey], - app.supplyKeeper, - app.subspaces[staking.ModuleName], - ) - - app.distrKeeper = distr.NewKeeper( - app.cdc, - keys[distr.StoreKey], - app.subspaces[distr.ModuleName], - &stakingKeeper, - app.supplyKeeper, - auth.FeeCollectorName, - app.ModuleAccountAddrs(), - ) - - app.slashingKeeper = slashing.NewKeeper( - app.cdc, - keys[slashing.StoreKey], - &stakingKeeper, - app.subspaces[slashing.ModuleName], - ) - - // register the staking hooks - // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks - app.stakingKeeper = *stakingKeeper.SetHooks( - staking.NewMultiStakingHooks( - app.distrKeeper.Hooks(), - app.slashingKeeper.Hooks()), - ) - - app.gmKeeper = gentlemint.NewKeeper( - app.cdc, - keys[gentlemint.StoreKey], - app.accountKeeper, - app.supplyKeeper, - app.bankKeeper, - ) - app.electoralKeeper = electoral.NewKeeper(app.cdc, keys[electoral.StoreKey], app.gmKeeper) - app.assetKeeper = asset.NewKeeper( - app.cdc, - keys[asset.StoreKey], - ) - app.bookingKeeper = booking.NewKeeper(cdc, keys[booking.StoreKey], app.assetKeeper, app.supplyKeeper) - - app.identityKeeper = identity.NewKeeper(cdc, keys[identity.ModuleName], app.gmKeeper) - app.idKeeper = id.NewKeeper(cdc, keys[id.ModuleName], app.gmKeeper) - app.docKeeper = document.NewKeeper(cdc, keys[document.ModuleName]) - - app.mm = module.NewManager( - genutil.NewAppModule(app.accountKeeper, app.stakingKeeper, app.BaseApp.DeliverTx), - auth.NewAppModule(app.accountKeeper), - bank.NewAppModule(app.bankKeeper, app.accountKeeper), - gentlemint.NewAppModule(app.gmKeeper, app.accountKeeper, app.supplyKeeper), - electoral.NewAppModule(app.electoralKeeper), - asset.NewAppModule(app.assetKeeper), - booking.NewAppModule(app.bookingKeeper), - identity.NewAppModule(app.identityKeeper), - id.NewAppModule(app.idKeeper), - document.NewAppModule(app.docKeeper), - supply.NewAppModule(app.supplyKeeper, app.accountKeeper), - distr.NewAppModule(app.distrKeeper, app.accountKeeper, app.supplyKeeper, app.stakingKeeper), - slashing.NewAppModule(app.slashingKeeper, app.accountKeeper, app.stakingKeeper), - staking.NewAppModule(app.stakingKeeper, app.accountKeeper, app.supplyKeeper), - ) - - app.mm.SetOrderBeginBlockers(distr.ModuleName, slashing.ModuleName) - app.mm.SetOrderEndBlockers(staking.ModuleName) - - // Sets the order of Genesis - Order matters, genutil is to always come last - // NOTE: The genutils moodule must occur after staking so that pools are - // properly initialized with tokens from genesis accounts. - app.mm.SetOrderInitGenesis( - distr.ModuleName, - staking.ModuleName, - auth.ModuleName, - electoral.ModuleName, - bank.ModuleName, - slashing.ModuleName, - gentlemint.ModuleName, - asset.ModuleName, - booking.ModuleName, - identity.ModuleName, - id.ModuleName, - document.ModuleName, - supply.ModuleName, - genutil.ModuleName, - ) - - // register all module routes and module queriers - app.mm.RegisterRoutes(app.Router(), app.QueryRouter()) - - // The initChainer handles translating the genesis.json file into initial state for the network - app.SetInitChainer(app.InitChainer) - app.SetBeginBlocker(app.BeginBlocker) - app.SetEndBlocker(app.EndBlocker) - - // The AnteHandler handles signature verification and transaction pre-processing - app.SetAnteHandler( - gatecheck.NewAnteHandler( - app.accountKeeper, - app.electoralKeeper, - app.supplyKeeper, - app.gmKeeper, - app.idKeeper, - auth.DefaultSigVerificationGasConsumer, - ), - ) - - // initialize stores - app.MountKVStores(keys) - app.MountTransientStores(tkeys) - - err := app.LoadLatestVersion(app.keys[bam.MainStoreKey]) - if err != nil { - tmos.Exit(err.Error()) - } - - return app -} - -// GenesisState represents chain state at the start of the chain. Any initial state (account balances) are stored here. -type GenesisState map[string]json.RawMessage - -func NewDefaultGenesisState() GenesisState { - return ModuleBasics.DefaultGenesis() -} - -func (app *shareledgerApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - var genesisState GenesisState - - err := app.cdc.UnmarshalJSON(req.AppStateBytes, &genesisState) - if err != nil { - panic(err) - } - - return app.mm.InitGenesis(ctx, genesisState) -} - -func (app *shareledgerApp) SetMinimumGasPrices(gasPricesStr string) (err error) { - if _, err = sdk.ParseDecCoins(gasPricesStr); err != nil { - return - } - - baseapp.SetMinGasPrices(gasPricesStr)(app.BaseApp) - return -} - -func (app *shareledgerApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { - return app.mm.BeginBlock(ctx, req) -} - -func (app *shareledgerApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - return app.mm.EndBlock(ctx, req) -} - -// GetKey returns the KVStoreKey for the provided store key -func (app *shareledgerApp) GetKey(storeKey string) *sdk.KVStoreKey { - return app.keys[storeKey] -} - -// GetTKey returns the TransientStoreKey for the provided store key -func (app *shareledgerApp) GetTKey(storeKey string) *sdk.TransientStoreKey { - return app.tkeys[storeKey] -} - -func (app *shareledgerApp) LoadHeight(height int64) error { - return app.LoadVersion(height, app.keys[bam.MainStoreKey]) -} - -// Codec returns simapp's codec -func (app *shareledgerApp) Codec() *codec.Codec { - return app.cdc -} - -// SimulationManager implements the SimulationApp interface -func (app *shareledgerApp) SimulationManager() *module.SimulationManager { - return app.sm -} - -// ModuleAccountAddrs returns all the app's module account addresses. -func (app *shareledgerApp) ModuleAccountAddrs() map[string]bool { - modAccAddrs := make(map[string]bool) - for acc := range maccPerms { - modAccAddrs[supply.NewModuleAddress(acc).String()] = true - } - - return modAccAddrs -} - -//_________________________________________________________ - -func (app *shareledgerApp) ExportAppStateAndValidators(forZeroHeight bool, jailWhiteList []string, -) (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error) { - - // as if they could withdraw from the start of the next block - ctx := app.NewContext(true, abci.Header{Height: app.LastBlockHeight()}) - - genState := app.mm.ExportGenesis(ctx) - appState, err = codec.MarshalJSONIndent(app.cdc, genState) - if err != nil { - return nil, nil, err - } - - validators = staking.WriteValidators(ctx, app.stakingKeeper) - - return appState, validators, nil -} diff --git a/app/app.go b/app/app.go new file mode 100644 index 00000000..4c175e39 --- /dev/null +++ b/app/app.go @@ -0,0 +1,726 @@ +package app + +import ( + "io" + "net/http" + "os" + "path/filepath" + + "github.com/sharering/shareledger/x/ante" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" + "github.com/cosmos/cosmos-sdk/client/rpc" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/server/api" + "github.com/cosmos/cosmos-sdk/server/config" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/version" + "github.com/cosmos/cosmos-sdk/x/auth" + authante "github.com/cosmos/cosmos-sdk/x/auth/ante" + authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/auth/vesting" + "github.com/cosmos/cosmos-sdk/x/bank" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/capability" + capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/cosmos-sdk/x/crisis" + crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" + crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + distr "github.com/cosmos/cosmos-sdk/x/distribution" + distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/evidence" + evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" + feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" + feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/cosmos/cosmos-sdk/x/gov" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/cosmos/cosmos-sdk/x/mint" + mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/cosmos/cosmos-sdk/x/params" + paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" + paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + "github.com/cosmos/cosmos-sdk/x/slashing" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + "github.com/cosmos/cosmos-sdk/x/staking" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/cosmos/cosmos-sdk/x/upgrade" + upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/cosmos/ibc-go/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/modules/core" + ibcclient "github.com/cosmos/ibc-go/modules/core/02-client" + ibcporttypes "github.com/cosmos/ibc-go/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/modules/core/24-host" + ibckeeper "github.com/cosmos/ibc-go/modules/core/keeper" + "github.com/spf13/cast" + abci "github.com/tendermint/tendermint/abci/types" + tmjson "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/libs/log" + tmos "github.com/tendermint/tendermint/libs/os" + dbm "github.com/tendermint/tm-db" + + "github.com/tendermint/spm/cosmoscmd" + "github.com/tendermint/spm/openapiconsole" + + "github.com/sharering/shareledger/docs" + assetmodule "github.com/sharering/shareledger/x/asset" + assetmodulekeeper "github.com/sharering/shareledger/x/asset/keeper" + assetmoduletypes "github.com/sharering/shareledger/x/asset/types" + bookingmodule "github.com/sharering/shareledger/x/booking" + bookingmodulekeeper "github.com/sharering/shareledger/x/booking/keeper" + bookingmoduletypes "github.com/sharering/shareledger/x/booking/types" + documentmodule "github.com/sharering/shareledger/x/document" + documentmodulekeeper "github.com/sharering/shareledger/x/document/keeper" + documentmoduletypes "github.com/sharering/shareledger/x/document/types" + electoralmodule "github.com/sharering/shareledger/x/electoral" + electoralmodulekeeper "github.com/sharering/shareledger/x/electoral/keeper" + electoralmoduletypes "github.com/sharering/shareledger/x/electoral/types" + gentlemintmodule "github.com/sharering/shareledger/x/gentlemint" + gentlemintmodulekeeper "github.com/sharering/shareledger/x/gentlemint/keeper" + gentlemintmoduletypes "github.com/sharering/shareledger/x/gentlemint/types" + idmodule "github.com/sharering/shareledger/x/id" + idmodulekeeper "github.com/sharering/shareledger/x/id/keeper" + idmoduletypes "github.com/sharering/shareledger/x/id/types" +) + +const ( + AccountAddressPrefix = "shareledger" + Name = "Shareledger" +) + +// this line is used by starport scaffolding # stargate/wasm/app/enabledProposals + +func getGovProposalHandlers() []govclient.ProposalHandler { + var govProposalHandlers []govclient.ProposalHandler + // this line is used by starport scaffolding # stargate/app/govProposalHandlers + + govProposalHandlers = append(govProposalHandlers, + paramsclient.ProposalHandler, + distrclient.ProposalHandler, + upgradeclient.ProposalHandler, + upgradeclient.CancelProposalHandler, + // this line is used by starport scaffolding # stargate/app/govProposalHandler + ) + + return govProposalHandlers +} + +var ( + // DefaultNodeHome default home directories for the application daemon + DefaultNodeHome string + + // ModuleBasics defines the module BasicManager is in charge of setting up basic, + // non-dependant module elements, such as codec registration + // and genesis verification. + ModuleBasics = module.NewBasicManager( + auth.AppModuleBasic{}, + genutil.AppModuleBasic{}, + bank.AppModuleBasic{}, + capability.AppModuleBasic{}, + staking.AppModuleBasic{}, + mint.AppModuleBasic{}, + distr.AppModuleBasic{}, + gov.NewAppModuleBasic(getGovProposalHandlers()...), + params.AppModuleBasic{}, + crisis.AppModuleBasic{}, + slashing.AppModuleBasic{}, + feegrantmodule.AppModuleBasic{}, + ibc.AppModuleBasic{}, + upgrade.AppModuleBasic{}, + evidence.AppModuleBasic{}, + transfer.AppModuleBasic{}, + vesting.AppModuleBasic{}, + documentmodule.AppModuleBasic{}, + idmodule.AppModuleBasic{}, + assetmodule.AppModuleBasic{}, + bookingmodule.AppModuleBasic{}, + gentlemintmodule.AppModuleBasic{}, + electoralmodule.AppModuleBasic{}, + // this line is used by starport scaffolding # stargate/app/moduleBasic + ) + + // module account permissions + maccPerms = map[string][]string{ + authtypes.FeeCollectorName: nil, + distrtypes.ModuleName: nil, + minttypes.ModuleName: {authtypes.Minter}, + stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, + stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + govtypes.ModuleName: {authtypes.Burner}, + ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + bookingmoduletypes.ModuleName: nil, + gentlemintmoduletypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + electoralmoduletypes.ModuleName: nil, + // this line is used by starport scaffolding # stargate/app/maccPerms + } +) + +var ( + _ cosmoscmd.CosmosApp = (*App)(nil) + _ servertypes.Application = (*App)(nil) +) + +func init() { + userHomeDir, err := os.UserHomeDir() + if err != nil { + panic(err) + } + + DefaultNodeHome = filepath.Join(userHomeDir, "."+Name) +} + +var ( + FlagAppOptionSkipCheckVoter = "skip-checking-voter-role" +) + +// App extends an ABCI application, but with most of its parameters exported. +// They are exported for convenience in creating helper functions, as object +// capabilities aren't needed for testing. +type App struct { + *baseapp.BaseApp + + cdc *codec.LegacyAmino + appCodec codec.Codec + interfaceRegistry types.InterfaceRegistry + + invCheckPeriod uint + + // keys to access the substores + keys map[string]*sdk.KVStoreKey + tkeys map[string]*sdk.TransientStoreKey + memKeys map[string]*sdk.MemoryStoreKey + + // keepers + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + DistrKeeper distrkeeper.Keeper + GovKeeper govkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + EvidenceKeeper evidencekeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + + // make scoped keepers public for test purposes + ScopedIBCKeeper capabilitykeeper.ScopedKeeper + ScopedTransferKeeper capabilitykeeper.ScopedKeeper + + DocumentKeeper documentmodulekeeper.Keeper + + IdKeeper idmodulekeeper.Keeper + + AssetKeeper assetmodulekeeper.Keeper + + BookingKeeper bookingmodulekeeper.Keeper + + GentleMintKeeper gentlemintmodulekeeper.Keeper + + ElectoralKeeper electoralmodulekeeper.Keeper + // this line is used by starport scaffolding # stargate/app/keeperDeclaration + + // the module manager + mm *module.Manager +} + +// New returns a reference to an initialized Gaia. +func New( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + loadLatest bool, + skipUpgradeHeights map[int64]bool, + homePath string, + invCheckPeriod uint, + encodingConfig cosmoscmd.EncodingConfig, + appOpts servertypes.AppOptions, + baseAppOptions ...func(*baseapp.BaseApp), +) cosmoscmd.App { + appCodec := encodingConfig.Marshaler + cdc := encodingConfig.Amino + interfaceRegistry := encodingConfig.InterfaceRegistry + + bApp := baseapp.NewBaseApp(Name, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) + bApp.SetCommitMultiStoreTracer(traceStore) + bApp.SetVersion(version.Version) + bApp.SetInterfaceRegistry(interfaceRegistry) + + keys := sdk.NewKVStoreKeys( + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, + govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, + evidencetypes.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, + documentmoduletypes.StoreKey, + idmoduletypes.StoreKey, + assetmoduletypes.StoreKey, + bookingmoduletypes.StoreKey, + gentlemintmoduletypes.StoreKey, + electoralmoduletypes.StoreKey, + // this line is used by starport scaffolding # stargate/app/storeKey + ) + tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) + memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) + + app := &App{ + BaseApp: bApp, + cdc: cdc, + appCodec: appCodec, + interfaceRegistry: interfaceRegistry, + invCheckPeriod: invCheckPeriod, + keys: keys, + tkeys: tkeys, + memKeys: memKeys, + } + + app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) + + // set the BaseApp's parameter store + bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable())) + + // add capability keeper and ScopeToModule for ibc module + app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) + + // grant capabilities for the ibc and ibc-transfer modules + scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) + scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + // this line is used by starport scaffolding # stargate/app/scopedKeeper + + // add keepers + app.AccountKeeper = authkeeper.NewAccountKeeper( + appCodec, keys[authtypes.StoreKey], app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, + ) + app.BankKeeper = bankkeeper.NewBaseKeeper( + appCodec, keys[banktypes.StoreKey], app.AccountKeeper, app.GetSubspace(banktypes.ModuleName), app.ModuleAccountAddrs(), + ) + stakingKeeper := stakingkeeper.NewKeeper( + appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName), + ) + app.MintKeeper = mintkeeper.NewKeeper( + appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper, + app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, + ) + app.DistrKeeper = distrkeeper.NewKeeper( + appCodec, keys[distrtypes.StoreKey], app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, + &stakingKeeper, authtypes.FeeCollectorName, app.ModuleAccountAddrs(), + ) + app.SlashingKeeper = slashingkeeper.NewKeeper( + appCodec, keys[slashingtypes.StoreKey], &stakingKeeper, app.GetSubspace(slashingtypes.ModuleName), + ) + app.CrisisKeeper = crisiskeeper.NewKeeper( + app.GetSubspace(crisistypes.ModuleName), invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + ) + + app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) + app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp) + + // register the staking hooks + // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks + app.StakingKeeper = *stakingKeeper.SetHooks( + stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()), + ) + + // ... other modules keepers + + // CreateAsset IBC Keeper + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, app.UpgradeKeeper, scopedIBCKeeper, + ) + + // register the proposal types + govRouter := govtypes.NewRouter() + govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). + AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). + AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). + AddRoute(ibchost.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) + + // CreateAsset Transfer Keepers + app.TransferKeeper = ibctransferkeeper.NewKeeper( + appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), + app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, + app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, + ) + transferModule := transfer.NewAppModule(app.TransferKeeper) + + // CreateAsset evidence Keeper for to register the IBC light client misbehaviour evidence route + evidenceKeeper := evidencekeeper.NewKeeper( + appCodec, keys[evidencetypes.StoreKey], &app.StakingKeeper, app.SlashingKeeper, + ) + // If evidence needs to be handled for the app, set routes in router here and seal + app.EvidenceKeeper = *evidenceKeeper + + app.GovKeeper = govkeeper.NewKeeper( + appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, + &stakingKeeper, govRouter, + ) + + app.GentleMintKeeper = *gentlemintmodulekeeper.NewKeeper( + appCodec, + keys[gentlemintmoduletypes.StoreKey], + keys[gentlemintmoduletypes.MemStoreKey], + + app.BankKeeper, + app.AccountKeeper, + ) + gentlemintModule := gentlemintmodule.NewAppModule(appCodec, app.GentleMintKeeper) + + app.ElectoralKeeper = *electoralmodulekeeper.NewKeeper( + appCodec, + keys[electoralmoduletypes.StoreKey], + keys[electoralmoduletypes.MemStoreKey], + + app.GentleMintKeeper, + ) + electoralModule := electoralmodule.NewAppModule(appCodec, app.ElectoralKeeper) + + app.IdKeeper = *idmodulekeeper.NewKeeper( + appCodec, + keys[idmoduletypes.StoreKey], + keys[idmoduletypes.MemStoreKey], + ) + idModule := idmodule.NewAppModule(appCodec, app.IdKeeper) + + app.AssetKeeper = *assetmodulekeeper.NewKeeper( + appCodec, + keys[assetmoduletypes.StoreKey], + keys[assetmoduletypes.MemStoreKey], + ) + assetModule := assetmodule.NewAppModule(appCodec, app.AssetKeeper) + + app.BookingKeeper = *bookingmodulekeeper.NewKeeper( + appCodec, + keys[bookingmoduletypes.StoreKey], + keys[bookingmoduletypes.MemStoreKey], + app.AssetKeeper, + app.BankKeeper, + ) + bookingModule := bookingmodule.NewAppModule(appCodec, app.BookingKeeper) + + app.DocumentKeeper = *documentmodulekeeper.NewKeeper( + appCodec, + keys[documentmoduletypes.StoreKey], + keys[documentmoduletypes.MemStoreKey], + app.IdKeeper, + ) + documentModule := documentmodule.NewAppModule(appCodec, app.DocumentKeeper) + + // this line is used by starport scaffolding # stargate/app/keeperDefinition + + // CreateAsset static IBC router, add transfer route, then set and seal it + ibcRouter := ibcporttypes.NewRouter() + ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferModule) + // this line is used by starport scaffolding # ibc/app/router + app.IBCKeeper.SetRouter(ibcRouter) + + /**** Module Options ****/ + + // NOTE: we may consider parsing `appOpts` inside module constructors. For the moment + // we prefer to be more strict in what arguments the modules expect. + var skipGenesisInvariants = cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) + + // NOTE: Any module instantiated in the module manager that is later modified + // must be passed by reference here. + + app.mm = module.NewManager( + genutil.NewAppModule( + app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, + encodingConfig.TxConfig, + ), + auth.NewAppModule(appCodec, app.AccountKeeper, nil), + vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), + capability.NewAppModule(appCodec, *app.CapabilityKeeper), + feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), + gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + upgrade.NewAppModule(app.UpgradeKeeper), + evidence.NewAppModule(app.EvidenceKeeper), + ibc.NewAppModule(app.IBCKeeper), + params.NewAppModule(app.ParamsKeeper), + transferModule, + documentModule, + idModule, + assetModule, + bookingModule, + gentlemintModule, + electoralModule, + // this line is used by starport scaffolding # stargate/app/appModule + + ) + + // During begin block slashing happens after distr.BeginBlocker so that + // there is nothing left over in the validator fee pool, so as to keep the + // CanWithdrawInvariant invariant. + // NOTE: staking module is required if HistoricalEntries param > 0 + app.mm.SetOrderBeginBlockers( + upgradetypes.ModuleName, capabilitytypes.ModuleName, minttypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, + evidencetypes.ModuleName, stakingtypes.ModuleName, ibchost.ModuleName, + feegrant.ModuleName, + ) + + app.mm.SetOrderEndBlockers(crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName) + + // NOTE: The genutils module must occur after staking so that pools are + // properly initialized with tokens from genesis accounts. + // NOTE: Capability module must occur first so that it can initialize any capabilities + // so that other modules that want to create or claim capabilities afterwards in InitChain + // can do so safely. + app.mm.SetOrderInitGenesis( + capabilitytypes.ModuleName, + authtypes.ModuleName, + electoralmoduletypes.ModuleName, + banktypes.ModuleName, + distrtypes.ModuleName, + stakingtypes.ModuleName, + slashingtypes.ModuleName, + gentlemintmoduletypes.ModuleName, + govtypes.ModuleName, + minttypes.ModuleName, + crisistypes.ModuleName, + ibchost.ModuleName, + genutiltypes.ModuleName, + evidencetypes.ModuleName, + ibctransfertypes.ModuleName, + documentmoduletypes.ModuleName, + idmoduletypes.ModuleName, + assetmoduletypes.ModuleName, + bookingmoduletypes.ModuleName, + // this line is used by starport scaffolding # stargate/app/initGenesis + + ) + + app.mm.RegisterInvariants(&app.CrisisKeeper) + app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) + app.mm.RegisterServices(module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter())) + + // initialize stores + app.MountKVStores(keys) + app.MountTransientStores(tkeys) + app.MountMemoryStores(memKeys) + + // initialize BaseApp + app.SetInitChainer(app.InitChainer) + app.SetBeginBlocker(app.BeginBlocker) + var roleKeeper ante.RoleKeeper + roleKeeper = app.ElectoralKeeper + + var isSkipCheckVoter = cast.ToBool(appOpts.Get(FlagAppOptionSkipCheckVoter)) + if isSkipCheckVoter { + or := ante.RoleKeeperWithoutVoter{ + RoleKeeper: roleKeeper, + } + roleKeeper = or + } + anteHandler := ante.NewHandler( + app.GentleMintKeeper, + app.AccountKeeper, + app.BankKeeper, + encodingConfig.TxConfig.SignModeHandler(), + app.FeeGrantKeeper, + authante.DefaultSigVerificationGasConsumer, + roleKeeper, + app.IdKeeper, + ) + + app.SetAnteHandler(anteHandler) + app.SetEndBlocker(app.EndBlocker) + + if loadLatest { + if err := app.LoadLatestVersion(); err != nil { + tmos.Exit(err.Error()) + } + } + + app.ScopedIBCKeeper = scopedIBCKeeper + app.ScopedTransferKeeper = scopedTransferKeeper + // this line is used by starport scaffolding # stargate/app/beforeInitReturn + + return app +} + +// Name returns the name of the App +func (app *App) Name() string { return app.BaseApp.Name() } + +// BeginBlocker application updates every begin block +func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + return app.mm.BeginBlock(ctx, req) +} + +// EndBlocker application updates every end block +func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + return app.mm.EndBlock(ctx, req) +} + +// InitChainer application update at chain initialization +func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + var genesisState GenesisState + if err := tmjson.Unmarshal(req.AppStateBytes, &genesisState); err != nil { + panic(err) + } + app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()) + return app.mm.InitGenesis(ctx, app.appCodec, genesisState) +} + +// LoadHeight loads a particular height +func (app *App) LoadHeight(height int64) error { + return app.LoadVersion(height) +} + +// ModuleAccountAddrs returns all the app's module account addresses. +func (app *App) ModuleAccountAddrs() map[string]bool { + modAccAddrs := make(map[string]bool) + for acc := range maccPerms { + modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true + } + + return modAccAddrs +} + +// LegacyAmino returns SimApp's amino codec. +// +// NOTE: This is solely to be used for testing purposes as it may be desirable +// for modules to register their own custom testing types. +func (app *App) LegacyAmino() *codec.LegacyAmino { + return app.cdc +} + +// AppCodec returns Gaia's app codec. +// +// NOTE: This is solely to be used for testing purposes as it may be desirable +// for modules to register their own custom testing types. +func (app *App) AppCodec() codec.Codec { + return app.appCodec +} + +// InterfaceRegistry returns Gaia's InterfaceRegistry +func (app *App) InterfaceRegistry() types.InterfaceRegistry { + return app.interfaceRegistry +} + +// GetKey returns the KVStoreKey for the provided store key. +// +// NOTE: This is solely to be used for testing purposes. +func (app *App) GetKey(storeKey string) *sdk.KVStoreKey { + return app.keys[storeKey] +} + +// GetTKey returns the TransientStoreKey for the provided store key. +// +// NOTE: This is solely to be used for testing purposes. +func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey { + return app.tkeys[storeKey] +} + +// GetMemKey returns the MemStoreKey for the provided mem key. +// +// NOTE: This is solely used for testing purposes. +func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey { + return app.memKeys[storeKey] +} + +// GetSubspace returns a param subspace for a given module name. +// +// NOTE: This is solely to be used for testing purposes. +func (app *App) GetSubspace(moduleName string) paramstypes.Subspace { + subspace, _ := app.ParamsKeeper.GetSubspace(moduleName) + return subspace +} + +// RegisterAPIRoutes registers all application module routes with the provided +// API server. +func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { + clientCtx := apiSvr.ClientCtx + rpc.RegisterRoutes(clientCtx, apiSvr.Router) + // Register legacy tx routes. + authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) + // Register new tx routes from grpc-gateway. + authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register new tendermint queries routes from grpc-gateway. + tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + + // Register legacy and grpc-gateway routes for all modules. + ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) + ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + + // register app's OpenAPI routes. + apiSvr.Router.Handle("/static/openapi.yml", http.FileServer(http.FS(docs.Docs))) + apiSvr.Router.HandleFunc("/", openapiconsole.Handler(Name, "/static/openapi.yml")) +} + +// RegisterTxService implements the Application.RegisterTxService method. +func (app *App) RegisterTxService(clientCtx client.Context) { + authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) +} + +// RegisterTendermintService implements the Application.RegisterTendermintService method. +func (app *App) RegisterTendermintService(clientCtx client.Context) { + tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) +} + +// GetMaccPerms returns a copy of the module account permissions +func GetMaccPerms() map[string][]string { + dupMaccPerms := make(map[string][]string) + for k, v := range maccPerms { + dupMaccPerms[k] = v + } + return dupMaccPerms +} + +// initParamsKeeper init params keeper and its subspaces +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { + paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) + + paramsKeeper.Subspace(authtypes.ModuleName) + paramsKeeper.Subspace(banktypes.ModuleName) + paramsKeeper.Subspace(stakingtypes.ModuleName) + paramsKeeper.Subspace(minttypes.ModuleName) + paramsKeeper.Subspace(distrtypes.ModuleName) + paramsKeeper.Subspace(slashingtypes.ModuleName) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) + paramsKeeper.Subspace(crisistypes.ModuleName) + paramsKeeper.Subspace(ibctransfertypes.ModuleName) + paramsKeeper.Subspace(ibchost.ModuleName) + paramsKeeper.Subspace(documentmoduletypes.ModuleName) + paramsKeeper.Subspace(idmoduletypes.ModuleName) + paramsKeeper.Subspace(assetmoduletypes.ModuleName) + paramsKeeper.Subspace(bookingmoduletypes.ModuleName) + paramsKeeper.Subspace(gentlemintmoduletypes.ModuleName) + // this line is used by starport scaffolding # stargate/app/paramSubspace + + return paramsKeeper +} diff --git a/app/export.go b/app/export.go new file mode 100644 index 00000000..a744e549 --- /dev/null +++ b/app/export.go @@ -0,0 +1,185 @@ +package app + +import ( + "encoding/json" + "log" + + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + servertypes "github.com/cosmos/cosmos-sdk/server/types" + sdk "github.com/cosmos/cosmos-sdk/types" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + "github.com/cosmos/cosmos-sdk/x/staking" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// ExportAppStateAndValidators exports the state of the application for a genesis +// file. +func (app *App) ExportAppStateAndValidators( + forZeroHeight bool, jailAllowedAddrs []string, +) (servertypes.ExportedApp, error) { + + // as if they could withdraw from the start of the next block + ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) + + // We export at last height + 1, because that's the height at which + // Tendermint will start InitChain. + height := app.LastBlockHeight() + 1 + if forZeroHeight { + height = 0 + app.prepForZeroHeightGenesis(ctx, jailAllowedAddrs) + } + + genState := app.mm.ExportGenesis(ctx, app.appCodec) + appState, err := json.MarshalIndent(genState, "", " ") + if err != nil { + return servertypes.ExportedApp{}, err + } + + validators, err := staking.WriteValidators(ctx, app.StakingKeeper) + if err != nil { + return servertypes.ExportedApp{}, err + } + return servertypes.ExportedApp{ + AppState: appState, + Validators: validators, + Height: height, + ConsensusParams: app.BaseApp.GetConsensusParams(ctx), + }, nil +} + +// prepare for fresh start at zero height +// NOTE zero height genesis is a temporary feature which will be deprecated +// in favour of export at a block height +func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []string) { + applyAllowedAddrs := false + + // check if there is a allowed address list + if len(jailAllowedAddrs) > 0 { + applyAllowedAddrs = true + } + + allowedAddrsMap := make(map[string]bool) + + for _, addr := range jailAllowedAddrs { + _, err := sdk.ValAddressFromBech32(addr) + if err != nil { + log.Fatal(err) + } + allowedAddrsMap[addr] = true + } + + /* Just to be safe, assert the invariants on current state. */ + app.CrisisKeeper.AssertInvariants(ctx) + + /* Handle fee distribution state. */ + + // withdraw all validator commission + app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + _, err := app.DistrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator()) + if err != nil { + panic(err) + } + return false + }) + + // withdraw all delegator rewards + dels := app.StakingKeeper.GetAllDelegations(ctx) + for _, delegation := range dels { + _, err := app.DistrKeeper.WithdrawDelegationRewards(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr()) + if err != nil { + panic(err) + } + } + + // clear validator slash events + app.DistrKeeper.DeleteAllValidatorSlashEvents(ctx) + + // clear validator historical rewards + app.DistrKeeper.DeleteAllValidatorHistoricalRewards(ctx) + + // set context height to zero + height := ctx.BlockHeight() + ctx = ctx.WithBlockHeight(0) + + // reinitialize all validators + app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + // donate any unwithdrawn outstanding reward fraction tokens to the community pool + scraps := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator()) + feePool := app.DistrKeeper.GetFeePool(ctx) + feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) + app.DistrKeeper.SetFeePool(ctx, feePool) + + app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + return false + }) + + // reinitialize all delegations + for _, del := range dels { + app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + } + + // reset context height + ctx = ctx.WithBlockHeight(height) + + /* Handle staking state. */ + + // iterate through redelegations, reset creation height + app.StakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) (stop bool) { + for i := range red.Entries { + red.Entries[i].CreationHeight = 0 + } + app.StakingKeeper.SetRedelegation(ctx, red) + return false + }) + + // iterate through unbonding delegations, reset creation height + app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { + for i := range ubd.Entries { + ubd.Entries[i].CreationHeight = 0 + } + app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) + return false + }) + + // Iterate through validators by power descending, reset bond heights, and + // update bond intra-tx counters. + store := ctx.KVStore(app.keys[stakingtypes.StoreKey]) + iter := sdk.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey) + counter := int16(0) + + for ; iter.Valid(); iter.Next() { + addr := sdk.ValAddress(iter.Key()[1:]) + validator, found := app.StakingKeeper.GetValidator(ctx, addr) + if !found { + panic("expected validator, not found") + } + + validator.UnbondingHeight = 0 + if applyAllowedAddrs && !allowedAddrsMap[addr.String()] { + validator.Jailed = true + } + + app.StakingKeeper.SetValidator(ctx, validator) + counter++ + } + + iter.Close() + + if _, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx); err != nil { + panic(err) + } + + /* Handle slashing state. */ + + // reset start height on signing infos + app.SlashingKeeper.IterateValidatorSigningInfos( + ctx, + func(addr sdk.ConsAddress, info slashingtypes.ValidatorSigningInfo) (stop bool) { + info.StartHeight = 0 + app.SlashingKeeper.SetValidatorSigningInfo(ctx, addr, info) + return false + }, + ) +} diff --git a/app/genesis.go b/app/genesis.go new file mode 100644 index 00000000..5bf0c1da --- /dev/null +++ b/app/genesis.go @@ -0,0 +1,21 @@ +package app + +import ( + "encoding/json" + + "github.com/cosmos/cosmos-sdk/codec" +) + +// The genesis state of the blockchain is represented here as a map of raw json +// messages key'd by a identifier string. +// The identifier is used to determine which module genesis information belongs +// to so it may be appropriately routed during init chain. +// Within this application default genesis information is retrieved from +// the ModuleBasicManager which populates json from each BasicModule +// object provided to it during init. +type GenesisState map[string]json.RawMessage + +// NewDefaultGenesisState generates the default state for the application. +func NewDefaultGenesisState(cdc codec.JSONCodec) GenesisState { + return ModuleBasics.DefaultGenesis(cdc) +} diff --git a/cmd/Shareledgerd/cli/fee.go b/cmd/Shareledgerd/cli/fee.go new file mode 100644 index 00000000..c00d7abf --- /dev/null +++ b/cmd/Shareledgerd/cli/fee.go @@ -0,0 +1,44 @@ +package cli + +import ( + "context" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/tx" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/fee" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var autoLoadFee tx.PreRunBroadcastTx = func(clientCtx client.Context, txf tx.Factory, msgs ...sdk.Msg) (nClientCtx client.Context, nTxf tx.Factory, nMsgs []sdk.Msg, err error) { + // Not autoload fee if there is a flag fee on cli + if !txf.Fees().IsZero() { + return clientCtx, txf, msgs, nil + } + + nClientCtx = clientCtx + nTxf = txf + nMsgs = msgs[:] + + queryClient := types.NewQueryClient(clientCtx) + + actions := make([]string, 0, len(msgs)) + for _, m := range msgs { + actions = append(actions, fee.GetActionKey(m)) + } + + msg := &types.QueryCheckFeesRequest{ + Address: clientCtx.GetFromAddress().String(), + Actions: actions, + } + + res, err := queryClient.CheckFees(context.Background(), msg) + + if err != nil { + return + } + if !res.SufficientFee && res.SufficientFundForFee { + nMsgs = append([]sdk.Msg{types.NewMsgLoadFee(clientCtx.GetFromAddress().String(), *res.CostLoadingFee)}, nMsgs...) + } + nTxf = nTxf.WithFees(res.ConvertedFee.String()) + return +} diff --git a/cmd/Shareledgerd/cli/fee_convert.go b/cmd/Shareledgerd/cli/fee_convert.go new file mode 100644 index 00000000..efa1fa55 --- /dev/null +++ b/cmd/Shareledgerd/cli/fee_convert.go @@ -0,0 +1,27 @@ +package cli + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/tx" + sdk "github.com/cosmos/cosmos-sdk/types" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +var autoConvertFee tx.PreRunBroadcastTx = func(clientCtx client.Context, txf tx.Factory, msgs ...sdk.Msg) (nClientCtx client.Context, nTxf tx.Factory, nMsgs []sdk.Msg, err error) { + // Not autoload fee if there is a flag fee on cli + if txf.Fees().IsZero() { + return clientCtx, txf, msgs, nil + } + + nClientCtx = clientCtx + nTxf = txf + nMsgs = msgs[:] + + baseCoins, err := denom.NormalizeToBaseCoins(sdk.NewDecCoinsFromCoins(txf.Fees()...), true) + if err != nil { + return + } + + nTxf = nTxf.WithFees(baseCoins.String()) + return +} diff --git a/cmd/Shareledgerd/cli/middleware.go b/cmd/Shareledgerd/cli/middleware.go new file mode 100644 index 00000000..005df0a7 --- /dev/null +++ b/cmd/Shareledgerd/cli/middleware.go @@ -0,0 +1,8 @@ +package cli + +import "github.com/cosmos/cosmos-sdk/client/tx" + +func InitMiddleWare() { + tx.AddPreRunBroadcastTx(autoLoadFee) + tx.AddPreRunBroadcastTx(autoConvertFee) +} diff --git a/cmd/Shareledgerd/main.go b/cmd/Shareledgerd/main.go new file mode 100644 index 00000000..687abe05 --- /dev/null +++ b/cmd/Shareledgerd/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "github.com/sharering/shareledger/cmd/Shareledgerd/cli" + "os" + "sync" + + "github.com/sharering/shareledger/cmd/Shareledgerd/sub" + "github.com/sharering/shareledger/cmd/Shareledgerd/tools" + + svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + "github.com/sharering/shareledger/app" + "github.com/spf13/cobra" + "github.com/tendermint/spm/cosmoscmd" +) + +var runOnce sync.Once + +func init() { + runOnce.Do(func() { + cli.InitMiddleWare() + }) +} + +func main() { + rootCmd, _ := cosmoscmd.NewRootCmd( + app.Name, + app.AccountAddressPrefix, + app.DefaultNodeHome, + app.Name, + app.ModuleBasics, + app.New, + cosmoscmd.AddSubCmd( + sub.NewImportKeyCmd(), + getGenesisCmd(app.DefaultNodeHome), + ), + ) + + if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { + os.Exit(1) + } +} + +func getGenesisCmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "genesis", + Short: "genesis file subcommands", + } + cmd.AddCommand( + tools.NewGenesisAddAuthorityAccountCmd(defaultNodeHome), + tools.NewGenesisAddTreasureAccountCmd(defaultNodeHome), + tools.NewGenesisAddValidatorAccountCmd(defaultNodeHome), + tools.NewGenesisAddAccountOperatorCmd(defaultNodeHome), + ) + return cmd +} diff --git a/cmd/Shareledgerd/sub/import_key.go b/cmd/Shareledgerd/sub/import_key.go new file mode 100644 index 00000000..e344e8ad --- /dev/null +++ b/cmd/Shareledgerd/sub/import_key.go @@ -0,0 +1,61 @@ +package sub + +import ( + "bufio" + "os" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdk "github.com/cosmos/cosmos-sdk/types" + myutils "github.com/sharering/shareledger/x/utils" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +const ( + nodeDirPerm = 0755 + flagKeyName = "key-name" +) + +func NewImportKeyCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "import-key", + Short: "import validator key", + Long: "import validator key from mnemonic into keyring", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + seedPath := viper.GetString(myutils.FlagKeySeed) + keySeed, err := myutils.GetKeySeedFromFile(seedPath) + if err != nil { + return err + } + + keyName := viper.GetString(flagKeyName) + cliHome := viper.GetString(flags.FlagHome) + if err := os.MkdirAll(cliHome, nodeDirPerm); err != nil { + return err + } + + buf := bufio.NewReader(clientCtx.Input) + kb, _ := keyring.New(sdk.KeyringServiceName(), viper.GetString(flags.FlagKeyringBackend), cliHome, buf) + + _, err = kb.NewAccount(keyName, keySeed, "", sdk.GetConfig().GetFullBIP44Path(), hd.Secp256k1) + if err != nil { + return err + } + + return nil + }, + } + cmd.Flags().String(flags.FlagKeyringBackend, "os", "keyring backend: os/pass/file") + cmd.Flags().String(flagKeyName, "", "key name of validator key to be store in keybase") + cmd.Flags().String(myutils.FlagKeySeed, "", myutils.KeySeedUsage) + + return cmd +} diff --git a/cmd/Shareledgerd/tools/genaccountoperator.go b/cmd/Shareledgerd/tools/genaccountoperator.go new file mode 100644 index 00000000..add312c8 --- /dev/null +++ b/cmd/Shareledgerd/tools/genaccountoperator.go @@ -0,0 +1,50 @@ +package tools + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/types/errors" + electoralmoduletypes "github.com/sharering/shareledger/x/electoral/types" + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/spf13/cobra" + "github.com/tendermint/tendermint/libs/cli" +) + +func NewGenesisAddAccountOperatorCmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "add-account-operator [address_or_key_name]", + Short: "Add a account operator to genesis.json", + Long: "Add a account operator to genesis.json", + RunE: func(cmd *cobra.Command, args []string) error { + serverCtx := server.NewDefaultContext() + + config := serverCtx.Config + homeDir, _ := cmd.Flags().GetString(cli.HomeFlag) + config = config.SetRoot(homeDir) + + clientCtx, err := client.GetClientQueryContext(cmd) + addr, err := getAddr(cmd, clientCtx.HomeDir, args) + if err != nil { + return err + } + var electoralGenesis electoralmoduletypes.GenesisState + if err := unmarshalGenesisState(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "unmarshal genesis state electoral module types") + } + electoralGenesis.AccStateList = append(electoralGenesis.AccStateList, electoralmoduletypes.AccState{ + Key: string(electoralmoduletypes.GenAccStateIndexKey(addr, electoralmoduletypes.AccStateKeyAccOp)), + Address: addr.String(), + Status: string(types.StatusActive), + }) + + if err := exportGenesisFile(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "export genesis file ") + } + return nil + }, + } + cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") + cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") + return cmd +} diff --git a/cmd/Shareledgerd/tools/genauthority.go b/cmd/Shareledgerd/tools/genauthority.go new file mode 100644 index 00000000..8006f760 --- /dev/null +++ b/cmd/Shareledgerd/tools/genauthority.go @@ -0,0 +1,46 @@ +package tools + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/types/errors" + electoralmoduletypes "github.com/sharering/shareledger/x/electoral/types" + "github.com/spf13/cobra" + "github.com/tendermint/tendermint/libs/cli" +) + +func NewGenesisAddAuthorityAccountCmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "add-authority [address_or_key_name]", + Short: "Add a authority account to genesis.json", + Long: "Add a authority account to genesis.json", + RunE: func(cmd *cobra.Command, args []string) error { + serverCtx := server.NewDefaultContext() + + config := serverCtx.Config + homeDir, _ := cmd.Flags().GetString(cli.HomeFlag) + config = config.SetRoot(homeDir) + + clientCtx, err := client.GetClientQueryContext(cmd) + addr, err := getAddr(cmd, clientCtx.HomeDir, args) + if err != nil { + return err + } + var electoralGenesis electoralmoduletypes.GenesisState + if err := unmarshalGenesisState(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "unmarshal genesis state electoral module types") + } + electoralGenesis.Authority = &electoralmoduletypes.Authority{ + Address: addr.String(), + } + if err := exportGenesisFile(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "export genesis file ") + } + return nil + }, + } + cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") + cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") + return cmd +} diff --git a/cmd/Shareledgerd/tools/genesis.go b/cmd/Shareledgerd/tools/genesis.go new file mode 100644 index 00000000..a247041b --- /dev/null +++ b/cmd/Shareledgerd/tools/genesis.go @@ -0,0 +1,92 @@ +package tools + +import ( + "bufio" + "encoding/json" + "fmt" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/gogo/protobuf/proto" + "github.com/spf13/cobra" +) + +func unmarshalGenesisState(cmd *cobra.Command, homeDir string, moduleName string, ptr proto.Message) error { + serverCtx := server.NewDefaultContext() + config := serverCtx.Config + config = config.SetRoot(homeDir) + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + depCdc := clientCtx.Codec + cdc := depCdc.(codec.Codec) + + genFile := config.GenesisFile() + appState, _, err := genutiltypes.GenesisStateFromGenFile(genFile) + if err != nil { + return err + } + return cdc.UnmarshalJSON(appState[moduleName], ptr) +} + +func exportGenesisFile(cmd *cobra.Command, homeDir string, moduleName string, ptr proto.Message) error { + serverCtx := server.NewDefaultContext() + config := serverCtx.Config + config = config.SetRoot(homeDir) + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + depCdc := clientCtx.Codec + cdc := depCdc.(codec.Codec) + + genFile := config.GenesisFile() + appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) + if err != nil { + return err + } + jsonData, err := cdc.MarshalJSON(ptr) + if err != nil { + return err + } + appState[moduleName] = jsonData + appStateJSON, err := json.Marshal(appState) + if err != nil { + return err + } + genDoc.AppState = appStateJSON + + return genutil.ExportGenesisFile(genDoc, genFile) +} + +func getAddr(cmd *cobra.Command, homeDir string, args []string) (sdk.AccAddress, error) { + addr, err := sdk.AccAddressFromBech32(args[0]) + + // try to convert from key if param is not address + if err != nil { + inBuf := bufio.NewReader(cmd.InOrStdin()) + keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) + + // attempt to lookup address from Keybase if no address was provided + kb, err := keyring.New(sdk.KeyringServiceName(), keyringBackend, homeDir, inBuf) + if err != nil { + return nil, err + } + + info, err := kb.Key(args[0]) + if err != nil { + return nil, fmt.Errorf("failed to get address from Keybase: %w", err) + } + + addr = info.GetAddress() + } + return addr, nil +} diff --git a/cmd/Shareledgerd/tools/gentreasure.go b/cmd/Shareledgerd/tools/gentreasure.go new file mode 100644 index 00000000..e22cffab --- /dev/null +++ b/cmd/Shareledgerd/tools/gentreasure.go @@ -0,0 +1,46 @@ +package tools + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/types/errors" + electoralmoduletypes "github.com/sharering/shareledger/x/electoral/types" + "github.com/spf13/cobra" + "github.com/tendermint/tendermint/libs/cli" +) + +func NewGenesisAddTreasureAccountCmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "add-treasurer [address_or_key_name]", + Short: "Add a treasure account to genesis.json", + Long: "Add a treasure account to genesis.json", + RunE: func(cmd *cobra.Command, args []string) error { + serverCtx := server.NewDefaultContext() + + config := serverCtx.Config + homeDir, _ := cmd.Flags().GetString(cli.HomeFlag) + config = config.SetRoot(homeDir) + + clientCtx, err := client.GetClientQueryContext(cmd) + addr, err := getAddr(cmd, clientCtx.HomeDir, args) + if err != nil { + return err + } + var electoralGenesis electoralmoduletypes.GenesisState + if err := unmarshalGenesisState(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "unmarshal genesis state electoral module types") + } + electoralGenesis.Treasurer = &electoralmoduletypes.Treasurer{ + Address: addr.String(), + } + if err := exportGenesisFile(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "export genesis file ") + } + return nil + }, + } + cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") + cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") + return cmd +} diff --git a/cmd/Shareledgerd/tools/genvalidator.go b/cmd/Shareledgerd/tools/genvalidator.go new file mode 100644 index 00000000..b55a1e76 --- /dev/null +++ b/cmd/Shareledgerd/tools/genvalidator.go @@ -0,0 +1,50 @@ +package tools + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/types/errors" + electoralmoduletypes "github.com/sharering/shareledger/x/electoral/types" + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/spf13/cobra" + "github.com/tendermint/tendermint/libs/cli" +) + +func NewGenesisAddValidatorAccountCmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "add-validator [address_or_key_name]", + Short: "Add a validator account to genesis.json", + Long: "Add a validator account to genesis.json", + RunE: func(cmd *cobra.Command, args []string) error { + serverCtx := server.NewDefaultContext() + + config := serverCtx.Config + homeDir, _ := cmd.Flags().GetString(cli.HomeFlag) + config = config.SetRoot(homeDir) + + clientCtx, err := client.GetClientQueryContext(cmd) + addr, err := getAddr(cmd, clientCtx.HomeDir, args) + if err != nil { + return err + } + var electoralGenesis electoralmoduletypes.GenesisState + if err := unmarshalGenesisState(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "unmarshal genesis state electoral module types") + } + electoralGenesis.AccStateList = append(electoralGenesis.AccStateList, electoralmoduletypes.AccState{ + Key: string(electoralmoduletypes.GenAccStateIndexKey(addr, electoralmoduletypes.AccStateKeyVoter)), + Address: addr.String(), + Status: string(types.StatusActive), + }) + + if err := exportGenesisFile(cmd, homeDir, electoralmoduletypes.ModuleName, &electoralGenesis); err != nil { + return errors.Wrap(err, "export genesis file ") + } + return nil + }, + } + cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") + cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") + return cmd +} diff --git a/cmd/debug/main.go b/cmd/debug/main.go deleted file mode 100644 index 764bc2e8..00000000 --- a/cmd/debug/main.go +++ /dev/null @@ -1,256 +0,0 @@ -package main - -import ( - "bytes" - "encoding/base64" - "encoding/hex" - "encoding/json" - "fmt" - "os" - "strconv" - "strings" - - "github.com/spf13/cobra" - - shareledger "github.com/sharering/shareledger" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - apptypes "github.com/sharering/shareledger/types" -) - -func init() { - apptypes.ConfigureSDK() - // config := sdk.GetConfig() - // config.SetBech32PrefixForAccount(sdk.Bech32PrefixAccAddr, sdk.Bech32PrefixAccPub) - // config.SetBech32PrefixForValidator(sdk.Bech32PrefixValAddr, sdk.Bech32PrefixValPub) - // config.SetBech32PrefixForConsensusNode(sdk.Bech32PrefixConsAddr, sdk.Bech32PrefixConsPub) - // config.Seal() - - rootCmd.AddCommand(txCmd) - // rootCmd.AddCommand(pubkeyCmd) - rootCmd.AddCommand(addrCmd) - // rootCmd.AddCommand(hackCmd) - rootCmd.AddCommand(rawBytesCmd) -} - -var rootCmd = &cobra.Command{ - Use: "shareledgerdebug", - Short: "shareledger debug tool", - SilenceUsage: true, -} - -var txCmd = &cobra.Command{ - Use: "tx", - Short: "Decode a shareledger tx from hex or base64", - RunE: runTxCmd, -} - -// var pubkeyCmd = &cobra.Command{ -// Use: "pubkey", -// Short: "Decode a pubkey from hex, base64, or bech32", -// RunE: runPubKeyCmd, -// } - -var addrCmd = &cobra.Command{ - Use: "addr", - Short: "Convert an address between hex and bech32", - RunE: runAddrCmd, -} - -// var hackCmd = &cobra.Command{ -// Use: "hack", -// Short: "Boilerplate to Hack on an existing state by scripting some Go...", -// RunE: runHackCmd, -// } - -var rawBytesCmd = &cobra.Command{ - Use: "raw-bytes", - Short: "Convert raw bytes output (eg. [10 21 13 255]) to hex", - RunE: runRawBytesCmd, -} - -func runRawBytesCmd(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return fmt.Errorf("Expected single arg") - } - stringBytes := args[0] - stringBytes = strings.Trim(stringBytes, "[") - stringBytes = strings.Trim(stringBytes, "]") - spl := strings.Split(stringBytes, " ") - - byteArray := []byte{} - for _, s := range spl { - b, err := strconv.Atoi(s) - if err != nil { - return err - } - byteArray = append(byteArray, byte(b)) - } - fmt.Printf("%X\n", byteArray) - return nil -} - -// func runPubKeyCmd(cmd *cobra.Command, args []string) error { -// if len(args) != 1 { -// return fmt.Errorf("Expected single arg") -// } - -// pubkeyString := args[0] -// var pubKeyI crypto.PubKey - -// // try hex, then base64, then bech32 -// pubkeyBytes, err := hex.DecodeString(pubkeyString) -// if err != nil { -// var err2 error -// pubkeyBytes, err2 = base64.StdEncoding.DecodeString(pubkeyString) -// if err2 != nil { -// var err3 error -// pubKeyI, err3 = sdk.GetAccPubKeyBech32(pubkeyString) -// if err3 != nil { -// var err4 error -// pubKeyI, err4 = sdk.GetValPubKeyBech32(pubkeyString) - -// if err4 != nil { -// var err5 error -// pubKeyI, err5 = sdk.GetConsPubKeyBech32(pubkeyString) -// if err5 != nil { -// return fmt.Errorf(`Expected hex, base64, or bech32. Got errors: -// hex: %v, -// base64: %v -// bech32 Acc: %v -// bech32 Val: %v -// bech32 Cons: %v`, -// err, err2, err3, err4, err5) -// } - -// } -// } - -// } -// } - -// var pubKey ed25519.PubKeyEd25519 -// if pubKeyI == nil { -// copy(pubKey[:], pubkeyBytes) -// } else { -// pubKey = pubKeyI.(ed25519.PubKeyEd25519) -// pubkeyBytes = pubKey[:] -// } - -// cdc := shareledger.MakeCodec() -// pubKeyJSONBytes, err := cdc.MarshalJSON(pubKey) -// if err != nil { -// return err -// } -// accPub, err := sdk.Bech32ifyAccPub(pubKey) -// if err != nil { -// return err -// } -// valPub, err := sdk.Bech32ifyValPub(pubKey) -// if err != nil { -// return err -// } - -// consenusPub, err := sdk.Bech32ifyConsPub(pubKey) -// if err != nil { -// return err -// } -// fmt.Println("Address:", pubKey.Address()) -// fmt.Printf("Hex: %X\n", pubkeyBytes) -// fmt.Println("JSON (base64):", string(pubKeyJSONBytes)) -// fmt.Println("Bech32 Acc:", accPub) -// fmt.Println("Bech32 Validator Operator:", valPub) -// fmt.Println("Bech32 Validator Consensus:", consenusPub) -// return nil -// } - -func runAddrCmd(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return fmt.Errorf("Expected single arg") - } - - addrString := args[0] - var addr []byte - - // try hex, then bech32 - var err error - addr, err = hex.DecodeString(addrString) - if err != nil { - var err2 error - addr, err2 = sdk.AccAddressFromBech32(addrString) - if err2 != nil { - var err3 error - addr, err3 = sdk.ValAddressFromBech32(addrString) - - if err3 != nil { - return fmt.Errorf(`Expected hex or bech32. Got errors: - hex: %v, - bech32 acc: %v - bech32 val: %v - `, err, err2, err3) - - } - } - } - - accAddr := sdk.AccAddress(addr) - valAddr := sdk.ValAddress(addr) - - fmt.Println("Address:", addr) - fmt.Printf("Address (hex): %X\n", addr) - fmt.Printf("Bech32 Acc: %s\n", accAddr) - fmt.Printf("Bech32 Val: %s\n", valAddr) - return nil -} - -func runTxCmd(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return fmt.Errorf("Expected single arg") - } - - txString := args[0] - - // try hex, then base64 - txBytes, err := hex.DecodeString(txString) - if err != nil { - var err2 error - txBytes, err2 = base64.StdEncoding.DecodeString(txString) - if err2 != nil { - return fmt.Errorf(`Expected hex or base64. Got errors: - hex: %v, - base64: %v - `, err, err2) - } - } - - var tx = auth.StdTx{} - cdc := shareledger.MakeCodec() - - err = cdc.UnmarshalBinaryLengthPrefixed(txBytes, &tx) - if err != nil { - return err - } - - bz, err := cdc.MarshalJSON(tx) - if err != nil { - return err - } - - buf := bytes.NewBuffer([]byte{}) - err = json.Indent(buf, bz, "", " ") - if err != nil { - return err - } - - fmt.Println(buf.String()) - return nil -} - -func main() { - err := rootCmd.Execute() - if err != nil { - os.Exit(1) - } - os.Exit(0) -} diff --git a/cmd/shareledger/add-special-accounts.go b/cmd/shareledger/add-special-accounts.go deleted file mode 100644 index b0160dce..00000000 --- a/cmd/shareledger/add-special-accounts.go +++ /dev/null @@ -1,274 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - - "github.com/tendermint/tendermint/libs/cli" - - "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - electoral "github.com/sharering/shareledger/x/electoral" - gentlemint "github.com/sharering/shareledger/x/gentlemint" -) - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisAuthorityAccountCmd( - ctx *server.Context, cdc *codec.Codec, defaultNodeHome, defaultClientHome string, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "add-genesis-authority [address_or_key_name]", - Short: "Add a authority account to genesis.json", - Long: `Add a authority account to genesis.json`, - Args: cobra.ExactArgs(1), - RunE: func(_ *cobra.Command, args []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - // attempt to lookup address from Keybase if no address was provided - kb, err := keys.NewKeyBaseFromDir(viper.GetString(flagClientHome)) - if err != nil { - return err - } - - info, err := kb.Get(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keybase: %w", err) - } - - addr = info.GetAddress() - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutil.GenesisStateFromGenFile(cdc, genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - gentlemintGenState := gentlemint.GetGenesisStateFromAppState(cdc, appState) - - // Add authority account to state - gentlemintGenState.Authority = addr.String() - gentlemintGenStateBz, err := cdc.MarshalJSON(gentlemintGenState) - - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[gentlemint.ModuleName] = gentlemintGenStateBz - - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") - cmd.Flags().String(flagClientHome, defaultClientHome, "client's home directory") - - return cmd -} - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisValidatorAccountCmd( - ctx *server.Context, cdc *codec.Codec, defaultNodeHome, defaultClientHome string, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "add-genesis-validator [address_or_key_name]", - Short: "Add a validator account to genesis.json", - Long: `Add a validator account to genesis.json`, - Args: cobra.ExactArgs(1), - RunE: func(_ *cobra.Command, args []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - // attempt to lookup address from Keybase if no address was provided - kb, err := keys.NewKeyBaseFromDir(viper.GetString(flagClientHome)) - if err != nil { - return err - } - - info, err := kb.Get(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keybase: %w", err) - } - - addr = info.GetAddress() - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutil.GenesisStateFromGenFile(cdc, genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - electoralGenState := electoral.GetGenesisStateFromAppState(cdc, appState) - - // Add validator address to state - electoralGenState.Addresses = append(electoralGenState.Addresses, addr) - - electoralGenStateBz, err := cdc.MarshalJSON(electoralGenState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[electoral.ModuleName] = electoralGenStateBz - - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") - cmd.Flags().String(flagClientHome, defaultClientHome, "client's home directory") - - return cmd -} - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisTreasurerAccountCmd( - ctx *server.Context, cdc *codec.Codec, defaultNodeHome, defaultClientHome string, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "add-genesis-treasurer [address_or_key_name]", - Short: "Add a treasurer account to genesis.json", - Long: `Add a treasurer account to genesis.json`, - Args: cobra.ExactArgs(1), - RunE: func(_ *cobra.Command, args []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - // attempt to lookup address from Keybase if no address was provided - kb, err := keys.NewKeyBaseFromDir(viper.GetString(flagClientHome)) - if err != nil { - return err - } - - info, err := kb.Get(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keybase: %w", err) - } - - addr = info.GetAddress() - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutil.GenesisStateFromGenFile(cdc, genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - gentlemintGenState := gentlemint.GetGenesisStateFromAppState(cdc, appState) - - // Add Treasurer account to state - gentlemintGenState.Treasurer = addr.String() - gentlemintGenStateBz, err := cdc.MarshalJSON(gentlemintGenState) - - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[gentlemint.ModuleName] = gentlemintGenStateBz - - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") - cmd.Flags().String(flagClientHome, defaultClientHome, "client's home directory") - - return cmd -} - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisOperatorAccountCmd( - ctx *server.Context, cdc *codec.Codec, defaultNodeHome, defaultClientHome string, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "add-genesis-account-operator [address_or_key_name]", - Short: "Add a operator account to genesis.json", - Long: `Add a operator account to genesis.json`, - Args: cobra.ExactArgs(1), - RunE: func(_ *cobra.Command, args []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - // attempt to lookup address from Keybase if no address was provided - kb, err := keys.NewKeyBaseFromDir(viper.GetString(flagClientHome)) - if err != nil { - return err - } - - info, err := kb.Get(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keybase: %w", err) - } - - addr = info.GetAddress() - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutil.GenesisStateFromGenFile(cdc, genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - gentlemintGenState := gentlemint.GetGenesisStateFromAppState(cdc, appState) - - // Add oprator account to state - gentlemintGenState.AccountOperators = append(gentlemintGenState.AccountOperators, gentlemint.AccState{Address: addr, Status: gentlemint.ActiveStatus}) - gentlemintGenStateBz, err := cdc.MarshalJSON(gentlemintGenState) - - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[gentlemint.ModuleName] = gentlemintGenStateBz - - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") - cmd.Flags().String(flagClientHome, defaultClientHome, "client's home directory") - - return cmd -} diff --git a/cmd/shareledger/genaccounts.go b/cmd/shareledger/genaccounts.go deleted file mode 100644 index d78edb43..00000000 --- a/cmd/shareledger/genaccounts.go +++ /dev/null @@ -1,112 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - - "github.com/tendermint/tendermint/libs/cli" - - "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" - "github.com/cosmos/cosmos-sdk/x/genutil" -) - -const ( - flagClientHome = "home-client" -) - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisAccountCmd( - ctx *server.Context, cdc *codec.Codec, defaultNodeHome, defaultClientHome string, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", - Short: "Add a genesis account to genesis.json", - Long: `Add a genesis account to genesis.json. The provided account must specify -the account address or key name and a list of initial coins. If a key name is given, -the address will be looked up in the local Keybase. The list of initial tokens must -contain valid denominations. Accounts may optionally be supplied with vesting parameters. -`, - Args: cobra.ExactArgs(2), - RunE: func(_ *cobra.Command, args []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - // attempt to lookup address from Keybase if no address was provided - kb, err := keys.NewKeyBaseFromDir(viper.GetString(flagClientHome)) - if err != nil { - return err - } - - info, err := kb.Get(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keybase: %w", err) - } - - addr = info.GetAddress() - } - - coins, err := sdk.ParseCoins(args[1]) - if err != nil { - return fmt.Errorf("failed to parse coins: %w", err) - } - - // create concrete account type based on input parameters - var genAccount authexported.GenesisAccount - - baseAccount := auth.NewBaseAccount(addr, coins.Sort(), nil, 0, 0) - - genAccount = baseAccount - - if err := genAccount.Validate(); err != nil { - return fmt.Errorf("failed to validate new genesis account: %w", err) - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutil.GenesisStateFromGenFile(cdc, genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - authGenState := auth.GetGenesisStateFromAppState(cdc, appState) - - if authGenState.Accounts.Contains(addr) { - return fmt.Errorf("cannot add account at existing address %s", addr) - } - - // Add the new account to the set of genesis accounts and sanitize the - // accounts afterwards. - authGenState.Accounts = append(authGenState.Accounts, genAccount) - authGenState.Accounts = auth.SanitizeGenesisAccounts(authGenState.Accounts) - - authGenStateBz, err := cdc.MarshalJSON(authGenState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[auth.ModuleName] = authGenStateBz - - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") - cmd.Flags().String(flagClientHome, defaultClientHome, "client's home directory") - - return cmd -} diff --git a/cmd/shareledger/main.go b/cmd/shareledger/main.go deleted file mode 100644 index 970afa5f..00000000 --- a/cmd/shareledger/main.go +++ /dev/null @@ -1,91 +0,0 @@ -package main - -import ( - "encoding/json" - "io" - - "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/x/staking" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client/debug" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/x/auth" - genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - app "github.com/sharering/shareledger" - apptypes "github.com/sharering/shareledger/types" - "github.com/spf13/cobra" - "github.com/spf13/viper" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - tmtypes "github.com/tendermint/tendermint/types" - dbm "github.com/tendermint/tm-db" -) - -func main() { - cobra.EnableCommandSorting = false - cdc := app.MakeCodec() - - apptypes.ConfigureSDK() - - ctx := server.NewDefaultContext() - - rootCmd := &cobra.Command{ - Use: "shareledger", - Short: "shareledger App Daemon (server)", - PersistentPreRunE: server.PersistentPreRunEFn(ctx), - } - // CLI commands to initialize the chain - rootCmd.AddCommand(genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome)) - rootCmd.AddCommand(genutilcli.CollectGenTxsCmd(ctx, cdc, auth.GenesisAccountIterator{}, app.DefaultNodeHome)) - rootCmd.AddCommand(genutilcli.MigrateGenesisCmd(ctx, cdc)) - rootCmd.AddCommand( - genutilcli.GenTxCmd( - ctx, cdc, app.ModuleBasics, staking.AppModuleBasic{}, - auth.GenesisAccountIterator{}, app.DefaultNodeHome, app.DefaultCLIHome, - ), - ) - rootCmd.AddCommand(genutilcli.ValidateGenesisCmd(ctx, cdc, app.ModuleBasics)) - // AddGenesisAccountCmd allows users to add accounts to the genesis file - rootCmd.AddCommand(AddGenesisAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome)) - rootCmd.AddCommand(AddGenesisAuthorityAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome)) - rootCmd.AddCommand(AddGenesisTreasurerAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome)) - rootCmd.AddCommand(AddGenesisValidatorAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome)) - rootCmd.AddCommand(AddGenesisOperatorAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome)) - rootCmd.AddCommand(AddGenesisCustomMigrate(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome)) - - rootCmd.AddCommand(flags.NewCompletionCmd(rootCmd, true)) - rootCmd.AddCommand(debug.Cmd(cdc)) - rootCmd.AddCommand(testnetCmd(ctx, cdc, app.ModuleBasics, auth.GenesisAccountIterator{})) - server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) - - // prepare and add flags - executor := cli.PrepareBaseCmd(rootCmd, "NS", app.DefaultNodeHome) - err := executor.Execute() - if err != nil { - panic(err) - } -} - -func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer) abci.Application { - return app.NewshareledgerApp(logger, db, baseapp.SetMinGasPrices(viper.GetString(server.FlagMinGasPrices))) -} - -func exportAppStateAndTMValidators( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailWhiteList []string, -) (json.RawMessage, []tmtypes.GenesisValidator, error) { - - if height != -1 { - nsApp := app.NewshareledgerApp(logger, db) - err := nsApp.LoadHeight(height) - if err != nil { - return nil, nil, err - } - return nsApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) - } - - nsApp := app.NewshareledgerApp(logger, db) - - return nsApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) -} diff --git a/cmd/shareledger/migrate-genesis.go b/cmd/shareledger/migrate-genesis.go deleted file mode 100644 index b1969e61..00000000 --- a/cmd/shareledger/migrate-genesis.go +++ /dev/null @@ -1,316 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/ShareRing/modules/utils" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - auth "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/cosmos/cosmos-sdk/x/supply" - gentlemint "github.com/sharering/shareledger/x/gentlemint" - "github.com/sharering/shareledger/x/identity" - oldId "github.com/sharering/shareledger/x/identity" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/tendermint/tendermint/libs/cli" -) - -/** - * FromV0_0_1 copies all idsigners from identity modules to gentlemint module - */ -func FromV0_0_1(oldGenesisFile, newGenesisFile, mergeGenesisFile string, cdc *codec.Codec) error { - oldAppState, _, err := genutil.GenesisStateFromGenFile(cdc, oldGenesisFile) - if err != nil { - return fmt.Errorf("failed to unmarshal old genesis state: %w", err) - } - - newAppState, newGenDoc, err := genutil.GenesisStateFromGenFile(cdc, newGenesisFile) - if err != nil { - return fmt.Errorf("failed to unmarshal new genesis state: %w", err) - } - - var oldIdState oldId.GenesisState - if oldAppState[oldId.ModuleName] != nil { - cdc.MustUnmarshalJSON(oldAppState[oldId.ModuleName], &oldIdState) - } - - var gentlemintState gentlemint.GenesisState - if newAppState[gentlemint.ModuleName] != nil { - cdc.MustUnmarshalJSON(newAppState[gentlemint.ModuleName], &gentlemintState) - } - - // Copy id signers - for _, idSignerAddr := range oldIdState.IDSigners { - addr, err := sdk.AccAddressFromBech32(idSignerAddr[8:]) - if err != nil { - return err - } - idSigner := gentlemint.AccState{Address: addr, Status: gentlemint.ActiveStatus} - gentlemintState.IdSigners = append(gentlemintState.IdSigners, idSigner) - } - - gentlemintStateBz, err := cdc.MarshalJSON(gentlemintState) - - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - newAppState[gentlemint.ModuleName] = gentlemintStateBz - - appStateJSON, err := cdc.MarshalJSON(newAppState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - newGenDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(newGenDoc, mergeGenesisFile) - - // Copy id data: Id data is totally different, can not copy -} - -// Add 8 zero to all coin -func FromV1_1_0(inputFilePath, outputFilePath string, cdc *codec.Codec) error { - appState, genDoc, err := genutil.GenesisStateFromGenFile(cdc, inputFilePath) - if err != nil { - return fmt.Errorf("failed to unmarshal old genesis state: %w", err) - } - - // Auth module - var authState auth.GenesisState - if appState[auth.ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[auth.ModuleName], &authState) - } - for i := 0; i < len(authState.Accounts); i++ { - acc := authState.Accounts[i] - coins := acc.GetCoins() - coins = coins.Sort() - newCoins := sdk.Coins{} - - // SHR - shrAmount := coins.AmountOf("shr") - newShr := sdk.NewCoin("shr", shrAmount.Mul(utils.SHRDecimal)) - newCoins = newCoins.Add(newShr) - - // SHRP & cent - shrpAmount := coins.AmountOf("shrp") - centAmount := coins.AmountOf("cent") - - shrpFromCent := centAmount.Mul(utils.SHRPDecimal).Quo(sdk.NewInt(100)) - shrpAmount = shrpAmount.Mul(utils.SHRPDecimal) - shrpAmount = shrpAmount.Add(shrpFromCent) - - newShrp := sdk.NewCoin("shrp", shrpAmount) - newCoins = newCoins.Add(newShrp) - - acc.SetCoins(newCoins) - } - - authStateBz, err := cdc.MarshalJSON(authState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - appState[auth.ModuleName] = authStateBz - - // Staking module - var stakingState staking.GenesisState - if appState[staking.ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[staking.ModuleName], &stakingState) - } - - // The default power = token/10^6 and we apply 10^8 decimal - // so the power will be mutiplied by 10^2 = 100 - powerMultiplier := int64(100) - stakingState.LastTotalPower = stakingState.LastTotalPower.Mul(sdk.NewInt(powerMultiplier)) - for i := 0; i < len(stakingState.LastValidatorPowers); i++ { - stakingState.LastValidatorPowers[i].Power = stakingState.LastValidatorPowers[i].Power * powerMultiplier - } - - for i := 0; i < len(stakingState.Validators); i++ { - stakingState.Validators[i].DelegatorShares = stakingState.Validators[i].DelegatorShares.MulInt(utils.SHRDecimal) - stakingState.Validators[i].Tokens = stakingState.Validators[i].Tokens.Mul(utils.SHRDecimal) - stakingState.Validators[i].UnbondingHeight = 0 - } - - for i := 0; i < len(stakingState.Delegations); i++ { - stakingState.Delegations[i].Shares = stakingState.Delegations[i].Shares.MulInt(utils.SHRDecimal) - } - - for i := 0; i < len(stakingState.UnbondingDelegations); i++ { - for j := 0; j < len(stakingState.UnbondingDelegations[i].Entries); j++ { - stakingState.UnbondingDelegations[i].Entries[j].InitialBalance = stakingState.UnbondingDelegations[i].Entries[j].InitialBalance.Mul(utils.SHRDecimal) - stakingState.UnbondingDelegations[i].Entries[j].Balance = stakingState.UnbondingDelegations[i].Entries[j].Balance.Mul(utils.SHRDecimal) - stakingState.UnbondingDelegations[i].Entries[j].CreationHeight = 0 - } - } - - for i := 0; i < len(stakingState.Redelegations); i++ { - for j := 0; j < len(stakingState.Redelegations[i].Entries); j++ { - stakingState.Redelegations[i].Entries[j].InitialBalance = stakingState.Redelegations[i].Entries[j].InitialBalance.Mul(utils.SHRDecimal) - stakingState.Redelegations[i].Entries[j].SharesDst = stakingState.Redelegations[i].Entries[j].SharesDst.MulInt(utils.SHRDecimal) - stakingState.Redelegations[i].Entries[j].CreationHeight = 0 - } - } - - stakingStateBz, err := cdc.MarshalJSON(stakingState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - appState[staking.ModuleName] = stakingStateBz - - // Distribution module - var distState distribution.GenesisState - if appState[distribution.ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[distribution.ModuleName], &distState) - } - - feePool := distState.FeePool - feePool.CommunityPool = decimalize(feePool.CommunityPool) - distState.FeePool = feePool - - for i := 0; i < len(distState.OutstandingRewards); i++ { - distState.OutstandingRewards[i].OutstandingRewards = decimalize(distState.OutstandingRewards[i].OutstandingRewards) - } - - for i := 0; i < len(distState.ValidatorAccumulatedCommissions); i++ { - distState.ValidatorAccumulatedCommissions[i].Accumulated = decimalize(distState.ValidatorAccumulatedCommissions[i].Accumulated) - } - - for i := 0; i < len(distState.ValidatorHistoricalRewards); i++ { - distState.ValidatorHistoricalRewards[i].Rewards.CumulativeRewardRatio = decimalize(distState.ValidatorHistoricalRewards[i].Rewards.CumulativeRewardRatio) - } - - for i := 0; i < len(distState.ValidatorCurrentRewards); i++ { - distState.ValidatorCurrentRewards[i].Rewards.Rewards = decimalize(distState.ValidatorCurrentRewards[i].Rewards.Rewards) - } - - for i := 0; i < len(distState.DelegatorStartingInfos); i++ { - distState.DelegatorStartingInfos[i].StartingInfo.Stake = distState.DelegatorStartingInfos[i].StartingInfo.Stake.MulInt(utils.SHRPDecimal) - distState.DelegatorStartingInfos[i].StartingInfo.Height = 0 - } - for i := 0; i < len(distState.ValidatorSlashEvents); i++ { - distState.ValidatorSlashEvents[i].Height = 0 - } - - distStateBz, err := cdc.MarshalJSON(distState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - appState[distribution.ModuleName] = distStateBz - - // Slashing module - var slashingState slashing.GenesisState - if appState[slashing.ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[slashing.ModuleName], &slashingState) - } - - for k, v := range slashingState.SigningInfos { - v.StartHeight = 0 - slashingState.SigningInfos[k] = v - } - - slashingStateBz, err := cdc.MarshalJSON(slashingState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - appState[slashing.ModuleName] = slashingStateBz - - // Supply module - var supplyState supply.GenesisState - if appState[supply.ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[supply.ModuleName], &supplyState) - } - - var supplyCoins sdk.Coins - for i := 0; i < supplyState.Supply.Len(); i++ { - coin := supplyState.Supply[i] - var newCoin sdk.Coin - if coin.Denom == "shr" { - newCoin = sdk.NewCoin(coin.Denom, coin.Amount.Mul(utils.SHRDecimal)) - } else if coin.Denom == "shrp" { - newCoin = sdk.NewCoin(coin.Denom, coin.Amount.Mul(utils.SHRPDecimal)) - } - supplyCoins = supplyCoins.Add(newCoin) - } - supplyState.Supply = supplyCoins - - supplyStateBz, err := cdc.MarshalJSON(supplyState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - appState[supply.ModuleName] = supplyStateBz - - // Reset old id module - var identityState identity.GenesisState - identityStateBz, err := cdc.MarshalJSON(identityState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - appState[oldId.ModuleName] = identityStateBz - - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - - // Update gendoc - // Validators info - for i := 0; i < len(genDoc.Validators); i++ { - genDoc.Validators[i].Power = genDoc.Validators[i].Power * powerMultiplier - } - - return genutil.ExportGenesisFile(genDoc, outputFilePath) -} - -func decimalize(input sdk.DecCoins) sdk.DecCoins { - var newCoins sdk.DecCoins - for i := 0; i < len(input); i++ { - coin := input[i] - var newCoin sdk.DecCoin - if coin.Denom == "shr" { - newCoin = sdk.NewDecCoinFromDec(coin.Denom, coin.Amount.MulInt(utils.SHRDecimal)) - } else if coin.Denom == "shrp" { - newCoin = sdk.NewDecCoinFromDec(coin.Denom, coin.Amount.MulInt(utils.SHRPDecimal)) - } - newCoins = newCoins.Add(newCoin) - } - return newCoins -} - -func AddGenesisCustomMigrate( - ctx *server.Context, cdc *codec.Codec, defaultNodeHome, defaultClientHome string, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "custom-migrate ", - Short: "Migrate genesis file.", - Long: `Copy data from old genesis file the new one. This command generates merge file. -version 0.0.1: custom-migrate 0.0.1 -version 1.1.0: custom-migrate 1.1.0 - `, - // Args: cobra.ExactArgs(1), - RunE: func(_ *cobra.Command, args []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - switch v := args[0]; v { - case "0.0.1": - return FromV0_0_1(args[1], args[2], args[3], cdc) - case "1.1.0": - return FromV1_1_0(args[1], args[2], cdc) - default: - fmt.Println("No match version " + v) - } - return nil - }, - } - - return cmd -} diff --git a/cmd/shareledger/testnetCmd.go b/cmd/shareledger/testnetCmd.go deleted file mode 100644 index 19d90d9e..00000000 --- a/cmd/shareledger/testnetCmd.go +++ /dev/null @@ -1,390 +0,0 @@ -package main - -import ( - "bufio" - "encoding/json" - "fmt" - "io/ioutil" - "net" - "os" - "path/filepath" - - clkeys "github.com/cosmos/cosmos-sdk/client/keys" - - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth" - authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/cosmos/cosmos-sdk/x/supply" - "github.com/sharering/shareledger/x/electoral" - "github.com/sharering/shareledger/x/gentlemint" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/tendermint/go-amino" - tmconfig "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/crypto" - tmos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/types" - tmtime "github.com/tendermint/tendermint/types/time" - - shareringUtils "github.com/ShareRing/modules/utils" -) - -const ( - flagOutputDir = "output-dir" - flagAuthDir = "auth-dir" - flagStartingIP = "starting-ip" - flagNodeNum = "node-num" - nodeDaemonHome = "shareledger" - nodeClientHome = "slcli" - nodeDirPerm = 0755 - defaultKeyPass = "defaultKeyPass" - stakingTokenDenom = "shr" -) - -var ( - stakeSupply = sdk.NewInt(0) -) - -func testnetCmd(ctx *server.Context, cdc *codec.Codec, mbm module.BasicManager, genAccIterator genutiltypes.GenesisAccountsIterator) *cobra.Command { - cmd := &cobra.Command{ - Use: "testnet [chain-id]", - Args: cobra.ExactArgs(1), - Short: "", - Long: "", - RunE: func(cmd *cobra.Command, args []string) error { - config := ctx.Config - chainID := args[0] - outputDir := viper.GetString(flagOutputDir) - authDir := viper.GetString(flagAuthDir) - nodeNum := viper.GetInt(flagNodeNum) - startingIP := viper.GetString(flagStartingIP) - return InitTestnet(cmd, cdc, mbm, config, chainID, outputDir, authDir, startingIP, nodeNum, genAccIterator) - }, - } - cmd.Flags().StringP(flagOutputDir, "o", "./testnet", - "Directory to store initialization data for the testnet") - cmd.Flags().StringP(flagAuthDir, "a", "./authority", "Directory containing auth keys") - cmd.Flags().String(flags.FlagKeyringBackend, "os", "keyring backend: os/pass/file") - cmd.Flags().IntP(flagNodeNum, "n", 4, "Number of nodes to initialize testnet with") - cmd.Flags().String(flagStartingIP, "172.194.4.2", - "Starting IP address (172.194.4.2 results in persistent peers list ID0@172.194.4.2:46656, ID1@192.168.0.2:46656, ...)") - return cmd -} - -func InitTestnet(cmd *cobra.Command, cdc *codec.Codec, mbm module.BasicManager, config *tmconfig.Config, chainID, outputDir, authDir, startingIP string, nodeNum int, genAccIterator genutiltypes.GenesisAccountsIterator) error { - if chainID == "" { - chainID = "chain-unspecified" - } - monikers := make([]string, nodeNum) - nodeIDs := make([]string, nodeNum) - valPubKeys := make([]crypto.PubKey, nodeNum) - - var ( - genFilePaths []string - genAccounts []authexported.GenesisAccount - voterAddresses []sdk.AccAddress - ) - inBuf := bufio.NewReader(cmd.InOrStdin()) - - // Create special accounts and keys - specialKeysDir := "special-accounts" - - // Authority account - authorityAcc, _, _, err := createKeyAndGenesisAccount(nil, specialKeysDir, "authority", inBuf, 0) - if err != nil { - return err - } - genAccounts = append(genAccounts, authorityAcc) - - // Treasurer account - treasuryAcc, _, _, err := createKeyAndGenesisAccount(nil, specialKeysDir, "treasury", inBuf, 0) - if err != nil { - return err - } - genAccounts = append(genAccounts, treasuryAcc) - cmd.PrintErrf("The keys are in: %s\n", specialKeysDir) - // Account operator account - accountOperatorAcc, _, _, err := createKeyAndGenesisAccount(nil, specialKeysDir, "account_operator", inBuf, 0) - if err != nil { - return err - } - genAccounts = append(genAccounts, accountOperatorAcc) - - // Validator accounts - for i := 0; i < nodeNum; i++ { - // setup nodeName, path for slcli, shareledger - nodeName := fmt.Sprintf("node%d", i) - daemonHome := filepath.Join(outputDir, nodeName, nodeDaemonHome) - clientHome := filepath.Join(outputDir, nodeName, nodeClientHome) - - // setup config - config.SetRoot(daemonHome) - config.BaseConfig.DBBackend = "cleveldb" - config.RPC.ListenAddress = "tcp://0.0.0.0:26657" - config.RPC.CORSAllowedOrigins = []string{"*"} - if err := os.MkdirAll(filepath.Join(daemonHome, "config"), nodeDirPerm); err != nil { - os.RemoveAll(outputDir) - return err - } - monikers = append(monikers, nodeName) - config.Moniker = nodeName - - // path to write genesis.json for each node - genFilePaths = append(genFilePaths, config.GenesisFile()) - - // setup node files - var err error - nodeIDs[i], valPubKeys[i], err = genutil.InitializeNodeValidatorFiles(config) - if err != nil { - os.RemoveAll(outputDir) - } - - // generate node ip and peer address - ip, err := getIP(i, startingIP) - if err != nil { - os.RemoveAll(outputDir) - return err - } - peerAddr := fmt.Sprintf("%s@%s:26656", nodeIDs[i], ip) - - // create genesis accounts - genAcc, addr, seedPath, err := createKeyAndGenesisAccount(nil, clientHome, nodeName, inBuf, 1) - if err != nil { - os.RemoveAll(outputDir) - } - genAccounts = append(genAccounts, genAcc) - voterAddresses = append(voterAddresses, genAcc.GetAddress()) - - // create genTxs and write it down for each node - gentxsDir := filepath.Join(outputDir, "gentxs") - if err := writeStakingGenTx( - gentxsDir, - 1, - addr, - valPubKeys[i], - nodeName, - seedPath, - peerAddr, - inBuf, - chainID, - cdc, - ); err != nil { - os.RemoveAll(outputDir) - return err - } - } - if err := initGenFiles(cdc, mbm, chainID, genAccounts, voterAddresses, genFilePaths, nodeNum, authorityAcc.GetAddress(), treasuryAcc.GetAddress(), accountOperatorAcc.GetAddress()); err != nil { - return err - } - - if err := collectGenFiles(cdc, config, chainID, monikers, nodeIDs, valPubKeys, nodeNum, outputDir, genAccIterator); err != nil { - return err - } - cmd.PrintErrf("Successfully initialized %d node directories\n", nodeNum) - data, err := json.Marshal(nodeIDs) - if err != nil { - return err - } - nodeIDPath := filepath.Join(outputDir, "node_id.json") - err = ioutil.WriteFile(nodeIDPath, data, 0600) - if err != nil { - return err - } - return nil -} - -func getIP(i int, startingIP string) (ip string, err error) { - if len(startingIP) == 0 { - ip, err = server.ExternalIP() - if err != nil { - return "", err - } - return ip, nil - } - return calculateIP(startingIP, i) -} - -func calculateIP(ip string, i int) (string, error) { - ipv4 := net.ParseIP(ip).To4() - if ipv4 == nil { - return "", fmt.Errorf("%v: can not parse ipv4 address", ip) - } - for j := 0; j < i; j++ { - ipv4[3]++ - } - - return ipv4.String(), nil -} - -func writeFile(name string, dir string, contents []byte) error { - writePath := filepath.Join(dir) - file := filepath.Join(writePath, name) - - err := tmos.EnsureDir(writePath, 0700) - if err != nil { - return err - } - - err = tmos.WriteFile(file, contents, 0600) - if err != nil { - return err - } - - return nil -} - -func initGenFiles( - cdc *codec.Codec, - mbm module.BasicManager, - chainID string, - genAccounts []authexported.GenesisAccount, - voterAddresses []sdk.AccAddress, - genFiles []string, - nodeNum int, - authorityAcc, treasuryAcc, accountOperatorAcc sdk.AccAddress, -) error { - appGenState := mbm.DefaultGenesis() - - appGenState["supply"] = createSupplyGenesisState(cdc) - appGenState["electoral"] = createElectoralGenesis(cdc, voterAddresses) - var authGenState auth.GenesisState - cdc.MustUnmarshalJSON(appGenState[auth.ModuleName], &authGenState) - - authGenState.Accounts = genAccounts - appGenState[auth.ModuleName] = cdc.MustMarshalJSON(authGenState) - - // Add gentlemint - gentlemintGenState := gentlemint.GetGenesisStateFromAppState(cdc, appGenState) - gentlemintGenState.Authority = authorityAcc.String() - gentlemintGenState.Treasurer = treasuryAcc.String() - gentlemintGenState.AccountOperators = append(gentlemintGenState.AccountOperators, gentlemint.AccState{Address: accountOperatorAcc, Status: gentlemint.ActiveStatus}) - - gentlemintGenStateBz, err := cdc.MarshalJSON(gentlemintGenState) - appGenState[gentlemint.ModuleName] = gentlemintGenStateBz - - appGenStateJSON, err := codec.MarshalJSONIndent(cdc, appGenState) - if err != nil { - return err - } - - genDoc := types.GenesisDoc{ - ChainID: chainID, - AppState: appGenStateJSON, - Validators: nil, - } - - for i := 0; i < nodeNum; i++ { - if err := genDoc.SaveAs(genFiles[i]); err != nil { - return err - } - } - return nil -} - -func collectGenFiles( - cdc *codec.Codec, config *tmconfig.Config, chainID string, - monikers, nodeIDs []string, valPubkeys []crypto.PubKey, - nodeNum int, outputDir string, genAccIterator genutiltypes.GenesisAccountsIterator, -) error { - var appState json.RawMessage - genTime := tmtime.Now() - for i := 0; i < nodeNum; i++ { - nodeName := fmt.Sprintf("node%d", i) - nodeDir := filepath.Join(outputDir, nodeName, nodeDaemonHome) - gentxsDir := filepath.Join(outputDir, "gentxs") - moniker := monikers[i] - config.Moniker = nodeName - config.SetRoot(nodeDir) - - nodeID, valPubkey := nodeIDs[i], valPubkeys[i] - initCfg := genutil.NewInitConfig(chainID, gentxsDir, moniker, nodeID, valPubkey) - genDoc, err := types.GenesisDocFromFile((config.GenesisFile())) - if err != nil { - return err - } - nodeAppState, err := genutil.GenAppStateFromConfig(cdc, config, initCfg, *genDoc, genAccIterator) - if err != nil { - return err - } - if appState == nil { - appState = nodeAppState - } - - genFile := config.GenesisFile() - if err := genutil.ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime); err != nil { - return err - } - } - return nil -} -func createKeyAndGenesisAccount(addr sdk.AccAddress, keyHome, keyName string, inBuf *bufio.Reader, power int64) (authexported.GenesisAccount, sdk.AccAddress, string, error) { - var err error - if addr == nil { - addr, err = shareringUtils.CreateKeySeed(keyHome, keyName) - if err != nil { - return nil, nil, "", err - } - } - seedPath := filepath.Join(keyHome, fmt.Sprintf("%s_key_seed.json", keyName)) - accStakingTokens := sdk.TokensFromConsensusPower(power).AddRaw(int64(100)) - - stakeSupply = stakeSupply.Add(accStakingTokens) - coins := sdk.Coins{ - sdk.NewCoin(stakingTokenDenom, accStakingTokens), - } - return auth.NewBaseAccount(addr, coins, nil, 0, 0), addr, seedPath, nil -} - -func writeStakingGenTx(gentxsDir string, power int64, addr sdk.AccAddress, valPubKey crypto.PubKey, nodeName string, seedPath string, peerAddr string, inBuf *bufio.Reader, chainID string, cdc *amino.Codec) error { - valTokens := sdk.TokensFromConsensusPower(power) - msg := staking.NewMsgCreateValidator( - sdk.ValAddress(addr), - valPubKey, - sdk.NewCoin(stakingTokenDenom, valTokens), - staking.NewDescription(nodeName, "", "", "", ""), - staking.NewCommissionRates(sdk.OneDec(), sdk.OneDec(), sdk.OneDec()), - sdk.OneInt(), - ) - tx := auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{}, peerAddr) - seed, err := shareringUtils.GetKeeySeedFromFile(seedPath) - if err != nil { - return err - } - _, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - txBldr = txBldr.WithChainID(chainID).WithMemo(peerAddr) - signedTx, err := txBldr.SignStdTx("elon_musk_deer", clkeys.DefaultKeyPass, tx, false) - if err != nil { - return err - } - txBytes, err := cdc.MarshalJSON(signedTx) - if err != nil { - return err - } - if err := writeFile(fmt.Sprintf("%v.json", nodeName), gentxsDir, txBytes); err != nil { - return err - } - return nil -} - -func createSupplyGenesisState(cdc *amino.Codec) json.RawMessage { - totalSupply := sdk.NewCoins( - sdk.NewCoin(stakingTokenDenom, stakeSupply), - ) - gen := supply.NewGenesisState(totalSupply) - return cdc.MustMarshalJSON(gen) -} - -func createElectoralGenesis(cdc *amino.Codec, addrs []sdk.AccAddress) json.RawMessage { - gen := electoral.NewGenesisState(addrs) - return cdc.MustMarshalJSON(gen) -} diff --git a/cmd/slcli/createKey.go b/cmd/slcli/createKey.go deleted file mode 100644 index f806dac3..00000000 --- a/cmd/slcli/createKey.go +++ /dev/null @@ -1,222 +0,0 @@ -package main - -import ( - "bufio" - "encoding/json" - "fmt" - "os" - "strconv" - - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/cosmos/cosmos-sdk/server" - "github.com/spf13/cobra" - "github.com/spf13/viper" - - shareringUtils "github.com/ShareRing/modules/utils" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - cliHome = "slcli" - flagKeyName = "key-name" - flagPrivFile = "priv-file" - defaultKeyPass = "12345678" - flagAmount = "amount" - flagMnemoic = "mnemonic" -) - -func createKeyCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create-key", - Short: "create validator key", - Long: "validator private key, store in cli home and keybase", - RunE: func(cmd *cobra.Command, args []string) error { - cliHome := viper.GetString(flagHome) - if err := os.MkdirAll(cliHome, nodeDirPerm); err != nil { - return err - } - kb, err := keys.NewKeyring( - sdk.KeyringServiceName(), - viper.GetString(flags.FlagKeyringBackend), - cliHome, - bufio.NewReader(cmd.InOrStdin()), - ) - if err != nil { - os.RemoveAll(cliHome) - return err - } - addr, secret, err := server.GenerateSaveCoinKey(kb, viper.GetString(flagKeyName), defaultKeyPass, true) - if err != nil { - os.RemoveAll(cliHome) - return err - } - info := map[string]string{"secret": secret} - cliPrint, err := json.Marshal(info) - if err != nil { - os.RemoveAll(cliHome) - return err - } - if err := shareringUtils.WriteFile("key_seed.json", cliHome, cliPrint); err != nil { - os.RemoveAll(cliHome) - return err - } - fmt.Printf("\n%s address: %v\n\n", viper.GetString(flagKeyName), addr) - - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - cmd.Flags().String(flags.FlagKeyringBackend, "pass", "keyring backend: os/pass/file") - cmd.Flags().String(flagKeyName, "", "key name of validator key to be store in keybase") - return cmd -} - -func createKeyInMemCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create-key-in-memory", - Short: "create validator key seed", - Long: "only key seed return, key is not stored in the keybase", - RunE: func(cmd *cobra.Command, args []string) error { - cliHome := viper.GetString(flagHome) - if err := os.MkdirAll(cliHome, nodeDirPerm); err != nil { - return err - } - keyName := viper.GetString(flagKeyName) - addr, err := shareringUtils.CreateKeySeed(cliHome, keyName) - if err != nil { - return err - } - fmt.Printf("\n%s address: %v\n\n", keyName, addr) - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - cmd.Flags().String(flagKeyName, "", "key name of validator key to be store in keybase") - return cmd -} - -func getKeyFromSeedCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-key-from-seed", - Short: "get private key from seed", - RunE: func(cmd *cobra.Command, args []string) error { - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - privFile := viper.GetString(flagPrivFile) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - priv, err := shareringUtils.GetPrivKeyFromSeed(seed) - if err != nil { - return err - } - data, err := json.Marshal(priv) - if err != nil { - return err - } - return shareringUtils.WriteFile(privFile, "./", data) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd.Flags().String(flagPrivFile, "priv.json", "name of private key file") - return cmd -} -func getKeyFromMnemonicCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-key-from-mnemonic", - Short: "get private key from mnemoic (word phrases)", - // Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - mnemonic := viper.GetString("mnemonic") - index := viper.GetInt32(flagAmount) - - privs, addrs, err := shareringUtils.GetPrivKeysFromMnemonic(mnemonic, uint32(index)) - if err != nil { - return err - } - - for i := 0; i < len(privs); i++ { - fmt.Printf("%s %s\n", privs[i], addrs[i].String()) - } - return nil - }, - } - - cmd.Flags().Uint32(flagAmount, 1, "Amount of private keys") - cmd.Flags().String(flagMnemoic, "", "Mnemonic(word phrases) for HD derivation") - return cmd -} -func createKeyBatchCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create-key-batch [number of keys]", - Short: "create a large number of keys", - Long: "validator private key, store in cli home and keybase", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cliHome := viper.GetString(flagHome) - if err := os.MkdirAll(cliHome, nodeDirPerm); err != nil { - return err - } - num, err := strconv.Atoi(args[0]) - if err != nil { - return err - } - var addresses []sdk.AccAddress - for i := 0; i < num; i++ { - addr, secret, err := server.GenerateCoinKey() - addresses = append(addresses, addr) - if err != nil { - return err - } - info := map[string]string{"secret": secret} - cliPrint, err := json.Marshal(info) - if err != nil { - os.RemoveAll(cliHome) - return err - } - if err := shareringUtils.WriteFile(fmt.Sprintf("key_seed_%d.json", i), cliHome, cliPrint); err != nil { - os.RemoveAll(cliHome) - return err - } - } - - data, err := json.Marshal(addresses) - if err != nil { - os.RemoveAll(cliHome) - return err - } - if err := shareringUtils.WriteFile("address_list.json", cliHome, data); err != nil { - os.RemoveAll(cliHome) - return err - } - - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - return cmd -} - -func getKeysFromDirCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-keys-from-dir [dir]", - Args: cobra.ExactArgs(1), - Short: "get private keys from folder and export them to a file", - RunE: func(cmd *cobra.Command, args []string) error { - privFile := viper.GetString(flagPrivFile) - privs, err := shareringUtils.GetKeysFromDir(args[0]) - if err != nil { - return err - } - data, err := json.Marshal(privs) - if err != nil { - return err - } - return shareringUtils.WriteFile(privFile, "./", data) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd.Flags().String(flagPrivFile, "priv.json", "name of private key file") - return cmd -} diff --git a/cmd/slcli/delete-key.go b/cmd/slcli/delete-key.go deleted file mode 100644 index b57e3302..00000000 --- a/cmd/slcli/delete-key.go +++ /dev/null @@ -1,46 +0,0 @@ -package main - -import ( - "bufio" - "os" - "path/filepath" - - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/spf13/cobra" - "github.com/spf13/viper" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func deleteKeyCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "delete-key", - Short: "delete validator key", - Long: "delete validator key from keyring", - RunE: func(cmd *cobra.Command, args []string) error { - homeDir := viper.GetString(flagHome) - cliHome := filepath.Join(homeDir, cliHome) - if err := os.MkdirAll(cliHome, nodeDirPerm); err != nil { - return err - } - kb, err := keys.NewKeyring( - sdk.KeyringServiceName(), - viper.GetString(flags.FlagKeyringBackend), - cliHome, - bufio.NewReader(cmd.InOrStdin()), - ) - if err != nil { - return err - } - keyName := viper.GetString(flagKeyName) - kb.Delete(keyName, defaultKeyPass, true) - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - cmd.Flags().String(flags.FlagKeyringBackend, "os", "keyring backend: os/pass/file") - cmd.Flags().String(flagKeyName, "", "key name of validator key to be store in keybase") - cmd.Flags().String(flagKeySeed, "", "path to key_seed.json") - return cmd -} diff --git a/cmd/slcli/distribution.go b/cmd/slcli/distribution.go deleted file mode 100644 index 6605f859..00000000 --- a/cmd/slcli/distribution.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import ( - "bufio" - - shareringUtils "github.com/ShareRing/modules/utils" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" - "github.com/cosmos/cosmos-sdk/x/distribution/types" - - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -const ( - flagCommission = "commission" -) - -func GetCmdWithdrawRewards(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "withdraw-rewards [val-addr]", - Short: "withdraw rewards for a delegator", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minFeeShr) - delAddr := cliCtx.GetFromAddress() - valAddr, err := sdk.ValAddressFromBech32(args[0]) - if err != nil { - return err - } - - msgs := []sdk.Msg{types.NewMsgWithdrawDelegatorReward(delAddr, valAddr)} - if viper.GetBool(flagCommission) { - msgs = append(msgs, types.NewMsgWithdrawValidatorCommission(valAddr)) - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, msgs) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd.Flags().Bool(flagCommission, false, "also withdraw validator's commission") - cmd = flags.PostCommands(cmd)[0] - return cmd -} diff --git a/cmd/slcli/getPersistentPeers.go b/cmd/slcli/getPersistentPeers.go deleted file mode 100644 index fb12cdf8..00000000 --- a/cmd/slcli/getPersistentPeers.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "strconv" - "strings" - - "github.com/spf13/cobra" -) - -const ( - flagPeerFile = "peer-file" -) - -func getPersistentPeer() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-peers [nodeId file] [ip] [first port] [peer file]", - Short: "create persistent peers file from nodeId file", - Args: cobra.ExactArgs(4), - RunE: func(cmd *cobra.Command, args []string) error { - data, err := ioutil.ReadFile(args[0]) - if err != nil { - return err - } - var nodeIDs []string - err = json.Unmarshal(data, &nodeIDs) - port0, err := strconv.Atoi(args[2]) - if err != nil { - return err - } - var peerAddresses []string - for i, id := range nodeIDs { - port := port0 + i*2 - peerAddr := fmt.Sprintf("%s@%s:%d", id, args[1], port) - peerAddresses = append(peerAddresses, peerAddr) - } - peerStr := strings.Join(peerAddresses, ",") - peerdata, err := json.Marshal(peerStr) - err = ioutil.WriteFile(args[3], peerdata, 0600) - if err != nil { - return err - } - var myStr string - mydata, err := ioutil.ReadFile(args[3]) - if err != nil { - return err - } - if err := json.Unmarshal(mydata, &myStr); err != nil { - return err - } - return nil - }, - } - return cmd -} diff --git a/cmd/slcli/import-key.go b/cmd/slcli/import-key.go deleted file mode 100644 index 67d35ce3..00000000 --- a/cmd/slcli/import-key.go +++ /dev/null @@ -1,56 +0,0 @@ -package main - -import ( - "bufio" - "encoding/json" - "io/ioutil" - "os" - - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/spf13/cobra" - "github.com/spf13/viper" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - flagKeySeed = "key-seed" -) - -func importKeyCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "import-key", - Short: "import validator key", - Long: "import validator key from mnemonic into keyring", - RunE: func(cmd *cobra.Command, args []string) error { - cliHome := viper.GetString(flagHome) - if err := os.MkdirAll(cliHome, nodeDirPerm); err != nil { - return err - } - kb, err := keys.NewKeyring( - sdk.KeyringServiceName(), - viper.GetString(flags.FlagKeyringBackend), - cliHome, - bufio.NewReader(cmd.InOrStdin()), - ) - if err != nil { - return err - } - seedPath := viper.GetString(flagKeySeed) - seeds, err := ioutil.ReadFile(seedPath) - if err != nil { - return err - } - var a map[string]string - json.Unmarshal(seeds, &a) - kb.CreateAccount(viper.GetString(flagKeyName), a["secret"], "", defaultKeyPass, sdk.GetConfig().GetFullFundraiserPath(), keys.Secp256k1) - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - cmd.Flags().String(flags.FlagKeyringBackend, "os", "keyring backend: os/pass/file") - cmd.Flags().String(flagKeyName, "", "key name of validator key to be store in keybase") - cmd.Flags().String(flagKeySeed, "", "path to key_seed.json") - return cmd -} diff --git a/cmd/slcli/main.go b/cmd/slcli/main.go deleted file mode 100644 index c5eb54b1..00000000 --- a/cmd/slcli/main.go +++ /dev/null @@ -1,180 +0,0 @@ -package main - -import ( - "os" - "path" - - app "github.com/sharering/shareledger" - apptypes "github.com/sharering/shareledger/types" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/client/lcd" - "github.com/cosmos/cosmos-sdk/client/rpc" - "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/auth" - authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" - "github.com/cosmos/cosmos-sdk/x/bank" - bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli" - "github.com/spf13/cobra" - "github.com/spf13/viper" - amino "github.com/tendermint/go-amino" - "github.com/tendermint/tendermint/libs/cli" -) - -func main() { - cobra.EnableCommandSorting = false - - cdc := app.MakeCodec() - - apptypes.ConfigureSDK() - - rootCmd := &cobra.Command{ - Use: "slcli", - Short: "shareledger Client", - } - - // Add --chain-id to persistent flags and mark it required - rootCmd.PersistentFlags().String(flags.FlagChainID, "", "Chain ID of tendermint node") - rootCmd.PersistentPreRunE = func(_ *cobra.Command, _ []string) error { - return initConfig(rootCmd) - } - - // Construct Root Command - rootCmd.AddCommand( - createNodeKeysCmd(), - getNodeID(), - getNodeIDFromFile(), - updateConfig(), - getPrivvalPubKey(), - GetCmdCreateValidator(cdc), - GetCmdEditValidator(cdc), - GetCmdDelegate(cdc), - GetCmdUnbond(cdc), - GetCmdUnjail(cdc), - GetCmdWithdrawRewards(cdc), - createKeyCmd(), - getKeyFromSeedCmd(), - getKeyFromMnemonicCmd(), - getKeysFromDirCmd(), - createKeyInMemCmd(), - createKeyBatchCmd(), - importKeyCmd(), - ShowAddressCmd(), - showAddressFromBech32(), - showBech32FromAddress(), - showValOperFromAddress(), - createNodeConfig(), - getPeerFromConfig(), - getPeersFromNodekeys(), - deleteKeyCmd(), - getPersistentPeer(), - rpc.StatusCommand(), - client.ConfigCmd(app.DefaultCLIHome), - queryCmd(cdc), - txCmd(cdc), - flags.LineBreak, - lcd.ServeCommand(cdc, registerRoutes), - flags.LineBreak, - keys.Commands(), - flags.LineBreak, - version.Cmd, - flags.NewCompletionCmd(rootCmd, true), - ) - - executor := cli.PrepareMainCmd(rootCmd, "NS", app.DefaultCLIHome) - err := executor.Execute() - - if err != nil { - panic(err) - } -} - -func registerRoutes(rs *lcd.RestServer) { - client.RegisterRoutes(rs.CliCtx, rs.Mux) - authrest.RegisterTxRoutes(rs.CliCtx, rs.Mux) - app.ModuleBasics.RegisterRESTRoutes(rs.CliCtx, rs.Mux) -} - -func queryCmd(cdc *amino.Codec) *cobra.Command { - queryCmd := &cobra.Command{ - Use: "query", - Aliases: []string{"q"}, - Short: "Querying subcommands", - } - - queryCmd.AddCommand( - authcmd.GetAccountCmd(cdc), - flags.LineBreak, - rpc.ValidatorCommand(cdc), - rpc.BlockCommand(), - authcmd.QueryTxsByEventsCmd(cdc), - authcmd.QueryTxCmd(cdc), - flags.LineBreak, - ) - - // add modules' query commands - app.ModuleBasics.AddQueryCommands(queryCmd, cdc) - - return queryCmd -} - -func txCmd(cdc *amino.Codec) *cobra.Command { - txCmd := &cobra.Command{ - Use: "tx", - Short: "Transactions subcommands", - } - - txCmd.AddCommand( - bankcmd.SendTxCmd(cdc), - flags.LineBreak, - authcmd.GetSignCommand(cdc), - authcmd.GetMultiSignCommand(cdc), - flags.LineBreak, - authcmd.GetBroadcastCommand(cdc), - authcmd.GetEncodeCommand(cdc), - authcmd.GetDecodeCommand(cdc), - flags.LineBreak, - ) - - // add modules' tx commands - app.ModuleBasics.AddTxCommands(txCmd, cdc) - - // remove auth and bank commands as they're mounted under the root tx command - var cmdsToRemove []*cobra.Command - - for _, cmd := range txCmd.Commands() { - if cmd.Use == auth.ModuleName || cmd.Use == bank.ModuleName { - cmdsToRemove = append(cmdsToRemove, cmd) - } - } - - txCmd.RemoveCommand(cmdsToRemove...) - - return txCmd -} - -func initConfig(cmd *cobra.Command) error { - home, err := cmd.PersistentFlags().GetString(cli.HomeFlag) - if err != nil { - return err - } - - cfgFile := path.Join(home, "config", "config.toml") - if _, err := os.Stat(cfgFile); err == nil { - viper.SetConfigFile(cfgFile) - - if err := viper.ReadInConfig(); err != nil { - return err - } - } - if err := viper.BindPFlag(flags.FlagChainID, cmd.PersistentFlags().Lookup(flags.FlagChainID)); err != nil { - return err - } - if err := viper.BindPFlag(cli.EncodingFlag, cmd.PersistentFlags().Lookup(cli.EncodingFlag)); err != nil { - return err - } - return viper.BindPFlag(cli.OutputFlag, cmd.PersistentFlags().Lookup(cli.OutputFlag)) -} diff --git a/cmd/slcli/node-config.go b/cmd/slcli/node-config.go deleted file mode 100644 index 5799c2a9..00000000 --- a/cmd/slcli/node-config.go +++ /dev/null @@ -1,260 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "math/rand" - "net" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/p2p" -) - -const ( - flagMoniker = "moniker" - flagP2PPort = "p2p-port" - flagStartingIP = "starting-ip" - flagRPCPort = "rpc-port" - flagAllPeers = "all-peers" - persistentPeerNum = 3 -) - -type persistentPeer struct { - ID string `json:"id"` - IP string `json:"ip"` - Port int `json:"port"` -} - -func (p persistentPeer) String() string { - return fmt.Sprintf("%s@%s:%d", p.ID, p.IP, p.Port) -} - -func createNodeConfig() *cobra.Command { - cmd := &cobra.Command{ - Use: "create-node-config", - RunE: func(cmd *cobra.Command, args []string) error { - home := viper.GetString(flagHome) - configPath := filepath.Join(home, daemonHome, "config") - persistentPeers, err := choosePersistentPeers() - if err != nil { - return err - } - cfg := getBasicConfig(configPath) - cfg.P2P.PersistentPeers = persistentPeers - config.WriteConfigFile(filepath.Join(configPath, "config.toml"), cfg) - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the daemon") - cmd.Flags().String(flagAllPeers, "./all_peers.json", "path for persistent peers file") - cmd.Flags().String(flagMoniker, "monica", "moniker name") - cmd.Flags().String(flagRPCPort, "", "port for rpc listen addr") - cmd.Flags().String(flagP2PPort, "", "port for p2p listen addr") - return cmd -} - -func updateConfig() *cobra.Command { - cmd := &cobra.Command{ - Use: "update-config", - RunE: func(cmd *cobra.Command, args []string) error { - persistentPeers, err := choosePersistentPeers() - if err != nil { - return err - } - // writing peers to config - configPath := filepath.Join(viper.GetString(flagHome), daemonHome, "config") - cfg := getBasicConfig(configPath) - cfg.P2P.PersistentPeers = persistentPeers - config.WriteConfigFile(filepath.Join(configPath, "config.toml"), cfg) - if err != nil { - return err - } - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "node's home") - cmd.Flags().String(flagAllPeers, "./all_peers.json", "path for list of all peers file") - cmd.Flags().String(flagMoniker, "monica", "moniker name") - cmd.Flags().String(flagRPCPort, "", "port for rpc listen addr") - cmd.Flags().String(flagP2PPort, "", "port for p2p listen addr") - return cmd -} - -func getBasicConfig(configPath string) *config.Config { - cfg := config.DefaultConfig() - cfg.SetRoot(configPath) - cfg.BaseConfig.Moniker = viper.GetString(flagMoniker) - cfg.BaseConfig.DBBackend = "cleveldb" - cfg.RPC.ListenAddress = "tcp://0.0.0.0:26657" - rpcPort := viper.GetString(flagRPCPort) - if rpcPort != "" { - cfg.RPC.ListenAddress = "tcp://0.0.0.0:" + rpcPort - - } - p2pPort := viper.GetString(flagP2PPort) - if p2pPort != "" { - cfg.P2P.ListenAddress = "tcp://0.0.0.0:" + p2pPort - } - - cfg.ProfListenAddress = "localhost:6060" - cfg.P2P.RecvRate = 5120000 - cfg.P2P.SendRate = 5120000 - cfg.TxIndex.IndexAllKeys = true - cfg.Consensus.TimeoutCommit = 5 * time.Second - // cfg.RPC.CORSAllowedOrigins = []string{"*"} - return cfg -} - -func choosePersistentPeers() (string, error) { - nodeKeyPath := filepath.Join(viper.GetString(flagHome), daemonHome, "config/node_key.json") - nodeKey, err := p2p.LoadNodeKey(nodeKeyPath) - if err != nil { - return "", err - } - nodeID := fmt.Sprintf("%s", nodeKey.ID()) - - // reading persitent peers from file - allPeers := []persistentPeer{} - excludedIDs := map[string]struct{}{nodeID: {}} - - data, err := ioutil.ReadFile(viper.GetString(flagAllPeers)) - if err != nil { - return "", nil - } - - if err := json.Unmarshal(data, &allPeers); err != nil { - return "", nil - } - if len(allPeers) < persistentPeerNum { - return "", nil - } - - // get 3 unique persitent peers excluding the node itself - mypeers := []persistentPeer{} - for i := 0; i < persistentPeerNum; { - rand.Seed(time.Now().UTC().UnixNano()) - myrand := rand.Intn(len(allPeers)) - id := allPeers[myrand].ID - if _, ok := excludedIDs[id]; !ok { - excludedIDs[id] = struct{}{} - i++ - mypeers = append(mypeers, allPeers[myrand]) - } else { - } - } - - peerList := []string{} - for _, peer := range mypeers { - peerList = append(peerList, peer.String()) - } - - return strings.Join(peerList, ","), nil -} - -func getPeersFromNodekeys() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-peers-from-node-keys [node-key-1] [node-key-2] [node-key-n]", - RunE: func(cmd *cobra.Command, args []string) error { - var peers []persistentPeer - port, err := strconv.Atoi(viper.GetString(flagP2PPort)) - if err != nil { - return err - } - for i, a := range args { - nodeKey, err := p2p.LoadNodeKey(a) - if err != nil { - return err - } - nodeID := fmt.Sprintf("%s", nodeKey.ID()) - ipv4 := net.ParseIP(viper.GetString(flagStartingIP)).To4() - for j := 0; j < i; j++ { - ipv4[3]++ - } - peers = append(peers, persistentPeer{nodeID, ipv4.String(), port}) - } - data, err := json.Marshal(peers) - if err != nil { - return err - } - err = ioutil.WriteFile(viper.GetString(flagAllPeers), data, 0600) - if err != nil { - return err - } - return nil - }, - } - cmd.Flags().String(flagAllPeers, "./all_peers_2.json", "path for list of all peers file") - cmd.Flags().String(flagP2PPort, "26656", "port for p2p listen addr") - cmd.Flags().String(flagStartingIP, "172.194.4.2", "starting ip") - return cmd -} - -func getPeerFromConfig() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-peer-from-config [config1] [config2]", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - peerMap := make(map[string]string) - var peers []persistentPeer - cfgFile := viper.New() - for _, a := range args { - cfgFile.SetConfigFile(a) - err := cfgFile.ReadInConfig() - if err != nil { - return err - } - err = addPersitentPeers(peerMap, cfgFile) - if err != nil { - return err - } - } - for k, v := range peerMap { - s := strings.Split(v, ":") - port, err := strconv.Atoi(s[1]) - if err != nil { - return err - } - peer := persistentPeer{k, s[0], port} - peers = append(peers, peer) - } - data, err := json.Marshal(peers) - if err != nil { - return err - } - err = ioutil.WriteFile("./all_peers_2.json", data, 0600) - if err != nil { - return err - } - return nil - }, - } - return cmd -} - -func addPersitentPeers(peers map[string]string, configFile *viper.Viper) error { - s, err := getPersistentPeers(configFile) - if err != nil { - return err - } - for _, peer := range s { - p := strings.Split(peer, "@") - peers[p[0]] = p[1] - } - return nil -} - -func getPersistentPeers(configFile *viper.Viper) ([]string, error) { - s := configFile.Get("p2p.persistent_peers") - r, ok := s.(string) - if !ok { - return nil, fmt.Errorf("Persistent_peers is not string %v", s) - } - return strings.Split(r, ","), nil -} diff --git a/cmd/slcli/node-privval.go b/cmd/slcli/node-privval.go deleted file mode 100644 index ced4956e..00000000 --- a/cmd/slcli/node-privval.go +++ /dev/null @@ -1,136 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/tendermint/tendermint/p2p" - "github.com/tendermint/tendermint/privval" -) - -const ( - flagHome = "home" - flagNodeFile = "node-file" - defaultHome = "./" - daemonHome = "shareledger" - nodeDirPerm = 0755 -) - -func createNodeKeysCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create-node-keys", - Short: "generate keys and files for nodes and validators", - Long: "for node: public key, private key, nodeID, for validator: private key and store it in keybase", - RunE: func(cmd *cobra.Command, args []string) error { - homeDir := viper.GetString(flagHome) - daemonHome := filepath.Join(homeDir, daemonHome) - ctx := server.NewDefaultContext() - config := ctx.Config - config.SetRoot(daemonHome) - if err := os.MkdirAll(filepath.Join(daemonHome, "config"), nodeDirPerm); err != nil { - os.RemoveAll(daemonHome) - return err - } - nodeID, valPubKey, err := genutil.InitializeNodeValidatorFiles(config) - if err != nil { - os.RemoveAll(daemonHome) - return err - } - fmt.Println("\nnode_ID is", nodeID) - bech32PubKey, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, valPubKey) - if err != nil { - os.RemoveAll(daemonHome) - return err - } - fmt.Println("\nprivval_pubkey:", bech32PubKey) - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - return cmd -} - -func getNodeID() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-node-id", - Short: "generate keys and files for nodes and validators", - Long: "for node: public key, private key, nodeID, for validator: private key and store it in keybase", - RunE: func(cmd *cobra.Command, args []string) error { - homeDir := viper.GetString(flagHome) - daemonHome := filepath.Join(homeDir, daemonHome) - ctx := server.NewDefaultContext() - config := ctx.Config - config.SetRoot(daemonHome) - nodeKey, err := p2p.LoadNodeKey(config.NodeKeyFile()) - if err != nil { - return err - } - fmt.Println("node Id is: ", nodeKey.ID()) - pubKey := nodeKey.PubKey() - bech32PubKey, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pubKey) - if err != nil { - return err - } - fmt.Println("node pubkey is", bech32PubKey) - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - return cmd -} - -func getNodeIDFromFile() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-node-id-from-file", - Short: "generate keys and files for nodes and validators", - Long: "for node: public key, private key, nodeID, for validator: private key and store it in keybase", - RunE: func(cmd *cobra.Command, args []string) error { - nodeFile := viper.GetString(flagNodeFile) - nodeKey, err := p2p.LoadNodeKey(nodeFile) - if err != nil { - return err - } - fmt.Println("node Id is: ", nodeKey.ID()) - pubKey := nodeKey.PubKey() - bech32PubKey, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pubKey) - if err != nil { - return err - } - fmt.Println("node pubkey is", bech32PubKey) - return nil - }, - } - cmd.Flags().String(flagNodeFile, "", "path to node key file") - return cmd -} - -func getPrivvalPubKey() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-privval-pubkey", - Short: "get private validator public key from files in node config", - RunE: func(cmd *cobra.Command, args []string) error { - homeDir := viper.GetString(flagHome) - daemonHome := filepath.Join(homeDir, daemonHome) - ctx := server.NewDefaultContext() - config := ctx.Config - config.SetRoot(daemonHome) - pv := privval.LoadFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile()) - - pubKey := pv.GetPubKey() - bech32PubKey, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pubKey) - if err != nil { - return err - } - fmt.Println(bech32PubKey) - return nil - }, - } - cmd.Flags().String(flagHome, defaultHome, "home for the cli") - return cmd -} diff --git a/cmd/slcli/show-address.go b/cmd/slcli/show-address.go deleted file mode 100644 index 5dccc4aa..00000000 --- a/cmd/slcli/show-address.go +++ /dev/null @@ -1,120 +0,0 @@ -package main - -import ( - "fmt" - - shareringUtils "github.com/ShareRing/modules/utils" - clkeys "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/crypto/keys" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -type bechKeyOutFn func(keyInfo keys.Info) (keys.KeyOutput, error) - -const ( - FlagBechPrefix = "bech" -) - -func ShowAddressCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "show-address-from-seed", - Short: "show address from seed file", - RunE: showAddress, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - cmd.Flags().String(FlagBechPrefix, "acc", "address format account/validator") - return cmd -} - -func showAddress(cmd *cobra.Command, args []string) error { - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - kb := clkeys.NewInMemoryKeyBase() - keyName := "elon_musk_deer" - info, err := kb.CreateAccount(keyName, seed, "", clkeys.DefaultKeyPass, sdk.GetConfig().Seal().GetFullFundraiserPath(), keys.Secp256k1) - if err != nil { - return err - } - bechOut, err := getBechKeyOut(viper.GetString(FlagBechPrefix)) - if err != nil { - return err - } - printKeyAddress(info, bechOut) - return nil -} - -func getBechKeyOut(bechPrefix string) (bechKeyOutFn, error) { - switch bechPrefix { - case sdk.PrefixAccount: - return keys.Bech32KeyOutput, nil - case sdk.PrefixValidator: - return keys.Bech32ValKeyOutput, nil - case sdk.PrefixConsensus: - return keys.Bech32ConsKeyOutput, nil - } - - return nil, fmt.Errorf("invalid Bech32 prefix encoding provided: %s", bechPrefix) -} - -func printKeyAddress(info keys.Info, bechKeyOut bechKeyOutFn) { - ko, err := bechKeyOut(info) - if err != nil { - panic(err) - } - - fmt.Println(ko.Address) -} - -func showBech32FromAddress() *cobra.Command { - cmd := &cobra.Command{ - Use: "show-bech32-from-address", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.AccAddressFromHex(args[0]) - if err != nil { - return err - } - fmt.Println(addr.String()) - return nil - }, - } - return cmd -} - -func showAddressFromBech32() *cobra.Command { - cmd := &cobra.Command{ - Use: "show-address-from-bech32", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - fmt.Println(addr) - return nil - }, - } - return cmd -} - -func showValOperFromAddress() *cobra.Command { - cmd := &cobra.Command{ - Use: "show-valoper-from-address", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - valAddr, err := sdk.ValAddressFromHex(args[0]) - if err != nil { - return err - } - fmt.Println(valAddr.String()) - return nil - }, - } - return cmd -} diff --git a/cmd/slcli/validator.go b/cmd/slcli/validator.go deleted file mode 100644 index 69231047..00000000 --- a/cmd/slcli/validator.go +++ /dev/null @@ -1,365 +0,0 @@ -package main - -import ( - "bufio" - "errors" - "fmt" - "strings" - - shareringUtils "github.com/ShareRing/modules/utils" - - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" - "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/staking/client/cli" - "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -var ( - minFeeShr = shareringUtils.MINFEE.String() + "shr" -) - -func GetCmdCreateValidator(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "create-validator", - Short: "create new validator initialized with a self-delegation to it", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minFeeShr) - txBldr, msg, err := BuildCreateValidatorMsg(cliCtx, txBldr) - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(cli.FlagAmount, "", "Amount of coins to bond") - cmd.Flags().String(cli.FlagPubKey, "", "The bech32 encoded PubKey of the validator") - cmd.Flags().String(cli.FlagMoniker, "monica", "The validator's name") - cmd.Flags().String(cli.FlagIdentity, "", "The optional identity signature (ex. UPort or Keybase)") - cmd.Flags().String(cli.FlagWebsite, "", "The validator's (optional) website") - cmd.Flags().String(cli.FlagSecurityContact, "", "The validator's (optional) security contact email") - cmd.Flags().String(cli.FlagDetails, "", "The validator's (optional) details") - cmd.Flags().String(cli.FlagCommissionRate, "", "The new commission rate percentage") - cmd.Flags().String(cli.FlagCommissionMaxRate, "", "The maximum commission rate percentage") - cmd.Flags().String(cli.FlagCommissionMaxChangeRate, "", "The maximum commission change rate percentage (per day)") - cmd.Flags().String(cli.FlagMinSelfDelegation, "", "The minimum self delegation required on the validator") - cmd.Flags().String(cli.FlagNodeID, "", "NodeID") - cmd.Flags().String(cli.FlagIP, "", "Node ip address") - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd.MarkFlagRequired(cli.FlagAmount) - cmd.MarkFlagRequired(cli.FlagPubKey) - cmd.MarkFlagRequired(cli.FlagMoniker) - cmd = flags.PostCommands(cmd)[0] - return cmd -} - -// BuildCreateValidatorMsg makes a new MsgCreateValidator. -func BuildCreateValidatorMsg(cliCtx context.CLIContext, txBldr auth.TxBuilder) (auth.TxBuilder, sdk.Msg, error) { - - amounstStr := viper.GetString(cli.FlagAmount) - amount, err := sdk.ParseCoin(amounstStr) - if err != nil { - return txBldr, nil, err - } - - valAddr := cliCtx.GetFromAddress() - pkStr := viper.GetString(cli.FlagPubKey) - - pk, err := sdk.GetPubKeyFromBech32(sdk.Bech32PubKeyTypeConsPub, pkStr) - if err != nil { - return txBldr, nil, err - } - - description := types.NewDescription( - viper.GetString(cli.FlagMoniker), - viper.GetString(cli.FlagIdentity), - viper.GetString(cli.FlagWebsite), - viper.GetString(cli.FlagSecurityContact), - viper.GetString(cli.FlagDetails), - ) - - // get the initial validator commission parameters - rateStr := viper.GetString(cli.FlagCommissionRate) - maxRateStr := viper.GetString(cli.FlagCommissionMaxRate) - maxChangeRateStr := viper.GetString(cli.FlagCommissionMaxChangeRate) - commissionRates, err := buildCommissionRates(rateStr, maxRateStr, maxChangeRateStr) - if err != nil { - return txBldr, nil, err - } - - // get the initial validator min self delegation - msbStr := viper.GetString(cli.FlagMinSelfDelegation) - minSelfDelegation, ok := sdk.NewIntFromString(msbStr) - if !ok { - return txBldr, nil, types.ErrMinSelfDelegationInvalid - } - - msg := types.NewMsgCreateValidator( - sdk.ValAddress(valAddr), pk, amount, description, commissionRates, minSelfDelegation, - ) - - if viper.GetBool(flags.FlagGenerateOnly) { - ip := viper.GetString(cli.FlagIP) - nodeID := viper.GetString(cli.FlagNodeID) - if nodeID != "" && ip != "" { - txBldr = txBldr.WithMemo(fmt.Sprintf("%s@%s:26656", nodeID, ip)) - } - } - - return txBldr, msg, nil -} - -func buildCommissionRates(rateStr, maxRateStr, maxChangeRateStr string) (commission types.CommissionRates, err error) { - if rateStr == "" || maxRateStr == "" || maxChangeRateStr == "" { - return commission, errors.New("must specify all validator commission parameters") - } - - rate, err := sdk.NewDecFromStr(rateStr) - if err != nil { - return commission, err - } - - maxRate, err := sdk.NewDecFromStr(maxRateStr) - if err != nil { - return commission, err - } - - maxChangeRate, err := sdk.NewDecFromStr(maxChangeRateStr) - if err != nil { - return commission, err - } - - commission = types.NewCommissionRates(rate, maxRate, maxChangeRate) - return commission, nil -} - -func GetCmdEditValidator(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "edit-validator", - Short: "edit an existing validator account", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minFeeShr) - - valAddr := cliCtx.GetFromAddress() - description := types.NewDescription( - viper.GetString(cli.FlagMoniker), - viper.GetString(cli.FlagIdentity), - viper.GetString(cli.FlagWebsite), - viper.GetString(cli.FlagSecurityContact), - viper.GetString(cli.FlagDetails), - ) - - var newRate *sdk.Dec - - commissionRate := viper.GetString(cli.FlagCommissionRate) - if commissionRate != "" { - rate, err := sdk.NewDecFromStr(commissionRate) - if err != nil { - return fmt.Errorf("invalid new commission rate: %v", err) - } - - newRate = &rate - } - - var newMinSelfDelegation *sdk.Int - - minSelfDelegationString := viper.GetString(cli.FlagMinSelfDelegation) - if minSelfDelegationString != "" { - msb, ok := sdk.NewIntFromString(minSelfDelegationString) - if !ok { - return types.ErrMinSelfDelegationInvalid - } - - newMinSelfDelegation = &msb - } - - msg := types.NewMsgEditValidator(sdk.ValAddress(valAddr), description, newRate, newMinSelfDelegation) - - // build and sign the transaction, then broadcast to Tendermint - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(cli.FlagMoniker, types.DoNotModifyDesc, "The validator's name") - cmd.Flags().String(cli.FlagIdentity, types.DoNotModifyDesc, "The (optional) identity signature (ex. UPort or Keybase)") - cmd.Flags().String(cli.FlagWebsite, types.DoNotModifyDesc, "The validator's (optional) website") - cmd.Flags().String(cli.FlagSecurityContact, types.DoNotModifyDesc, "The validator's (optional) security contact email") - cmd.Flags().String(cli.FlagDetails, types.DoNotModifyDesc, "The validator's (optional) details") - cmd.Flags().String(cli.FlagCommissionRate, "", "The new commission rate percentage") - cmd.Flags().String(cli.FlagMinSelfDelegation, "", "The minimum self delegation required on the validator") - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd = flags.PostCommands(cmd)[0] - return cmd -} - -func GetCmdDelegate(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "delegate [validator-addr] [amount]", - Args: cobra.ExactArgs(2), - Short: "Delegate liquid tokens to a validator", - Long: strings.TrimSpace( - fmt.Sprintf(`Delegate an amount of liquid coins to a validator from your wallet. - -Example: -$ %s tx staking delegate cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 1000stake --key-seed my_key_seed.json -`, - version.ClientName, - ), - ), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minFeeShr) - - amount, err := sdk.ParseCoin(args[1]) - if err != nil { - return err - } - - delAddr := cliCtx.GetFromAddress() - valAddr, err := sdk.ValAddressFromBech32(args[0]) - if err != nil { - return err - } - - msg := types.NewMsgDelegate(delAddr, valAddr, amount) - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd = flags.PostCommands(cmd)[0] - return cmd -} - -func GetCmdUnbond(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "unbond [validator-addr] [amount]", - Short: "Unbond shares from a validator", - Args: cobra.ExactArgs(2), - Long: strings.TrimSpace( - fmt.Sprintf(`Unbond an amount of bonded shares from a validator. - -Example: -$ %s tx staking unbond cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake --from mykey -`, - version.ClientName, - ), - ), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minFeeShr) - - delAddr := cliCtx.GetFromAddress() - valAddr, err := sdk.ValAddressFromBech32(args[0]) - if err != nil { - return err - } - - amount, err := sdk.ParseCoin(args[1]) - if err != nil { - return err - } - - msg := types.NewMsgUndelegate(delAddr, valAddr, amount) - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd = flags.PostCommands(cmd)[0] - return cmd -} - -func GetCmdUnjail(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "unjail [validator-addr]", - Short: "unjail a validator", - Args: cobra.ExactArgs(1), - Long: strings.TrimSpace( - fmt.Sprintf(`Example: -$ %s tx staking unbond cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj --key-seed ./my_key_seed.json -`, - version.ClientName, - ), - ), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minFeeShr) - - valAddr, err := sdk.ValAddressFromBech32(args[0]) - if err != nil { - return err - } - - msg := slashing.NewMsgUnjail(valAddr) - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json file") - cmd = flags.PostCommands(cmd)[0] - return cmd -} diff --git a/config.yml b/config.yml new file mode 100644 index 00000000..06346dd9 --- /dev/null +++ b/config.yml @@ -0,0 +1,82 @@ +accounts: + - name: validator + coins: ["100000000000000000nshr", "100000000000cent"] + mnemonic: "arrange amateur body cotton slim roof hand blush monkey remove expect rug hazard spoil flag choose tomato end duty nominee wheel cushion into stable" + - name: authority + coins: ["100000000000000000nshr", "100000000000cent"] + mnemonic: "exile dutch volcano mosquito tree correct blame tape involve fiscal blossom emerge install grant normal divorce shiver barrel island drink local banana educate fix" + - name: treasurer + coins: ["100000000000000000nshr", "100000000000cent"] + mnemonic: "hair bacon dirt torch air uphold tackle involve pool time token junior melody option judge thumb dance tube loud noise eternal congress fragile apart" + - name: account-operator + coins: ["100000000000000000nshr", "100000000000cent"] + mnemonic: "pool mother column hurdle jealous wear host attack speak vague client demise inherit arrange lens purity time math decade renew south ring retreat balance" + - name: idsigner + coins: ["100000000000000000nshr", "100000000000cent"] + mnemonic: "memory mind warfare pull risk math concert address zero speak glimpse outside economy hill boil boss pulp much connect install clip short object tobacco" + - name: user + coins: [ "100000000000nshr" ] + mnemonic: "bright payment cash tomato tragic impulse perfect jacket matter jelly artist pulse will cinnamon erase middle elevator away clinic razor rotate tide unfair trigger" +validator: + name: validator + staked: "100000000000000000nshr" +client: + openapi: + path: "docs/static/openapi.yml" +build: + binary: "shareledger" +# faucet: +# name: bob +# coins: ["5token", "100000stake"] +genesis: + chain_id: "ShareRing-VoyagerNet" + app_state: + staking: + params: + bond_denom: "nshr" + crisis: + constant_fee: + denom: "nshr" + gov: + deposit_params: + min_deposit: + - amount: "100000000" + denom: "nshr" + bank: + denom_metadata: + - description: "The native smallest token of shr chain" + denom_units: + - denom: nshr + exponent: 0 + aliases: + - nshr + - denom: "shr" + exponent: 9 + aliases: + - shr + base: "nshr" + display: "shr" + name: "nshr" + symbol: "nshr" + mint: + minter: + inflation: "0" + params: + mint_denom: "nshr" + inflation_max: "0" + inflation_min: "0" + electoral: + accStateList: + - key: shrploadershareledger1lq9svs76xwekrrzw7uprekyqydf7fp02p8zp8e + address: shareledger1lq9svs76xwekrrzw7uprekyqydf7fp02p8zp8e + status: active + - key: votershareledger18pf3zdwqjntd9wkvfcjvmdc7hua6c0q2eck5h5 + address: shareledger18pf3zdwqjntd9wkvfcjvmdc7hua6c0q2eck5h5 + status: active + authority: + address: shareledger1lq9svs76xwekrrzw7uprekyqydf7fp02p8zp8e + treasurer: + address: shareledger1l5hkf2epa5xmvngnjaasj5dp9jp7ut6s9mrqve +init: + client: + chain-id: "ShareRing-VoyagerNet" \ No newline at end of file diff --git a/deploy/.env b/deploy/.env new file mode 100644 index 00000000..3a3499f8 --- /dev/null +++ b/deploy/.env @@ -0,0 +1,9 @@ +NGINXIP=172.194.4.1 +NODE0IP=snode0 +NODE1IP=snode1 +NODE2IP=snode2 +NODE3IP=snode3 +NODE0ID=1cb2b28257d06e8d351fd1a90f0984b8e0a77d80 +NODE1ID=401e7d8ed932f4b7616a212f974dfa9303aca1fc +NODE2ID=33b708342833c018f7f407534be6af1f945d2566 +NODE3ID=2119168ca9d24d260e9aff9033697140117ae928 \ No newline at end of file diff --git a/deploy/docker-compose.yaml b/deploy/docker-compose.yaml new file mode 100644 index 00000000..bed276f0 --- /dev/null +++ b/deploy/docker-compose.yaml @@ -0,0 +1,106 @@ +version: '3' + +services: + nginx: + container_name: snginx + image: nginx:alpine + restart: always + depends_on: + - snode0 + - snode2 + ports: + - "1317-1318:1317-1318" + - "26657-26658:26657-26658" + - "9090-9091:9090-9091" + volumes: + - ./testnet/nginx/nginx.conf:/etc/nginx/conf.d/default.conf + - ./testnet/nginx/certs:/etc/nginx/certs + snode0: + container_name: snode0 + image: "sharering/shareledger:latest" + restart: always + hostname: snode0 + expose: + - 26656 + - 26657 + - 9090 + - 9091 + - 1317 + - 26658 + - 26660 + volumes: + - ./testnet/node0:/root/.Shareledger + - ./testnet/script:/app/script:ro + command: + - shareledger + - start + - --p2p.persistent_peers + - ${NODE1ID}@${NODE1IP}:26656,${NODE2ID}@${NODE2IP}:26656,${NODE3ID}@${NODE3IP}:26656 + - --rpc.laddr + - tcp://0.0.0.0:26657 + snode1: + container_name: snode1 + restart: always + hostname: snode1 + image: "sharering/shareledger:latest" + expose: + - 26656 + - 26657 + - 9090 + - 9091 + - 1317 + - 26658 + - 26660 + volumes: + - ./testnet/node1:/root/.Shareledger + command: + - shareledger + - start + - --p2p.persistent_peers + - ${NODE0ID}@${NODE0IP}:26656,${NODE2ID}@${NODE2IP}:26656,${NODE3ID}@${NODE3IP}:26656 + - --rpc.laddr + - tcp://0.0.0.0:26657 + snode2: + container_name: snode2 + restart: always + hostname: snode2 + image: "sharering/shareledger:latest" + expose: + - 26656 + - 26657 + - 9090 + - 9091 + - 1317 + - 26658 + - 26660 + volumes: + - ./testnet/node2:/root/.Shareledger + command: + - shareledger + - start + - --p2p.persistent_peers + - ${NODE1ID}@${NODE1IP}:26656,${NODE0ID}@${NODE0IP}:26656,${NODE3ID}@${NODE3IP}:26656 + - --rpc.laddr + - tcp://0.0.0.0:26657 + snode3: + container_name: snode3 + image: "sharering/shareledger:latest" + restart: always + hostname: snode3 + expose: + - 26656 + - 26657 + - 9090 + - 9091 + - 1317 + - 26658 + - 26660 + volumes: + - ./testnet/node3:/root/.Shareledger + command: + - shareledger + - start + - --p2p.persistent_peers + - ${NODE1ID}@${NODE1IP}:26656,${NODE2ID}@${NODE2IP}:26656,${NODE0ID}@${NODE0IP}:26656 + - --rpc.laddr + - tcp://0.0.0.0:26657 \ No newline at end of file diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile new file mode 100644 index 00000000..daac19d3 --- /dev/null +++ b/deploy/docker/Dockerfile @@ -0,0 +1,22 @@ +FROM golang:1.17-alpine AS build + +WORKDIR /app + +RUN apk add --update make + +COPY /go.mod ./ +COPY /go.sum ./ +RUN go mod tidy +RUN go mod download + +COPY . . +RUN make build + +FROM alpine:3.14 +WORKDIR /app +COPY --from=build /app/build/* ./ +RUN chmod +x ./shareledger +RUN mv ./shareledger /bin +# +EXPOSE 26656 26657 +CMD ["shareledger", "start"] \ No newline at end of file diff --git a/deploy/testnet_config/genesis.json b/deploy/testnet_config/genesis.json new file mode 100755 index 00000000..24f015a2 --- /dev/null +++ b/deploy/testnet_config/genesis.json @@ -0,0 +1,48124 @@ +{ + "genesis_time": "2021-02-24T09:04:26.679822768Z", + "chain_id": "ShareRing-Lifestyle", + "initial_height": "2073605", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { + "max_age_num_blocks": "100000", + "max_age_duration": "172800000000000", + "max_bytes": "1048576" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + }, + "version": {} + }, + "validators": [ + { + "address": "21C7548A66D0E5C43C142C6E3A0BE3653A86C4B4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "CZp/ZRvmohuTMbvH/jDnDAbTOaLwQCToGgb+bZ/CEdw=" + }, + "power": "72", + "name": "node3" + }, + { + "address": "9F5EDCBEB2F7E500E9D751EC5473E7604B3C3AE2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VEeE31lZUFGcsoJHhe3NavaWrtvi3+FHYJY9PUhgELc=" + }, + "power": "11", + "name": "node0" + }, + { + "address": "B83BD3C8D6866BBDE2B72E60A79FA424AB159AC9", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "OaXzGMQNz+vWXWTkztTPrb4C6HMRtt34axZLdkQz/Wk=" + }, + "power": "108", + "name": "node2" + } + ], + "app_hash": "", + "app_state": { + "asset": { + "assets": [ + { + "creator": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "hash": "YTE=", + "UUID": "a1", + "status": true, + "rate": "5" + }, + { + "creator": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "hash": "YTEyMw==", + "UUID": "a123", + "status": true, + "rate": "5" + }, + { + "creator": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "hash": "YTI=", + "UUID": "a2", + "status": true, + "rate": "5" + }, + { + "creator": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "hash": "YTM=", + "UUID": "a3", + "status": true, + "rate": "5" + }, + { + "creator": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "hash": "YTQ=", + "UUID": "a4", + "status": true, + "rate": "5" + } + ] + }, + "auth": { + "params": { + "max_memo_characters": "256", + "tx_sig_limit": "7", + "tx_size_cost_per_byte": "10", + "sig_verify_cost_ed25519": "590", + "sig_verify_cost_secp256k1": "1000" + }, + "accounts": [ + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1qq86x7fh579vt9d93r7dyunmsvd8njgzf8vc92", + "pub_key": null, + "account_number": "15", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1qs9xq7xk753qq47qan40sa5wedtqf77vmf07qv", + "pub_key": null, + "account_number": "143", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1qeevhzxzvgjfe4vvug6thhtevq2tv5zg4syakv", + "pub_key": null, + "account_number": "292", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1qa754x52l7zdgau9whfxly2x7nx5ppeua9438t", + "pub_key": null, + "account_number": "223", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A7w3TlCRTeuCn3p/XchiqMkbHCHiqGriC/LHZl6cEjgE" + }, + "account_number": "99", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Asblvs3vKE4pZ8somAcLU3njuzpmklZHdtmSYxljIGrf" + }, + "account_number": "90", + "sequence": "4" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pyw7adsw7we75n9f8lj68t8g8uu5ap462gsev0", + "pub_key": null, + "account_number": "23", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aim1rQmBV+9PddT+Yog4L7M+8GVgxsj009VYb7DZ9bOt" + }, + "account_number": "207", + "sequence": "320" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1p2l7z3v8hzjlhhwxccylngntlft2mas7m73ksp", + "pub_key": null, + "account_number": "60", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8glahgf", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A1DL7IEbxZs2Q7c6EgHbhP4on82YQNU8s9T8jd6JVcTX" + }, + "account_number": "9", + "sequence": "4" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pd4rlrgxv0052ztzqn47zdjjv57weesseynjj9", + "pub_key": null, + "account_number": "97", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pjllxlnudvg8kryu4ph0lkm4qpfkyrj52kmsax", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A0IF4vB/gjSQ9QW5vLaZDFgNG6MRx8vhVNAsQTHEibYV" + }, + "account_number": "291", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ao4f2QD/UvZjsNbFaZuBNdmOwmJtE8n/fPxGOlqTV0Z5" + }, + "account_number": "161", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "pub_key": null, + "account_number": "202", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pafnpv3cthf8k0qf7n2hy9qxzdp3rawzw8e52k", + "pub_key": null, + "account_number": "24", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AsT0rFy8nF8pxEP2hBYh0IDP+ax2ZWukim0JuGAJ2uuo" + }, + "account_number": "6", + "sequence": "8" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "ArNqVOCtsYwgqN5qB5amtcoKJdjARFkgBSaL7N+qKbe+" + }, + "account_number": "249", + "sequence": "10" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1p78j993d6axd0h5zw5lf5wau8gyaqm852g8rlp", + "pub_key": null, + "account_number": "132", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1zf88msk4xmsm7aywgsu33cx2tjnuez469l2xn2", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Alr+lOSVEhpfpdqACeffd6Om5Zk3DmODudq2Ldg8C1Ej" + }, + "account_number": "289", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1z2rz88fddw3gpmwmn5kesrncnsqyyfcm0520d2", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2MpqnHI5/9CGwWD0aPlEafvnnyDL1HX2YSGDFd/gimT" + }, + "account_number": "258", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ztmxdfzsdktnc5kvf4wkng8njqffnctv972ls5", + "pub_key": null, + "account_number": "21", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AyDrbm+wgyAyozzOBCK8lLqWbWlE9Lgt6pxvV2w7bYTk" + }, + "account_number": "172", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AlD3lnWP8FjJO+oa/yiN7XZR0UxG4MvaYPdGzPamIMe+" + }, + "account_number": "129", + "sequence": "34" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "At72Z2oteXli/4m4mWGHcdUBT+ncQpMrH9odnlRiXsgZ" + }, + "account_number": "268", + "sequence": "22" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1zjnj0rwshc4zk6sgz2nr5nhffxemvw8x57g2f5", + "pub_key": null, + "account_number": "150", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1zntz0yadlajjqng5ywzcxdtfc3y3w9mj7h52kq", + "pub_key": null, + "account_number": "51", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1zea7vyt3u7mqf7ehh7yqh6rj8c4g50aeycux49", + "pub_key": null, + "account_number": "54", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A5Ht++7yEW3LoFcgUaeTTIPVoNPNxtNWfdn0E7AdnqXP" + }, + "account_number": "115", + "sequence": "50" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AkzjeVPPtsuVbNLdK+HgjgFr3Fv/1XLzCQqyzmcFfE2b" + }, + "account_number": "110", + "sequence": "8" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AnCGAzu91se4J3li+bJVnaeSHR527MRBTEuJHmYrUp6H" + }, + "account_number": "283", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AhdLIS7toKVOlQqpyi2l2XP/3ZiKc1EZ6aKKB5NDvVV5" + }, + "account_number": "248", + "sequence": "25" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1rt4m2fpsamgcsguzcyvc7xny6fj93j0za79jf5", + "pub_key": null, + "account_number": "257", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AjQnah5fv6RF/rYY9iVVuceiFsUD13Dl7tsakBcW0vjV" + }, + "account_number": "105", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1r4crkrsn6mxjncj54hagnfl65ef4hw08yvy975", + "pub_key": null, + "account_number": "26", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1rkqwwwlsu3rxds5gehu9j5lu6jtvlmc2pcmw5n", + "pub_key": null, + "account_number": "14", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A6KnlxoaR16hGOaSIPGVlbhF8zoonbNWDILBAda1RkiM" + }, + "account_number": "142", + "sequence": "4" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AthxXGltGMtT5KvPvnKFiW1IkFIco+DGGraf5tOxiOw8" + }, + "account_number": "277", + "sequence": "15" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aq6ifhkWTnz+aXdx1S0u8zzXAyElnzMb4COTHpZvgl9r" + }, + "account_number": "222", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1r7erv25vz24385r0k74234u287rggxc9y5p4td", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ag4KMzoF1xw7mXrrvF3gk+H02p0BZnXIZI0WdiD25ARX" + }, + "account_number": "235", + "sequence": "6" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1rl9p3ectaj6pxmnfcs3pu3v4q4hy9y55edj9qm", + "pub_key": null, + "account_number": "87", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1yp9ldvklkrjum504jguh8j67kesnx7k6ajce8k", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "ArbmE0MvPEwoPDLvr8NZBncENk4O1EVXoQ1ij/1pQu4W" + }, + "account_number": "247", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AntSCyIVDWHWdcu0TVWmySJxN825UtcPlYTfRRNGpjhr" + }, + "account_number": "116", + "sequence": "18" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1y22wald653cfzy4v6uk8w5e4kha2eukhh728xv", + "pub_key": null, + "account_number": "86", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AzR06IoRGK9CfnOJy04yMWTuCPkX+i3eI+44GBmUbFJ5" + }, + "account_number": "34", + "sequence": "16" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A+TG6Mg0d21nycjoydiltDLA9Mf+32rIBnqibmVdq1vg" + }, + "account_number": "271", + "sequence": "28" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A4eta89CHYyAxwc6GSd+Jtv0SMCxIar0PbI/HrTV8RXS" + }, + "account_number": "230", + "sequence": "9" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AnL1mZ4eg5BOaP/9ZVQcTQ4+277sL9tkGZdNajE1eUnH" + }, + "account_number": "126", + "sequence": "27" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1yjzrfs6wprg8k065fs6qx6r35cqumdl69ytwhz", + "pub_key": null, + "account_number": "53", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1yjsatwl8k6jan9newlwqya8z06hwkgh05w0w39", + "pub_key": null, + "account_number": "57", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A5PF8VwFPk+08RFEgUzItyf+Qqzsz8UntnRf4Ab/sA5i" + }, + "account_number": "285", + "sequence": "14" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1y7a3knerah596djfa7m0jldv6k0nad5msrgk80", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AyYT5qVfX8tMWNeEo1VKfS6C/05mcooNmKPRGLWdrCvr" + }, + "account_number": "38", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19z6unptm8pyl0yt0y7c4vzuj2q2wkekk22h0kg", + "pub_key": null, + "account_number": "27", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19zaqeqk64w4qay5l5gztuv957cs686xkq96lnh", + "pub_key": null, + "account_number": "217", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19rl923wwl9erhq6n2eeh6stqfuuwmfvmwrcu24", + "pub_key": null, + "account_number": "147", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AqvaSmtT6hx4ssRiQDhYN1gpAs1IsnVBSz2r+r4d0bIX" + }, + "account_number": "108", + "sequence": "5" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger192cg6txf8kwnkaat9mmuuc4ynn74yfa22p2mmv", + "pub_key": null, + "account_number": "158", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aiu5gGRJB6kSPsVJlN8MdD8tEn2yZ4TXfi5yY4tbgPIi" + }, + "account_number": "203", + "sequence": "198" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AxIRo/ib79ig/85lpC82zN70dpvEEFLyiXgMfVkwQmzZ" + }, + "account_number": "241", + "sequence": "38" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Avde6F1LeW1dn/T+lVPRjZiDbQzQK+cwWzdW1B8Tn/zv" + }, + "account_number": "118", + "sequence": "103" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Apo8D9zi/zQz3N83zkwD1u6OMibVhBvnulkKW8EthtqC" + }, + "account_number": "180", + "sequence": "105" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19cgvyj0eyq78c8yc0v9nl7aysun8s6vqde797f", + "pub_key": null, + "account_number": "144", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19ecf5vhnyq0m3dq2ewgh4d7qa00qkqe9ylyx9m", + "pub_key": null, + "account_number": "44", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AxCHmKRqoClbWK7RBzJSx2hlbL+X/qUDxaKO5g2Uk+fx" + }, + "account_number": "65", + "sequence": "8" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A11uymiBPIDSJVE6r3StLjm7l4O5c8G+VyVpMwfJD1vb" + }, + "account_number": "267", + "sequence": "11" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Av66ZbymXG+Sg+uX9LnUn3R1StvQQ/0nzoXHM0kHvKkM" + }, + "account_number": "197", + "sequence": "34" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19ac3d6cwqwpzvaxr4xv9kfduwtyswad88fjgw4", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AhHiWeeVdDKFCNiqikQhNmaXerfXmZV0Uz0xnRxg2sOx" + }, + "account_number": "3", + "sequence": "165" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A05UjD1PcyJxG4P3+Dw8FOXHapdFRNRjtEEkSBUDj1v4" + }, + "account_number": "91", + "sequence": "9" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1xz665w3an5ervxnh8j9yfd3uusdhxtj9yyu7cy", + "pub_key": null, + "account_number": "138", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1xxjusktxrw6uf9wz9p22wa8pdn8qe2p7yz4hu6", + "pub_key": null, + "account_number": "145", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1x2ymylwng5qced6qc3ff0xwjmcv7hwl2h2rfc6", + "pub_key": null, + "account_number": "276", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Av/6LlLc0BWPT4OV6Zpb5bana7F3le5DUyY20PFNxh3y" + }, + "account_number": "67", + "sequence": "58" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1xd6sl2g0qr9rttnynvrlkl6ua0jh3ktwe8m064", + "pub_key": null, + "account_number": "63", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1xw6yscwhhtrn5yj5h5g3fe9yd62xgw5m3lj5pu", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AgfSdGEdYSI2rCy/jKAiVj4xaACUJ4C0YnVmV49O4iqp" + }, + "account_number": "31", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AvSV4aXV3JVT+EYjmlVtqPTJw4KmimofOrf3C+z+LVGU" + }, + "account_number": "174", + "sequence": "20" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1x68t235755ysh23fcetk6zqxqmkqnntttjttzm", + "pub_key": null, + "account_number": "130", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AyPvA/K8lqezLNtmpNV8W7DrDSUacPi86HPA7FMZU99P" + }, + "account_number": "265", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A4TCi6vUR8SFUdq6IiP6d7lfEt7wpucyHkCQseq/box7" + }, + "account_number": "66", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18xwztyus5aynnndlwk9qagqhxunvver8ahdr69", + "pub_key": null, + "account_number": "75", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18g8x9censnr3k2y7x6vwntlhvz254ym4qflcak", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A06RdrMQXeVZxCR17ABNVGJf3NRYxUeUrKExqulZBRfy" + }, + "account_number": "5", + "sequence": "570" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18tprakt5zqtkg74c8dlw324jsxn3fsjqyxe4vv", + "pub_key": null, + "account_number": "151", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18w6wwqwtjg8j33ap8g9tnkyz0jmj0ep2u9v45x", + "pub_key": null, + "account_number": "18", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AvJW7uIqVtQOPXqRTiCohNRlNYY+QmLk0tOfh1zY8cdP" + }, + "account_number": "131", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18ncqa238qk0xxpgq5v9yz88p79r0mc3tt0yyvx", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Awn49C9XpX2yswa7ueJn94S/tav04fuFRwH3+JjGN/VH" + }, + "account_number": "256", + "sequence": "6" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1853wc35m4xugd0kddq9mwx9rjy8hxjz06jflgz", + "pub_key": null, + "account_number": "278", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger185ck7q8ra2cyxkdjn4gjrt2gpjqck9zwv2cytt", + "pub_key": null, + "account_number": "215", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18ewz9t8t9afycwgxrdphmlef0fw04emtdf0ug0", + "pub_key": null, + "account_number": "112", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18mteejsyfxpytwqvurslmpy8nsxv39c7tfykh7", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "ArJ6HRK4u4K/wmcN2J9SZ/CkCbxEgXqmT1JC2VcTbtH2" + }, + "account_number": "221", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18m4le7qrrhguj5vvfzpejsvrsjzyt46cy40t6m", + "pub_key": null, + "account_number": "165", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger18aqza5jx3sd39uv7stkqyqmaf596sjvc3sztvm", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A7TUtilC8OiM7sXgkAmvKRaO0Xe76TQkknO31ltPpsfj" + }, + "account_number": "273", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1gzqqfjc4s5hvpgvr24n8u40alhyqcz082ea40v", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A8KFErPFFvJ1xtL+nVegSa5sSA/Q6BVZ/MVlw+v06Hc7" + }, + "account_number": "169", + "sequence": "5" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1g8qyarrgspm6x2yx9ef03z4qdaut04fsflsure", + "pub_key": null, + "account_number": "261", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1gd27ny9wr7m3ych0m603j3je5u6ratp0w387zu", + "pub_key": null, + "account_number": "78", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1gs84e895y405ckl9kt07htq7tww3yvjfy879l0", + "pub_key": null, + "account_number": "101", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A8o3etPhgj1gaHmy+Fw+WqfPrfVvpPSvNirztawmLgAO" + }, + "account_number": "183", + "sequence": "33" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A1MQT2muu15QTa8NCOnZJEnHxyVB5utOfoPFO7L88aCc" + }, + "account_number": "186", + "sequence": "30" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ghrpxfgfy0kdnas8lsr9wjq3q0hg0m3cs3n8n8", + "pub_key": null, + "account_number": "198", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1getquqpealnsjxw2acqmcekc6l2uqwtp0q83sj", + "pub_key": null, + "account_number": "121", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ga53dlwdq234fwq3eaylpee5g7lve6v5xwtphh", + "pub_key": null, + "account_number": "210", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AjxHxSTSoGTUO6Ef8ENA/GRP+pcIaPEpktCrkdJjL+Ve" + }, + "account_number": "225", + "sequence": "20" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fpcsqt6dzjw7g79arh2x5vdehseq09jul7s4cs", + "pub_key": null, + "account_number": "50", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AvU6J3nt+pMLRVyGKVzxdBEDKoPBke8WPJwwZyNAwsbY" + }, + "account_number": "254", + "sequence": "22" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ff554s7rcwxn943kwc9qyzj6pcgp6jetpceh5e", + "pub_key": null, + "account_number": "123", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A1VebuyvNHx0hXS++cOhaHEb98KttTkdhTY1Tg8/txH7" + }, + "account_number": "30", + "sequence": "58" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fs3vakvwz3hepyls3z3xwkxs49n97576eaxjzh", + "pub_key": null, + "account_number": "134", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A/K4ikCIqE8hIdOLCRhfYH2+SvIiepgJjUON6k9uxu46" + }, + "account_number": "175", + "sequence": "252" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fckwx6zpqa5pn0vcvtfjnnfemhvz2wlnv3ek2e", + "pub_key": null, + "account_number": "122", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fmh57s94nhgu2c8j2y89w4gzqw29wtx9cxrwjj", + "pub_key": null, + "account_number": "19", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fuef677js5cn76k0tdjtrdw9mu3zc8rxtk3prg", + "pub_key": null, + "account_number": "159", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fav80hwfuz3yvjmzfwfrldjlvshu9zauyl4383", + "pub_key": null, + "account_number": "62", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aj/Fv/frYb8LFLhqRGnGZTc9Kp5Fggh/lzWv/R85kwfn" + }, + "account_number": "162", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1f75eqhu2ml0kavmc3y57037sa853tcq8ve8ylm", + "pub_key": null, + "account_number": "71", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.ModuleAccount", + "base_account": { + "address": "shareledger1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3dltkcu", + "pub_key": null, + "account_number": "1", + "sequence": "0" + }, + "name": "bonded_tokens_pool", + "permissions": [ + "burner", + "staking" + ] + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AxRLU+gjYtZK86crMd7H1b3YN/+zN5fhCtNnYZVuURF2" + }, + "account_number": "199", + "sequence": "34" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger12p5y8ngc8y46cl6ygn8c52q9f0wqc0egq5yh0m", + "pub_key": null, + "account_number": "84", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger12pcp7u9nq8x6u0vwrufc8l9j48mvl8qf9a0rwj", + "pub_key": null, + "account_number": "107", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger12fzf5k44968mej0h4fl8r65zv3gsz9zrz0x2ug", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ar+3+3FGWxgNq9IDSfRsrd+j1YeVrvogVrLdo/wGz7wC" + }, + "account_number": "189", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger12fem5mf5t32vpcdnvr683dgsp4sjkhcg5fwa5v", + "pub_key": null, + "account_number": "188", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A519vPtfMvw4MDerSKH0gZ7e0w5Ydi4p1fKKd079NZE2" + }, + "account_number": "219", + "sequence": "49" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger12n66z8kgfpc9ymg70fjzpkfusdhzy84wcmralq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AlcYIfA3yyfnp/jVeISODH4ZLzq9UJeDpKgVgN3uYLNa" + }, + "account_number": "262", + "sequence": "38" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger12hlzse63r0fq8rem34s2fwdgxzskdlewm4dps6", + "pub_key": null, + "account_number": "155", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Au33h/LZByKaFEwoM9+P4Qa1fdxq88d5ERiAEaaaizjf" + }, + "account_number": "124", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.ModuleAccount", + "base_account": { + "address": "shareledger1tygms3xhhs3yv487phx3dw4a95jn7t7lelh8wg", + "pub_key": null, + "account_number": "2", + "sequence": "0" + }, + "name": "not_bonded_tokens_pool", + "permissions": [ + "burner", + "staking" + ] + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1tgjjeh29yzj750s9lxv28ne8c8h9cu756hn2m5", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ayub/qSa6l5F3odVwoyw7TJJUik09wTEMX1F9dgmxfry" + }, + "account_number": "297", + "sequence": "14" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1tvxdr4jla4ezxq6m0769pawhlqtjdpeaygynqq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A/3zIWfyzc0kPWYVBWWLZgksya+yEp2mL+xtNcpzquP5" + }, + "account_number": "282", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1th0wdefvlyprm9mmyn43jvxcgrfak525ltyvef", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A1qSmD9ERKMNbt1kYO1fobKR1r8+RnR8PHvvKJKFvhGZ" + }, + "account_number": "270", + "sequence": "12" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A8HgrGNnNItBwpUcS+I25P+eNEKYinEKzxjr8tx+cLya" + }, + "account_number": "11", + "sequence": "5436" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1t6w63shshwhhgs4tn39evacahxjja9jck4lsmf", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Anz8S1g4YmhQ5q5b66b2nDj7ItxldXxc2dJP1aizN8by" + }, + "account_number": "35", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1tmu23emqexze7drpuh37st83sx97v3jq7vv3hv", + "pub_key": null, + "account_number": "40", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1tl8uh5fumtz5mpru045nyj9rx62emqgymvwsqy", + "pub_key": null, + "account_number": "46", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AlE0ilU37GT9s99UY+obwkVuOZmenH1AenZ8Dp91qu1k" + }, + "account_number": "281", + "sequence": "39" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AxVVTsfP1mzV93eFp1Q6h3hNF3wCGQFiEZpmiSt0jZAz" + }, + "account_number": "81", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AurqfIKdM4oi5+BsTdgg2Zv3btFCgWqH4mGZ0Bausd5M" + }, + "account_number": "37", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A6RZEqDUj6Crg0RamJR9PwkiFuZr9VwENCl7LbV8xUyD" + }, + "account_number": "242", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vs6s007cye9lf5aqjdfsqphuqyv54pmvxphcsg", + "pub_key": null, + "account_number": "213", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AvM580lS0G0nttdNAg1WqK8uhYhYeYWxORQhWDqUq7iX" + }, + "account_number": "181", + "sequence": "17" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vjrqur33scq29s2zmek99rm3yck84rq2dkraxn", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A66/EyaYnJT7P+LTlH2N6wwfhCjRI7smHl+0V5Xy/Pdy" + }, + "account_number": "280", + "sequence": "112" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vjtat7mgaseugvqpg53jwt2pfeplsq9sp6mk7r", + "pub_key": null, + "account_number": "61", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vjj2ufstr4amqr6pp25ywj8y0qaeyd8rc92as9", + "pub_key": null, + "account_number": "243", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vnt0dge8xvhjkns43u3sxt5yt39p8ep657l388", + "pub_key": null, + "account_number": "102", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A9gkndxp5W1aVer3iMOBfJb/I1tgbBwDmYAn7snVz7jn" + }, + "account_number": "260", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vcuh3kvn2rc9ffnhnuhfzn7vge7gjets54fzmp", + "pub_key": null, + "account_number": "272", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1vec7ahlnksvuapex98kjzjmyqx8wvjv4j8z6de", + "pub_key": null, + "account_number": "214", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1v6x0gzr4qcr570syfzmd7xcd2ev5fpyyzsnfl6", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2drYvGtsOwjajFfyMoZr01psMJ8mQGdSYKU6I2mBmM7" + }, + "account_number": "298", + "sequence": "6" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dx8pj8ncxte36hv4ekvmekmk6q7v0q6dr8u22s", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "ArfrjkZsgx+AT2TTBqCTMteYXUJV2E6Rlrr2HmLRTmsR" + }, + "account_number": "290", + "sequence": "10" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dfy2l3rwulkqnkfqay8py630jhg0m605rrq7ke", + "pub_key": null, + "account_number": "139", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dtr5k5sshcegmeuc3lcaszp0ueje3nn0vet5a0", + "pub_key": null, + "account_number": "149", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A0FdRHkDumoXqSEUjEi1ctRKIKABT3mZ+MOonMXPOewo" + }, + "account_number": "114", + "sequence": "81" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AngoWh1jC7yiDmNHWZ8UZ8toInc19bWKtayS04DZ45eg" + }, + "account_number": "92", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AsOWJfSkkGM9b6W1rxaIjooa3+uLLtVU9UeCsS4MWbJu" + }, + "account_number": "229", + "sequence": "71" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AptSUWPgpbkcoeZpyB0dx3Xny5sRhcCwZ1HCEJCREzts" + }, + "account_number": "264", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dkm0l9kjwzv7d5zf02q2dw3ngrkqtgtpkngyvg", + "pub_key": null, + "account_number": "29", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A5CiyQocImPtwpVoHH9UnPm6kYfbq3xlY23AvmtNfT3c" + }, + "account_number": "72", + "sequence": "6" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ah3rzj9uDRljotZqKSP6PZOHNE+I9B3m7bhhj76h0I2q" + }, + "account_number": "69", + "sequence": "4" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1daxr559k3z8yat8utdk20jufu0ypqspkw4y88q", + "pub_key": null, + "account_number": "93", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ahe7lLtkP8lEH36r0EC6oaIkQC0BFVctaWHwJbW7jAzE" + }, + "account_number": "284", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1wyr9mn9qpjlvd6q0wemsj4rzepff79q67yvhdd", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "As0M6vz49hxfMbdeaNjceQUoNRTAMsrV/zovKujhv3Jf" + }, + "account_number": "13", + "sequence": "355" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1wy8vxvwanycjcs5dhq5kuzs6a2ht0qdwmm8d9a", + "pub_key": null, + "account_number": "96", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A0NJSGtgyAP4ifuQILEgb1xjVAFjGhXGslnPwV9tmFJH" + }, + "account_number": "109", + "sequence": "19" + }, + { + "@type": "/cosmos.auth.v1beta1.ModuleAccount", + "base_account": { + "address": "shareledger1wfhcuxxgh9hjs4meagavuj78uak9wfdwcm0exn", + "pub_key": null, + "account_number": "12", + "sequence": "0" + }, + "name": "gentlemint", + "permissions": [ + "minter", + "burner" + ] + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1w2xwhay6h7wp476nxv3kxvfcs2n9sl9h9jshq3", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aj7E7VidVmlJ2A1IIrojjyzZeL7yauOtK8Q/OpFo91tb" + }, + "account_number": "170", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A86lwl3/j7+R43WEyKQUKfkk/hjBvdo3aQk/rQcoEOaV" + }, + "account_number": "77", + "sequence": "11" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1wsdegaxzrd23a5a8zqa88ex3ck8hdzscy53szy", + "pub_key": null, + "account_number": "106", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1w4l5fchs69d9avlgvdehq9ypvdh4xyev3p490g", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aw0WRGeaGo9EvPNTWXz2JQrDET2g57246ReHLBCzeqNH" + }, + "account_number": "8", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1wek0dg5kpfkuxyqsn0yjze6g26awsfegf65pk0", + "pub_key": null, + "account_number": "167", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AusNuuo+G6z5x9aEpxuyk481J2LTjras4Ge8aHg4fKcE" + }, + "account_number": "233", + "sequence": "316" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2pAsFgD597CjyrsNmhJzh9xSdGCZONbSh8r7TCAfKHs" + }, + "account_number": "117", + "sequence": "21" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AqSVNLqNt3hrdMgdwIPR3za3NzDJG5HJMdjubGMnn92w" + }, + "account_number": "192", + "sequence": "22" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AutSj9U3X0YJnhQGdExPnE7LpZe0zqx9kp7/65EoQrjd" + }, + "account_number": "232", + "sequence": "40" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A57+tPuFQk5kvALJ603wLKuh0cOIg4YkZ0llDE021pqq" + }, + "account_number": "36", + "sequence": "17" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ale33s7UQa/mn5LqW+k0jSTpBvCIlC5Li+b8wWYE2W5c" + }, + "account_number": "103", + "sequence": "43" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ap0EVxKSpJ4QE7nvPOe1z1EOgNy1dl6DmodeBUHNXIDa" + }, + "account_number": "244", + "sequence": "94" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10jgl6frhlyg3c0zjvuz7vcgerpz6qp2rlp6eer", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A+2ZiPL/VaD49gJsngUk+TzmQ4+rHK92aueykVgNSUQE" + }, + "account_number": "286", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ayp9fOpEwVHVoCrWorF7uVbz5A5ZsJm9tPxBlD2XPVPw" + }, + "account_number": "218", + "sequence": "5" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A18Ts2ynMz5+QPMQxVu38PrKBOLdNO+lUNWkVsCBYk+D" + }, + "account_number": "205", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A8tpu1dFkC+u8+SSN1v9oYXkfjUBws/ZVFKpxdV53fr6" + }, + "account_number": "68", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1spjurkce2pvzu6r9urlcwcfr88jx8vpqkrvv50", + "pub_key": null, + "account_number": "111", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1sr0u37lws307yakpar48vzwpdale46q38mlyym", + "pub_key": null, + "account_number": "135", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AopRzzSQ7Jj8U0iHXzjXLb/hFWY2qbgOHORyKLY0Vr3c" + }, + "account_number": "228", + "sequence": "48" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2VxrHQNaUq1wzmejIaHjwA6qYNQR1k1pnw4tN5Pl4lk" + }, + "account_number": "246", + "sequence": "42" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "pub_key": null, + "account_number": "236", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1sd9wfkqces7j2pr39ayq4jwvl6key7gr0az9gd", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AkGKMGIczGNWody+UHCJr2+UHBkNTTTtS7JPDcNTKRmi" + }, + "account_number": "263", + "sequence": "39" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2+K7x53w73IMqSQFDvi8mYYp+vsHFuIA0qMH+M4JAuR" + }, + "account_number": "294", + "sequence": "14" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1scdq96hxerv2mkqgdseyxpnpjgygjqcvkk8urc", + "pub_key": null, + "account_number": "166", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger13qrkzy3zq7ny3s6pc4fqze36q6dpc8uev7jq69", + "pub_key": null, + "account_number": "95", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A7ZMbY3SJJ7vLNzqZwkna/zsco0vUYvwJ44Ej/lY8GKr" + }, + "account_number": "74", + "sequence": "50" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AoG2DtPTVTEn5jcRNWWzsOOqwBpDhMfgZ2bU+DoreB0q" + }, + "account_number": "113", + "sequence": "17" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "pub_key": null, + "account_number": "252", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger130zqgsnvtwze8qkwmjwkvpy8jxwz6ny6ssmtck", + "pub_key": null, + "account_number": "98", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger13jvwzmum2s0t8lu8lvpzpxdshet9mk4h0nupyc", + "pub_key": null, + "account_number": "49", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger135guptu3wef6fkxnfatzk2phdf62pk0d3vw4qv", + "pub_key": null, + "account_number": "20", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A78c4NfBpFLsHBBxMz4gZX/L3cObgiVHV/InqlXFMS6Y" + }, + "account_number": "120", + "sequence": "6" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger135k00n2uec225kjecsljc2vep0apwnh5kmyrls", + "pub_key": null, + "account_number": "154", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1jy4jl0j3v3w70pceunlghykj8jc470pufn7sem", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A0MOJTadXZ/PHuPjDD6PYCQOMijh68zmxK/gRDb+HJGC" + }, + "account_number": "41", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A5yixe8CQzFIZqiYzijX/YGO5WP0amA1YRvD5AZ5i5sa" + }, + "account_number": "227", + "sequence": "22" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1j2k0cr7zps880ltz8m2flx922uquk44pzk9zyl", + "pub_key": null, + "account_number": "25", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1jv3chjaq0q6k7md8p89kvxh7u3a35tdsnexmak", + "pub_key": null, + "account_number": "211", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.ModuleAccount", + "base_account": { + "address": "shareledger1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lmx9g5", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + "name": "distribution", + "permissions": [] + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aim4c3F6Hvncj+ZsR8uHCwuWnyCNn+2mmBZb5CBBetc1" + }, + "account_number": "196", + "sequence": "5" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1juufvm9pznmt98pvlslkzs7szw0uz2k7qcgv89", + "pub_key": null, + "account_number": "153", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1nryw8q00f4expchtpgmfn56n2q9slfsfejdn2x", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ak/lTpIKEF2PH0SY0Evra9m+7g3AoY2/mAnwBaq+1IOA" + }, + "account_number": "185", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1n8aepjgjyv4m2nm5hc47yagz7v6stn2uevvdd7", + "pub_key": null, + "account_number": "45", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A/yW+SJR8s539e/8UIsRxkRGfv5BPZowMwBZCL/0HXhw" + }, + "account_number": "28", + "sequence": "9" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1n2s623cxv765vl74an0wsw8lzsh4933hjpl987", + "pub_key": null, + "account_number": "33", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1n3jvwqpagenl36pzampulpfvtc0kts85u83hq5", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AzEp+oBGLX9kRjbPbGDyaT3rwOzb2Rz9nL+m0YhFm+Y8" + }, + "account_number": "184", + "sequence": "95" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1nhgddhdrwxpwc4jdf4prphpwdjmd7g80andunp", + "pub_key": null, + "account_number": "119", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ne90ncftutlsusk3ttu4vu28yr59l4s72pkz2x", + "pub_key": null, + "account_number": "295", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AnmxfAiLmhl2hqXH5ry6vSADh1F+vItKEGOQcaMKF9GP" + }, + "account_number": "70", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1nlc24p5dfcglwjscxdyh6q2rnzwgglqd8ddgm4", + "pub_key": null, + "account_number": "48", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A6efYJxRLjlNT4TlOdSHK82bkbIldLsAXtSR5c+vaoZX" + }, + "account_number": "195", + "sequence": "15" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AqLKO31veNGtJ2KOKKxybsFriGDwi+gKpnzG7vY5wl02" + }, + "account_number": "133", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ax/5kY27vtyL0EnBvMXv4DaK2sDvaFBKxoJYH4pjZTiF" + }, + "account_number": "32", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger15t5h59yd7nsu0lw3u358j62eqd7w6jqcmxnqcx", + "pub_key": null, + "account_number": "17", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger15wzh2ltl4fzge5c9vk59dkshdyee4xh0nxeqkj", + "pub_key": null, + "account_number": "274", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2W8x9lM0t/cfSn/PRzxG7XtFUd/dEooJQJF0oZljQ7g" + }, + "account_number": "171", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AwhTLjqOYrAM/h+ISkw4zvRCIl3YVTIIkDiRQ17LRFR9" + }, + "account_number": "104", + "sequence": "178" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger149gdsgyzrp0nn3zjm48pz7j3dz7mme7j0rtmec", + "pub_key": null, + "account_number": "204", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ak3a7OCIPufScccjN78E4n9L9GYzvh88AK3rn8/3edqA" + }, + "account_number": "179", + "sequence": "14" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14f66vefkax7h64e5j05a2xqjmh9fk8sywmcjsh", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A3w7Kf7qrb4bX2rO+bU9iRfgdwJMOZJMsS0IuLg3VEAB" + }, + "account_number": "299", + "sequence": "10" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A+HGM9bnlW0Jxd8cJnv+DxVw/7wADZdkZm2BaZY1aYQD" + }, + "account_number": "191", + "sequence": "21" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14np3phs56qqv5d4hqcjvsclw0p4wlncafyczf9", + "pub_key": null, + "account_number": "136", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A7DvgitVhAhUh470pnQOKU7EbbikOc27ggWDJV9v/atY" + }, + "account_number": "127", + "sequence": "13" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "At1G8/DgWF3SKSobkQikEqdDPSx7BqUd5NAMp/SRvCDQ" + }, + "account_number": "226", + "sequence": "22" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14m7klg3fcuhvs2j3dwva4vedsqgv8xn7vxqnxn", + "pub_key": null, + "account_number": "140", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger147uh7vsfzfvar2k3wrmaryf5jfag3h77lk9j9s", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AsXcgIM/hlVMUBbuveyL+IidKvahxWR2Pr16EH7kPKkZ" + }, + "account_number": "279", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger14lu2t8vqu2kgy9grvg44az4hekz3339s6xdzmr", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AmuJtNUhLE9RNcI9a0xvR1kvwd641hqcUdSSccD0l4AJ" + }, + "account_number": "200", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1kqnqukkkvfaxhncyxpvtvcv9kgquk3ayrj2nzq", + "pub_key": null, + "account_number": "293", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1krraljy2c3g00pjsmkfqljq38eykra8zyauujv", + "pub_key": null, + "account_number": "58", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1k93kpvs7jhv433g62htax0xdsc8jq848zww4l8", + "pub_key": null, + "account_number": "296", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1k8u5g6xsc96kauenn2gdacrcsdgy9x6sklmjej", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A+jRuoJdVxmx56LWXnwEuCTGKyiHdYMTl6T/WLavNYew" + }, + "account_number": "300", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1kwllfyfv0nfu85n0srk74kr686uasmxwpkxe6s", + "pub_key": null, + "account_number": "146", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1knqh6v2pfwdur4087xhwfsta5d0u4lmg8ms7x2", + "pub_key": null, + "account_number": "206", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2/5HGk6cxMitTLyeufR6AAeBo9KLf1YDoQmzteNLOGZ" + }, + "account_number": "253", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AkybUorzOmH4bVudMbsxhlMJGcq6LLX11g0qWQm9OtkK" + }, + "account_number": "89", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ke8j6a82wq3q5s09h3nrcjflsca492lfagcgpx", + "pub_key": null, + "account_number": "212", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "pub_key": null, + "account_number": "231", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hq9hz2jqv0tf73lxkre867t8cn77t6h4wtvn52", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2C2I1VCenIyypO/LUPn/8Ir5TR7iiyR+LJCq5+XUdiX" + }, + "account_number": "250", + "sequence": "12" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hq7wjjgeymvs3q4vmkvac3dghfsjwvjvf8jdaw", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AsK5jD9HnDqUNfq55S2XofkpwWQbBsxZvkrgQfXNATuA" + }, + "account_number": "4", + "sequence": "280" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hgqnk8r7s95la55wptk6t5xt3pj08kg2xp4lpt", + "pub_key": null, + "account_number": "160", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A1UwbFRhE6XkJtZDtlCfK4KiCF/UNrFflTXc23Mobclt" + }, + "account_number": "194", + "sequence": "5" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1h3g702kksf0zpstu26e55v3m2emrul3hagakca", + "pub_key": null, + "account_number": "156", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hjvm357yhtqkwxdzxgj5pvchpuaqktgx9nzxde", + "pub_key": null, + "account_number": "64", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AimW7KPfRNgpxol5xtQR+Ow2+BCItWvEnubhB2HNKs+Z" + }, + "account_number": "43", + "sequence": "9" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hestt2yt308j8xg95cy3pg80yy7l0n839zg8ak", + "pub_key": null, + "account_number": "187", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1hl0wxra5yh2gaamah693q8pff6tk56tz9zhu0c", + "pub_key": null, + "account_number": "128", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1crm7w5rfpr4zugjvzv0ww6sr06e0qm4c37krq6", + "pub_key": null, + "account_number": "94", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Azzka1sd3pjZ+zjS4dp3Ww8MV7zn3E7vzEURiueHEkjh" + }, + "account_number": "234", + "sequence": "9" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1c3lt0ma5g4f7lr3cxrkvc83cna8xe6f47suysv", + "pub_key": null, + "account_number": "83", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A9O1wArHOX7YsZBPDsjSsjrpWKI2ROQ6hwCYMru3T5Py" + }, + "account_number": "88", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ck68efgryp7lkwj0kjph2gzjqkwcdlm52xkked", + "pub_key": null, + "account_number": "100", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ch5rvu4267humyc8r9czfqrchyr9843ehjkeu4", + "pub_key": null, + "account_number": "157", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aq7XG443vxdkIwKmT258jwiwYPTqhROEwaN5W6qvCEGJ" + }, + "account_number": "224", + "sequence": "35" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Askz8MMPiBahiz/9lDoMU3hFxZrCkv3Z6bOC3HCnXmCI" + }, + "account_number": "193", + "sequence": "16" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "pub_key": null, + "account_number": "269", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1exegsv7386eayfg75xtkd3j5vjc2szkz4s0t4v", + "pub_key": null, + "account_number": "55", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ewy9qcptaaaknewp8445yft9rgyupjdntu3uea", + "pub_key": null, + "account_number": "137", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aga88wRF3jSnP2MVgApeCHdSbzsKCLaoC72WjB7L7K96" + }, + "account_number": "73", + "sequence": "21" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1e5xaqefpv6tt2eh5uxv5p8ersap5q6rmtwylme", + "pub_key": null, + "account_number": "59", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "pub_key": null, + "account_number": "176", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AooO1OQByzIJUmCyrRAFh5c0VkQvEDPHSfAwUdFhiJsy" + }, + "account_number": "245", + "sequence": "155" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1605e3ry6c936n3slp7rvx6gaf3048kl95nc3px", + "pub_key": null, + "account_number": "240", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger16sd6a3qfwpum63yed9c7fcmx9tjq03haglvxnf", + "pub_key": null, + "account_number": "164", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AwZiOA2Bz07jdTexbTEsuCJMce4W481och2CJlo2ANG3" + }, + "account_number": "216", + "sequence": "14" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger16cf5ndlhqlzqazth7x246a97e5uf5lcur52nwu", + "pub_key": null, + "account_number": "182", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger16e03pe7y0x2hgyhfgudadr9pkj2pdh6n98kmth", + "pub_key": null, + "account_number": "85", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger167cp5dnfqahvqpz6aj5rcgwqd0jufxys6drk4e", + "pub_key": null, + "account_number": "152", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1mrzhzf0v9cz00rwgyxcdwrl6s7n7plgdur4z74", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AojBKOrMHGUTHAlBrnfrAD5PJSnzjaFH3hIcpqpRq7vL" + }, + "account_number": "275", + "sequence": "10" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ap5VV/5an33PRigf8NIO/FfquE1BRyz/CDMJ1SPUCC2c" + }, + "account_number": "208", + "sequence": "116" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "At0SNm+KxRT3zdybBI0SriP8TDBNviPgmI4LoFbbCGXL" + }, + "account_number": "80", + "sequence": "11" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "pub_key": null, + "account_number": "238", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1m55e66s5fgc8kg23uz9sg9jfg06n53t3jprd2e", + "pub_key": null, + "account_number": "209", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1mcfr42ll89dwlck77es57ghgmkea2vpdgwats4", + "pub_key": null, + "account_number": "52", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1meczxtde40f7znlx0vzewuhxnux3p5y2336d34", + "pub_key": null, + "account_number": "141", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9w7z28p", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AhIDgJz2q6Zw0G4B4el6MWIoqSXMUWpHZyHHXHFXZ8B4" + }, + "account_number": "7", + "sequence": "6" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1uqlue2e7lrr8j4dyxkcrf6nuq684utlgrv5ehm", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AmfRSymDbNb5NyMFzeH5h2ISKyqa8KCP6yEoeVhfElHN" + }, + "account_number": "201", + "sequence": "365" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AlupszOFkEpr+cVKr68u6E7UCrToIwj9qAt4sV/oF0aH" + }, + "account_number": "287", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1uty2sj65rdj88gzheq0jufg0dww96elf0ph25k", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A01yFfidM57LWiYitm4LMXibl95WzCl+aqIe0HFb6o5J" + }, + "account_number": "39", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1uv2hqjc0y6m278fmcl3kll9e42z79ardtzta3e", + "pub_key": null, + "account_number": "148", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1uvtd62mjlrwxxpcydnxlnsag55a3ucxgv8zjqw", + "pub_key": null, + "account_number": "237", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1uvjkdax474zn9ejyvy7zy4ntlwcay6hfjflw8h", + "pub_key": null, + "account_number": "16", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Alq9yG7IpmcwIkd+gSELCZcW+4B1TUJ76t+S1rEzNKvx" + }, + "account_number": "266", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1uu8f9gkn9699fryp0axa02wjnl2ldzwkzvsa49", + "pub_key": null, + "account_number": "79", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ulmfvmxqu3wwnpw4vv7fndlpn926evzg64crp9", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A+LPoDmoMphL746L+Web4bzDz8nQ9eC41hKSUDDIEqQ5" + }, + "account_number": "255", + "sequence": "3" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1arl2drkh9qmugjfg6k7k4zl9axfv7vf07n09t5", + "pub_key": null, + "account_number": "47", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "pub_key": null, + "account_number": "177", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "pub_key": null, + "account_number": "168", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ac0d494dpkvla5ptvwmmhvz4e3kqj90q5qsr65", + "pub_key": null, + "account_number": "56", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A+mVFJVXy9sD2+01gNFLre9U+ZvbnEWnyKnwxjIoGq1A" + }, + "account_number": "125", + "sequence": "4" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1al85nhdmwheeg9m423gsvhvz6f5uapnwjz7vdy", + "pub_key": null, + "account_number": "22", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.ModuleAccount", + "base_account": { + "address": "shareledger17xpfvakm2amg962yls6f84z3kell8c5lgape2k", + "pub_key": null, + "account_number": "10", + "sequence": "0" + }, + "name": "fee_collector", + "permissions": [] + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger17vwl5v7tgf7lt4335gvmdakfk9ln8xlsz5d48s", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A76ExychNZSCQFWq4UzVl0oyMA8GzgfJZW+X8VvyabKq" + }, + "account_number": "239", + "sequence": "2" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1709s6z0y49t0skaw6hh9zqqdp6kfetld2rjqeg", + "pub_key": null, + "account_number": "173", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aqx70DDj1nZeMSj5sAxnd2FAbhMlHicr1Jy82YWKtcJT" + }, + "account_number": "42", + "sequence": "7" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Ap3bTfWZd8i2yQzHS7Qpc71qvLpYBBRYoyl39beeIupu" + }, + "account_number": "220", + "sequence": "19" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1lyaxm55v0gl4rwhkrxwvvkheujqxqa6sae4a74", + "pub_key": null, + "account_number": "259", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Aqq/1IVyFeZI0jMwwL/nsb6ySyEeLypIFBHUqa52Tl9w" + }, + "account_number": "82", + "sequence": "14" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1lwy88a82r48ng9xcl4egv332vygr2ud3352324", + "pub_key": null, + "account_number": "178", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Asj1npd5IpmpHmkeIN9gV1PUduGbATwPean8rSpazh0o" + }, + "account_number": "163", + "sequence": "1" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "pub_key": null, + "account_number": "190", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1legze0xkv764j0xr7hu9pv0n66y02702jmcyf8", + "pub_key": null, + "account_number": "251", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A6ZyKkvUgm8eYdcpV6OLzfnSTZ+vsr8LnH0hno84M/oS" + }, + "account_number": "288", + "sequence": "15" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "Atb4mDC6iY49FL76cU/9L07yZxNUqBGu8ZMf/wtU9zIv" + }, + "account_number": "76", + "sequence": "19" + } + ] + }, + "bank": { + "params": { + "send_enabled": [], + "default_send_enabled": true + }, + "balances": [ + { + "address": "shareledger1qq86x7fh579vt9d93r7dyunmsvd8njgzf8vc92", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger1qs9xq7xk753qq47qan40sa5wedtqf77vmf07qv", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1qeevhzxzvgjfe4vvug6thhtevq2tv5zg4syakv", + "coins": [ + { + "denom": "nshr", + "amount": "200000000000000" + } + ] + }, + { + "address": "shareledger1qa754x52l7zdgau9whfxly2x7nx5ppeua9438t", + "coins": [ + { + "denom": "nshr", + "amount": "264242000000000" + } + ] + }, + { + "address": "shareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "coins": [ + { + "denom": "nshr", + "amount": "956000000000" + } + ] + }, + { + "address": "shareledger1pyw7adsw7we75n9f8lj68t8g8uu5ap462gsev0", + "coins": [ + { + "denom": "nshr", + "amount": "60000000000" + } + ] + }, + { + "address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "coins": [ + { + "denom": "nshr", + "amount": "1727230000000000" + } + ] + }, + { + "address": "shareledger1p2l7z3v8hzjlhhwxccylngntlft2mas7m73ksp", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000" + } + ] + }, + { + "address": "shareledger1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8glahgf", + "coins": [ + { + "denom": "nshr", + "amount": "97000000000" + } + ] + }, + { + "address": "shareledger1pd4rlrgxv0052ztzqn47zdjjv57weesseynjj9", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1pjllxlnudvg8kryu4ph0lkm4qpfkyrj52kmsax", + "coins": [ + { + "denom": "nshr", + "amount": "41995000000000" + } + ] + }, + { + "address": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "coins": [ + { + "denom": "nshr", + "amount": "98000000000" + } + ] + }, + { + "address": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "coins": [ + { + "denom": "nshr", + "amount": "50200000000000" + } + ] + }, + { + "address": "shareledger1pafnpv3cthf8k0qf7n2hy9qxzdp3rawzw8e52k", + "coins": [ + { + "denom": "nshr", + "amount": "60000000000" + } + ] + }, + { + "address": "shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + "coins": [ + { + "denom": "nshr", + "amount": "93000000000" + } + ] + }, + { + "address": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "coins": [ + { + "denom": "nshr", + "amount": "128743000000000" + } + ] + }, + { + "address": "shareledger1p78j993d6axd0h5zw5lf5wau8gyaqm852g8rlp", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1zf88msk4xmsm7aywgsu33cx2tjnuez469l2xn2", + "coins": [ + { + "denom": "cent", + "amount": "8001" + } + ] + }, + { + "address": "shareledger1z2rz88fddw3gpmwmn5kesrncnsqyyfcm0520d2", + "coins": [] + }, + { + "address": "shareledger1ztmxdfzsdktnc5kvf4wkng8njqffnctv972ls5", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "coins": [ + { + "denom": "cent", + "amount": "4662146" + } + ] + }, + { + "address": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "coins": [ + { + "denom": "nshr", + "amount": "50000000000" + } + ] + }, + { + "address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "coins": [] + }, + { + "address": "shareledger1zjnj0rwshc4zk6sgz2nr5nhffxemvw8x57g2f5", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1zntz0yadlajjqng5ywzcxdtfc3y3w9mj7h52kq", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1zea7vyt3u7mqf7ehh7yqh6rj8c4g50aeycux49", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "coins": [ + { + "denom": "nshr", + "amount": "1034000000000" + } + ] + }, + { + "address": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "coins": [ + { + "denom": "nshr", + "amount": "92000000000" + } + ] + }, + { + "address": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "coins": [ + { + "denom": "nshr", + "amount": "5000223000000000" + } + ] + }, + { + "address": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "coins": [ + { + "denom": "nshr", + "amount": "75000000000" + } + ] + }, + { + "address": "shareledger1rt4m2fpsamgcsguzcyvc7xny6fj93j0za79jf5", + "coins": [ + { + "denom": "nshr", + "amount": "9813000000000" + } + ] + }, + { + "address": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "coins": [ + { + "denom": "nshr", + "amount": "7478000000000" + } + ] + }, + { + "address": "shareledger1r4crkrsn6mxjncj54hagnfl65ef4hw08yvy975", + "coins": [ + { + "denom": "nshr", + "amount": "60000000000" + } + ] + }, + { + "address": "shareledger1rkqwwwlsu3rxds5gehu9j5lu6jtvlmc2pcmw5n", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "coins": [ + { + "denom": "nshr", + "amount": "96000000000" + } + ] + }, + { + "address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "coins": [ + { + "denom": "nshr", + "amount": "49662000000000" + } + ] + }, + { + "address": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "coins": [ + { + "denom": "nshr", + "amount": "154791000000000" + } + ] + }, + { + "address": "shareledger1r7erv25vz24385r0k74234u287rggxc9y5p4td", + "coins": [ + { + "denom": "cent", + "amount": "30489" + }, + { + "denom": "nshr", + "amount": "7000000000" + } + ] + }, + { + "address": "shareledger1rl9p3ectaj6pxmnfcs3pu3v4q4hy9y55edj9qm", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1yp9ldvklkrjum504jguh8j67kesnx7k6ajce8k", + "coins": [ + { + "denom": "nshr", + "amount": "6923000000000" + } + ] + }, + { + "address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "coins": [ + { + "denom": "cent", + "amount": "414388" + }, + { + "denom": "nshr", + "amount": "63242000000000" + } + ] + }, + { + "address": "shareledger1y22wald653cfzy4v6uk8w5e4kha2eukhh728xv", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "coins": [ + { + "denom": "nshr", + "amount": "204000000000" + } + ] + }, + { + "address": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "coins": [ + { + "denom": "nshr", + "amount": "72000000000" + } + ] + }, + { + "address": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "coins": [ + { + "denom": "nshr", + "amount": "130130000000000" + } + ] + }, + { + "address": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "coins": [ + { + "denom": "nshr", + "amount": "41000000000" + } + ] + }, + { + "address": "shareledger1yjzrfs6wprg8k065fs6qx6r35cqumdl69ytwhz", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1yjsatwl8k6jan9newlwqya8z06hwkgh05w0w39", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "coins": [ + { + "denom": "nshr", + "amount": "1252000000000" + } + ] + }, + { + "address": "shareledger1y7a3knerah596djfa7m0jldv6k0nad5msrgk80", + "coins": [ + { + "denom": "nshr", + "amount": "218000000000" + } + ] + }, + { + "address": "shareledger19z6unptm8pyl0yt0y7c4vzuj2q2wkekk22h0kg", + "coins": [ + { + "denom": "nshr", + "amount": "60000000000" + } + ] + }, + { + "address": "shareledger19zaqeqk64w4qay5l5gztuv957cs686xkq96lnh", + "coins": [ + { + "denom": "nshr", + "amount": "225889000000000" + } + ] + }, + { + "address": "shareledger19rl923wwl9erhq6n2eeh6stqfuuwmfvmwrcu24", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "coins": [ + { + "denom": "nshr", + "amount": "95000000000" + } + ] + }, + { + "address": "shareledger192cg6txf8kwnkaat9mmuuc4ynn74yfa22p2mmv", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "coins": [ + { + "denom": "nshr", + "amount": "25726146000000000" + } + ] + }, + { + "address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "coins": [ + { + "denom": "nshr", + "amount": "90000000000" + } + ] + }, + { + "address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "coins": [ + { + "denom": "nshr", + "amount": "119954000000000" + } + ] + }, + { + "address": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "coins": [ + { + "denom": "nshr", + "amount": "79000000000" + } + ] + }, + { + "address": "shareledger19cgvyj0eyq78c8yc0v9nl7aysun8s6vqde797f", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger19ecf5vhnyq0m3dq2ewgh4d7qa00qkqe9ylyx9m", + "coins": [ + { + "denom": "nshr", + "amount": "1121000000000" + } + ] + }, + { + "address": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "coins": [ + { + "denom": "nshr", + "amount": "2049808000000000" + } + ] + }, + { + "address": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "coins": [ + { + "denom": "nshr", + "amount": "62000000000" + } + ] + }, + { + "address": "shareledger19ac3d6cwqwpzvaxr4xv9kfduwtyswad88fjgw4", + "coins": [ + { + "denom": "nshr", + "amount": "10322000000000" + } + ] + }, + { + "address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "coins": [ + { + "denom": "nshr", + "amount": "2187000000000" + } + ] + }, + { + "address": "shareledger1xz665w3an5ervxnh8j9yfd3uusdhxtj9yyu7cy", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1xxjusktxrw6uf9wz9p22wa8pdn8qe2p7yz4hu6", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1x2ymylwng5qced6qc3ff0xwjmcv7hwl2h2rfc6", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "coins": [ + { + "denom": "nshr", + "amount": "92000000000" + } + ] + }, + { + "address": "shareledger1xd6sl2g0qr9rttnynvrlkl6ua0jh3ktwe8m064", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000" + } + ] + }, + { + "address": "shareledger1xw6yscwhhtrn5yj5h5g3fe9yd62xgw5m3lj5pu", + "coins": [ + { + "denom": "nshr", + "amount": "39000000000" + } + ] + }, + { + "address": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "coins": [ + { + "denom": "cent", + "amount": "100001300" + }, + { + "denom": "nshr", + "amount": "986000000000" + } + ] + }, + { + "address": "shareledger1x68t235755ysh23fcetk6zqxqmkqnntttjttzm", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "coins": [ + { + "denom": "nshr", + "amount": "21400000000000" + } + ] + }, + { + "address": "shareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "coins": [ + { + "denom": "nshr", + "amount": "9000000000" + } + ] + }, + { + "address": "shareledger18xwztyus5aynnndlwk9qagqhxunvver8ahdr69", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger18g8x9censnr3k2y7x6vwntlhvz254ym4qflcak", + "coins": [ + { + "denom": "nshr", + "amount": "99302000000000" + } + ] + }, + { + "address": "shareledger18tprakt5zqtkg74c8dlw324jsxn3fsjqyxe4vv", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger18w6wwqwtjg8j33ap8g9tnkyz0jmj0ep2u9v45x", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "coins": [] + }, + { + "address": "shareledger18ncqa238qk0xxpgq5v9yz88p79r0mc3tt0yyvx", + "coins": [] + }, + { + "address": "shareledger1853wc35m4xugd0kddq9mwx9rjy8hxjz06jflgz", + "coins": [ + { + "denom": "nshr", + "amount": "6000000000000" + } + ] + }, + { + "address": "shareledger185ck7q8ra2cyxkdjn4gjrt2gpjqck9zwv2cytt", + "coins": [ + { + "denom": "nshr", + "amount": "19000000000" + } + ] + }, + { + "address": "shareledger18ewz9t8t9afycwgxrdphmlef0fw04emtdf0ug0", + "coins": [ + { + "denom": "nshr", + "amount": "200000000000" + } + ] + }, + { + "address": "shareledger18mteejsyfxpytwqvurslmpy8nsxv39c7tfykh7", + "coins": [ + { + "denom": "nshr", + "amount": "161487000000000" + } + ] + }, + { + "address": "shareledger18m4le7qrrhguj5vvfzpejsvrsjzyt46cy40t6m", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger18aqza5jx3sd39uv7stkqyqmaf596sjvc3sztvm", + "coins": [ + { + "denom": "nshr", + "amount": "9739923000000000" + } + ] + }, + { + "address": "shareledger1gzqqfjc4s5hvpgvr24n8u40alhyqcz082ea40v", + "coins": [ + { + "denom": "cent", + "amount": "27688" + }, + { + "denom": "nshr", + "amount": "9887000000000" + } + ] + }, + { + "address": "shareledger1g8qyarrgspm6x2yx9ef03z4qdaut04fsflsure", + "coins": [ + { + "denom": "nshr", + "amount": "1000000000000" + } + ] + }, + { + "address": "shareledger1gd27ny9wr7m3ych0m603j3je5u6ratp0w387zu", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1gs84e895y405ckl9kt07htq7tww3yvjfy879l0", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000" + } + ] + }, + { + "address": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "coins": [ + { + "denom": "nshr", + "amount": "127287000000000" + } + ] + }, + { + "address": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "coins": [ + { + "denom": "nshr", + "amount": "70000000000" + } + ] + }, + { + "address": "shareledger1ghrpxfgfy0kdnas8lsr9wjq3q0hg0m3cs3n8n8", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1getquqpealnsjxw2acqmcekc6l2uqwtp0q83sj", + "coins": [ + { + "denom": "cent", + "amount": "1288706" + } + ] + }, + { + "address": "shareledger1ga53dlwdq234fwq3eaylpee5g7lve6v5xwtphh", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000000" + } + ] + }, + { + "address": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "coins": [ + { + "denom": "nshr", + "amount": "264594000000000" + } + ] + }, + { + "address": "shareledger1fpcsqt6dzjw7g79arh2x5vdehseq09jul7s4cs", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "coins": [ + { + "denom": "nshr", + "amount": "94786000000000" + } + ] + }, + { + "address": "shareledger1ff554s7rcwxn943kwc9qyzj6pcgp6jetpceh5e", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "coins": [ + { + "denom": "nshr", + "amount": "218000000000" + } + ] + }, + { + "address": "shareledger1fs3vakvwz3hepyls3z3xwkxs49n97576eaxjzh", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "coins": [ + { + "denom": "cent", + "amount": "10456592" + }, + { + "denom": "nshr", + "amount": "24420621000000000" + } + ] + }, + { + "address": "shareledger1fckwx6zpqa5pn0vcvtfjnnfemhvz2wlnv3ek2e", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1fmh57s94nhgu2c8j2y89w4gzqw29wtx9cxrwjj", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger1fuef677js5cn76k0tdjtrdw9mu3zc8rxtk3prg", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1fav80hwfuz3yvjmzfwfrldjlvshu9zauyl4383", + "coins": [ + { + "denom": "nshr", + "amount": "110000000000" + } + ] + }, + { + "address": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "coins": [ + { + "denom": "nshr", + "amount": "98000000000" + } + ] + }, + { + "address": "shareledger1f75eqhu2ml0kavmc3y57037sa853tcq8ve8ylm", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000" + } + ] + }, + { + "address": "shareledger1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3dltkcu", + "coins": [ + { + "denom": "nshr", + "amount": "192700661000000000" + } + ] + }, + { + "address": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "coins": [ + { + "denom": "cent", + "amount": "10001484" + }, + { + "denom": "nshr", + "amount": "143171000000000" + } + ] + }, + { + "address": "shareledger12p5y8ngc8y46cl6ygn8c52q9f0wqc0egq5yh0m", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger12pcp7u9nq8x6u0vwrufc8l9j48mvl8qf9a0rwj", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger12fzf5k44968mej0h4fl8r65zv3gsz9zrz0x2ug", + "coins": [ + { + "denom": "nshr", + "amount": "9991000000000" + } + ] + }, + { + "address": "shareledger12fem5mf5t32vpcdnvr683dgsp4sjkhcg5fwa5v", + "coins": [ + { + "denom": "nshr", + "amount": "220000000000" + } + ] + }, + { + "address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "coins": [ + { + "denom": "nshr", + "amount": "114605000000000" + } + ] + }, + { + "address": "shareledger12n66z8kgfpc9ymg70fjzpkfusdhzy84wcmralq", + "coins": [ + { + "denom": "cent", + "amount": "962680" + }, + { + "denom": "nshr", + "amount": "99776000000000" + } + ] + }, + { + "address": "shareledger12hlzse63r0fq8rem34s2fwdgxzskdlewm4dps6", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger1tygms3xhhs3yv487phx3dw4a95jn7t7lelh8wg", + "coins": [ + { + "denom": "nshr", + "amount": "145805321000000000" + } + ] + }, + { + "address": "shareledger1tgjjeh29yzj750s9lxv28ne8c8h9cu756hn2m5", + "coins": [ + { + "denom": "cent", + "amount": "25740" + }, + { + "denom": "nshr", + "amount": "6000000000" + } + ] + }, + { + "address": "shareledger1tvxdr4jla4ezxq6m0769pawhlqtjdpeaygynqq", + "coins": [] + }, + { + "address": "shareledger1th0wdefvlyprm9mmyn43jvxcgrfak525ltyvef", + "coins": [ + { + "denom": "cent", + "amount": "11615" + }, + { + "denom": "nshr", + "amount": "8000000000" + } + ] + }, + { + "address": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "coins": [ + { + "denom": "nshr", + "amount": "1873544000000000" + } + ] + }, + { + "address": "shareledger1t6w63shshwhhgs4tn39evacahxjja9jck4lsmf", + "coins": [ + { + "denom": "nshr", + "amount": "219000000000" + } + ] + }, + { + "address": "shareledger1tmu23emqexze7drpuh37st83sx97v3jq7vv3hv", + "coins": [ + { + "denom": "nshr", + "amount": "220000000000" + } + ] + }, + { + "address": "shareledger1tl8uh5fumtz5mpru045nyj9rx62emqgymvwsqy", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "coins": [ + { + "denom": "nshr", + "amount": "996072426000000000" + } + ] + }, + { + "address": "shareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "coins": [ + { + "denom": "nshr", + "amount": "93000000000" + } + ] + }, + { + "address": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "coins": [ + { + "denom": "nshr", + "amount": "500000000000" + } + ] + }, + { + "address": "shareledger1vs6s007cye9lf5aqjdfsqphuqyv54pmvxphcsg", + "coins": [ + { + "denom": "nshr", + "amount": "3000000000" + } + ] + }, + { + "address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "coins": [ + { + "denom": "cent", + "amount": "2000" + }, + { + "denom": "nshr", + "amount": "949921000000000" + } + ] + }, + { + "address": "shareledger1vjrqur33scq29s2zmek99rm3yck84rq2dkraxn", + "coins": [ + { + "denom": "nshr", + "amount": "101387000000000" + } + ] + }, + { + "address": "shareledger1vjtat7mgaseugvqpg53jwt2pfeplsq9sp6mk7r", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000" + } + ] + }, + { + "address": "shareledger1vjj2ufstr4amqr6pp25ywj8y0qaeyd8rc92as9", + "coins": [ + { + "denom": "nshr", + "amount": "120000000000000" + } + ] + }, + { + "address": "shareledger1vnt0dge8xvhjkns43u3sxt5yt39p8ep657l388", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000" + } + ] + }, + { + "address": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "coins": [ + { + "denom": "nshr", + "amount": "3001000000000" + } + ] + }, + { + "address": "shareledger1vcuh3kvn2rc9ffnhnuhfzn7vge7gjets54fzmp", + "coins": [ + { + "denom": "nshr", + "amount": "30300000000000" + } + ] + }, + { + "address": "shareledger1vec7ahlnksvuapex98kjzjmyqx8wvjv4j8z6de", + "coins": [ + { + "denom": "nshr", + "amount": "27000000000" + } + ] + }, + { + "address": "shareledger1v6x0gzr4qcr570syfzmd7xcd2ev5fpyyzsnfl6", + "coins": [ + { + "denom": "cent", + "amount": "995" + } + ] + }, + { + "address": "shareledger1dx8pj8ncxte36hv4ekvmekmk6q7v0q6dr8u22s", + "coins": [ + { + "denom": "cent", + "amount": "20884" + }, + { + "denom": "nshr", + "amount": "6000000000" + } + ] + }, + { + "address": "shareledger1dfy2l3rwulkqnkfqay8py630jhg0m605rrq7ke", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1dtr5k5sshcegmeuc3lcaszp0ueje3nn0vet5a0", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "coins": [ + { + "denom": "nshr", + "amount": "962750000000000" + } + ] + }, + { + "address": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "coins": [ + { + "denom": "nshr", + "amount": "97000000000" + } + ] + }, + { + "address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "coins": [ + { + "denom": "nshr", + "amount": "60795000000000" + } + ] + }, + { + "address": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "coins": [ + { + "denom": "nshr", + "amount": "12049000000000" + } + ] + }, + { + "address": "shareledger1dkm0l9kjwzv7d5zf02q2dw3ngrkqtgtpkngyvg", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "coins": [ + { + "denom": "nshr", + "amount": "4000000000" + } + ] + }, + { + "address": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "coins": [ + { + "denom": "nshr", + "amount": "6000000000" + } + ] + }, + { + "address": "shareledger1daxr559k3z8yat8utdk20jufu0ypqspkw4y88q", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "coins": [ + { + "denom": "nshr", + "amount": "48989000000000" + } + ] + }, + { + "address": "shareledger1wyr9mn9qpjlvd6q0wemsj4rzepff79q67yvhdd", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger1wy8vxvwanycjcs5dhq5kuzs6a2ht0qdwmm8d9a", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "coins": [ + { + "denom": "nshr", + "amount": "81000000000" + } + ] + }, + { + "address": "shareledger1w2xwhay6h7wp476nxv3kxvfcs2n9sl9h9jshq3", + "coins": [] + }, + { + "address": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "coins": [ + { + "denom": "nshr", + "amount": "89000000000" + } + ] + }, + { + "address": "shareledger1wsdegaxzrd23a5a8zqa88ex3ck8hdzscy53szy", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1w4l5fchs69d9avlgvdehq9ypvdh4xyev3p490g", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger1wek0dg5kpfkuxyqsn0yjze6g26awsfegf65pk0", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "coins": [ + { + "denom": "nshr", + "amount": "1005658221000000000" + } + ] + }, + { + "address": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "coins": [ + { + "denom": "cent", + "amount": "425392" + }, + { + "denom": "nshr", + "amount": "4894000000000" + } + ] + }, + { + "address": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "coins": [ + { + "denom": "nshr", + "amount": "94000000000" + } + ] + }, + { + "address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "coins": [ + { + "denom": "nshr", + "amount": "125216000000000" + } + ] + }, + { + "address": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "coins": [ + { + "denom": "nshr", + "amount": "103000000000" + } + ] + }, + { + "address": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "coins": [ + { + "denom": "nshr", + "amount": "67000000000" + } + ] + }, + { + "address": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "coins": [] + }, + { + "address": "shareledger10jgl6frhlyg3c0zjvuz7vcgerpz6qp2rlp6eer", + "coins": [] + }, + { + "address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "coins": [ + { + "denom": "nshr", + "amount": "6446000000000" + } + ] + }, + { + "address": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "coins": [] + }, + { + "address": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "coins": [ + { + "denom": "nshr", + "amount": "8000000000" + } + ] + }, + { + "address": "shareledger1spjurkce2pvzu6r9urlcwcfr88jx8vpqkrvv50", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1sr0u37lws307yakpar48vzwpdale46q38mlyym", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "coins": [ + { + "denom": "nshr", + "amount": "119035000000000" + } + ] + }, + { + "address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "coins": [ + { + "denom": "nshr", + "amount": "41060000000000" + } + ] + }, + { + "address": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "coins": [ + { + "denom": "nshr", + "amount": "1500000000000" + } + ] + }, + { + "address": "shareledger1sd9wfkqces7j2pr39ayq4jwvl6key7gr0az9gd", + "coins": [ + { + "denom": "cent", + "amount": "446919" + }, + { + "denom": "nshr", + "amount": "99776000000000" + } + ] + }, + { + "address": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "coins": [ + { + "denom": "cent", + "amount": "37531" + }, + { + "denom": "nshr", + "amount": "6000000000" + } + ] + }, + { + "address": "shareledger1scdq96hxerv2mkqgdseyxpnpjgygjqcvkk8urc", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger13qrkzy3zq7ny3s6pc4fqze36q6dpc8uev7jq69", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "coins": [ + { + "denom": "nshr", + "amount": "3555000000000" + } + ] + }, + { + "address": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "coins": [ + { + "denom": "nshr", + "amount": "83000000000" + } + ] + }, + { + "address": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "coins": [ + { + "denom": "nshr", + "amount": "5000000000000" + } + ] + }, + { + "address": "shareledger130zqgsnvtwze8qkwmjwkvpy8jxwz6ny6ssmtck", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger13jvwzmum2s0t8lu8lvpzpxdshet9mk4h0nupyc", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger135guptu3wef6fkxnfatzk2phdf62pk0d3vw4qv", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "coins": [ + { + "denom": "nshr", + "amount": "5454000000000" + } + ] + }, + { + "address": "shareledger135k00n2uec225kjecsljc2vep0apwnh5kmyrls", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1jy4jl0j3v3w70pceunlghykj8jc470pufn7sem", + "coins": [ + { + "denom": "nshr", + "amount": "219000000000" + } + ] + }, + { + "address": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "coins": [ + { + "denom": "nshr", + "amount": "97975000000000" + } + ] + }, + { + "address": "shareledger1j2k0cr7zps880ltz8m2flx922uquk44pzk9zyl", + "coins": [ + { + "denom": "nshr", + "amount": "60000000000" + } + ] + }, + { + "address": "shareledger1jv3chjaq0q6k7md8p89kvxh7u3a35tdsnexmak", + "coins": [ + { + "denom": "nshr", + "amount": "50000000000000" + } + ] + }, + { + "address": "shareledger1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lmx9g5", + "coins": [ + { + "denom": "nshr", + "amount": "35906000000000" + } + ] + }, + { + "address": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "coins": [ + { + "denom": "nshr", + "amount": "95000000000" + } + ] + }, + { + "address": "shareledger1juufvm9pznmt98pvlslkzs7szw0uz2k7qcgv89", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1nryw8q00f4expchtpgmfn56n2q9slfsfejdn2x", + "coins": [ + { + "denom": "nshr", + "amount": "90000000000" + } + ] + }, + { + "address": "shareledger1n8aepjgjyv4m2nm5hc47yagz7v6stn2uevvdd7", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1n2s623cxv765vl74an0wsw8lzsh4933hjpl987", + "coins": [ + { + "denom": "nshr", + "amount": "220000000000" + } + ] + }, + { + "address": "shareledger1n3jvwqpagenl36pzampulpfvtc0kts85u83hq5", + "coins": [ + { + "denom": "cent", + "amount": "1188949" + }, + { + "denom": "nshr", + "amount": "1230000000000" + } + ] + }, + { + "address": "shareledger1nhgddhdrwxpwc4jdf4prphpwdjmd7g80andunp", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1ne90ncftutlsusk3ttu4vu28yr59l4s72pkz2x", + "coins": [ + { + "denom": "nshr", + "amount": "1000000000000" + } + ] + }, + { + "address": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "coins": [ + { + "denom": "nshr", + "amount": "1693000000000" + } + ] + }, + { + "address": "shareledger1nlc24p5dfcglwjscxdyh6q2rnzwgglqd8ddgm4", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "coins": [ + { + "denom": "nshr", + "amount": "85000000000" + } + ] + }, + { + "address": "shareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "coins": [ + { + "denom": "nshr", + "amount": "217000000000" + } + ] + }, + { + "address": "shareledger15t5h59yd7nsu0lw3u358j62eqd7w6jqcmxnqcx", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger15wzh2ltl4fzge5c9vk59dkshdyee4xh0nxeqkj", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000000000" + } + ] + }, + { + "address": "shareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "coins": [ + { + "denom": "nshr", + "amount": "95000000000" + } + ] + }, + { + "address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "coins": [ + { + "denom": "nshr", + "amount": "11067000000000" + } + ] + }, + { + "address": "shareledger149gdsgyzrp0nn3zjm48pz7j3dz7mme7j0rtmec", + "coins": [ + { + "denom": "nshr", + "amount": "50000000000000" + } + ] + }, + { + "address": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "coins": [ + { + "denom": "nshr", + "amount": "77253000000000" + } + ] + }, + { + "address": "shareledger14f66vefkax7h64e5j05a2xqjmh9fk8sywmcjsh", + "coins": [ + { + "denom": "cent", + "amount": "1098" + } + ] + }, + { + "address": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "coins": [ + { + "denom": "nshr", + "amount": "95000000000" + } + ] + }, + { + "address": "shareledger14np3phs56qqv5d4hqcjvsclw0p4wlncafyczf9", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "coins": [ + { + "denom": "nshr", + "amount": "4702000000000" + } + ] + }, + { + "address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "coins": [ + { + "denom": "nshr", + "amount": "113000000000000" + } + ] + }, + { + "address": "shareledger14m7klg3fcuhvs2j3dwva4vedsqgv8xn7vxqnxn", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger147uh7vsfzfvar2k3wrmaryf5jfag3h77lk9j9s", + "coins": [] + }, + { + "address": "shareledger14lu2t8vqu2kgy9grvg44az4hekz3339s6xdzmr", + "coins": [ + { + "denom": "nshr", + "amount": "98000000000" + } + ] + }, + { + "address": "shareledger1kqnqukkkvfaxhncyxpvtvcv9kgquk3ayrj2nzq", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000000" + } + ] + }, + { + "address": "shareledger1krraljy2c3g00pjsmkfqljq38eykra8zyauujv", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1k93kpvs7jhv433g62htax0xdsc8jq848zww4l8", + "coins": [ + { + "denom": "nshr", + "amount": "4000000000" + } + ] + }, + { + "address": "shareledger1k8u5g6xsc96kauenn2gdacrcsdgy9x6sklmjej", + "coins": [ + { + "denom": "cent", + "amount": "1012" + } + ] + }, + { + "address": "shareledger1kwllfyfv0nfu85n0srk74kr686uasmxwpkxe6s", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1knqh6v2pfwdur4087xhwfsta5d0u4lmg8ms7x2", + "coins": [ + { + "denom": "nshr", + "amount": "2500000000000" + } + ] + }, + { + "address": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "coins": [ + { + "denom": "nshr", + "amount": "9109000000000" + } + ] + }, + { + "address": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "coins": [ + { + "denom": "nshr", + "amount": "2838000000000" + } + ] + }, + { + "address": "shareledger1ke8j6a82wq3q5s09h3nrcjflsca492lfagcgpx", + "coins": [ + { + "denom": "nshr", + "amount": "50000000000000" + } + ] + }, + { + "address": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "coins": [ + { + "denom": "nshr", + "amount": "157000000000000" + } + ] + }, + { + "address": "shareledger1hq9hz2jqv0tf73lxkre867t8cn77t6h4wtvn52", + "coins": [ + { + "denom": "nshr", + "amount": "130000000000000" + } + ] + }, + { + "address": "shareledger1hq7wjjgeymvs3q4vmkvac3dghfsjwvjvf8jdaw", + "coins": [ + { + "denom": "nshr", + "amount": "1728478000000000" + } + ] + }, + { + "address": "shareledger1hgqnk8r7s95la55wptk6t5xt3pj08kg2xp4lpt", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "coins": [ + { + "denom": "nshr", + "amount": "95000000000" + } + ] + }, + { + "address": "shareledger1h3g702kksf0zpstu26e55v3m2emrul3hagakca", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1hjvm357yhtqkwxdzxgj5pvchpuaqktgx9nzxde", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000" + } + ] + }, + { + "address": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "coins": [ + { + "denom": "nshr", + "amount": "211000000000" + } + ] + }, + { + "address": "shareledger1hestt2yt308j8xg95cy3pg80yy7l0n839zg8ak", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1hl0wxra5yh2gaamah693q8pff6tk56tz9zhu0c", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1crm7w5rfpr4zugjvzv0ww6sr06e0qm4c37krq6", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "coins": [ + { + "denom": "nshr", + "amount": "5632000000000" + } + ] + }, + { + "address": "shareledger1c3lt0ma5g4f7lr3cxrkvc83cna8xe6f47suysv", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger1ck68efgryp7lkwj0kjph2gzjqkwcdlm52xkked", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1ch5rvu4267humyc8r9czfqrchyr9843ehjkeu4", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "coins": [ + { + "denom": "nshr", + "amount": "128720000000000" + } + ] + }, + { + "address": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "coins": [ + { + "denom": "nshr", + "amount": "80000000000" + } + ] + }, + { + "address": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "coins": [ + { + "denom": "nshr", + "amount": "600000000000" + } + ] + }, + { + "address": "shareledger1exegsv7386eayfg75xtkd3j5vjc2szkz4s0t4v", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1ewy9qcptaaaknewp8445yft9rgyupjdntu3uea", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger1e5xaqefpv6tt2eh5uxv5p8ersap5q6rmtwylme", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000000" + } + ] + }, + { + "address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "coins": [ + { + "denom": "nshr", + "amount": "14054000000000" + } + ] + }, + { + "address": "shareledger1605e3ry6c936n3slp7rvx6gaf3048kl95nc3px", + "coins": [ + { + "denom": "nshr", + "amount": "6000000000" + } + ] + }, + { + "address": "shareledger16sd6a3qfwpum63yed9c7fcmx9tjq03haglvxnf", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "coins": [ + { + "denom": "nshr", + "amount": "127610000000000" + } + ] + }, + { + "address": "shareledger16cf5ndlhqlzqazth7x246a97e5uf5lcur52nwu", + "coins": [ + { + "denom": "nshr", + "amount": "173702000000000" + } + ] + }, + { + "address": "shareledger16e03pe7y0x2hgyhfgudadr9pkj2pdh6n98kmth", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger167cp5dnfqahvqpz6aj5rcgwqd0jufxys6drk4e", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1mrzhzf0v9cz00rwgyxcdwrl6s7n7plgdur4z74", + "coins": [ + { + "denom": "cent", + "amount": "17605" + } + ] + }, + { + "address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "coins": [ + { + "denom": "nshr", + "amount": "187474894000000000" + } + ] + }, + { + "address": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "coins": [ + { + "denom": "nshr", + "amount": "89000000000" + } + ] + }, + { + "address": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000000" + } + ] + }, + { + "address": "shareledger1m55e66s5fgc8kg23uz9sg9jfg06n53t3jprd2e", + "coins": [ + { + "denom": "nshr", + "amount": "20111000000000" + } + ] + }, + { + "address": "shareledger1mcfr42ll89dwlck77es57ghgmkea2vpdgwats4", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1meczxtde40f7znlx0vzewuhxnux3p5y2336d34", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9w7z28p", + "coins": [ + { + "denom": "nshr", + "amount": "95000000000" + } + ] + }, + { + "address": "shareledger1uqlue2e7lrr8j4dyxkcrf6nuq684utlgrv5ehm", + "coins": [ + { + "denom": "cent", + "amount": "1048651" + } + ] + }, + { + "address": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "coins": [ + { + "denom": "nshr", + "amount": "50212000000000" + } + ] + }, + { + "address": "shareledger1uty2sj65rdj88gzheq0jufg0dww96elf0ph25k", + "coins": [ + { + "denom": "nshr", + "amount": "219000000000" + } + ] + }, + { + "address": "shareledger1uv2hqjc0y6m278fmcl3kll9e42z79ardtzta3e", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1uvtd62mjlrwxxpcydnxlnsag55a3ucxgv8zjqw", + "coins": [ + { + "denom": "nshr", + "amount": "2655000000000" + } + ] + }, + { + "address": "shareledger1uvjkdax474zn9ejyvy7zy4ntlwcay6hfjflw8h", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "coins": [ + { + "denom": "nshr", + "amount": "208060000000000" + } + ] + }, + { + "address": "shareledger1uu8f9gkn9699fryp0axa02wjnl2ldzwkzvsa49", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger1ulmfvmxqu3wwnpw4vv7fndlpn926evzg64crp9", + "coins": [ + { + "denom": "nshr", + "amount": "209849000000000" + } + ] + }, + { + "address": "shareledger1arl2drkh9qmugjfg6k7k4zl9axfv7vf07n09t5", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000000000" + } + ] + }, + { + "address": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "coins": [ + { + "denom": "nshr", + "amount": "2000000000" + } + ] + }, + { + "address": "shareledger1ac0d494dpkvla5ptvwmmhvz4e3kqj90q5qsr65", + "coins": [ + { + "denom": "nshr", + "amount": "102000000000" + } + ] + }, + { + "address": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "coins": [ + { + "denom": "nshr", + "amount": "96000000000" + } + ] + }, + { + "address": "shareledger1al85nhdmwheeg9m423gsvhvz6f5uapnwjz7vdy", + "coins": [ + { + "denom": "nshr", + "amount": "20000000000" + } + ] + }, + { + "address": "shareledger17xpfvakm2amg962yls6f84z3kell8c5lgape2k", + "coins": [] + }, + { + "address": "shareledger17vwl5v7tgf7lt4335gvmdakfk9ln8xlsz5d48s", + "coins": [ + { + "denom": "nshr", + "amount": "49600000000000" + } + ] + }, + { + "address": "shareledger1709s6z0y49t0skaw6hh9zqqdp6kfetld2rjqeg", + "coins": [ + { + "denom": "nshr", + "amount": "100000000000" + } + ] + }, + { + "address": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "coins": [ + { + "denom": "nshr", + "amount": "213000000000" + } + ] + }, + { + "address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "coins": [ + { + "denom": "nshr", + "amount": "299871000000000" + } + ] + }, + { + "address": "shareledger1lyaxm55v0gl4rwhkrxwvvkheujqxqa6sae4a74", + "coins": [ + { + "denom": "nshr", + "amount": "129600000000000" + } + ] + }, + { + "address": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "coins": [ + { + "denom": "nshr", + "amount": "86000000000" + } + ] + }, + { + "address": "shareledger1lwy88a82r48ng9xcl4egv332vygr2ud3352324", + "coins": [ + { + "denom": "nshr", + "amount": "10000000000000000" + } + ] + }, + { + "address": "shareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "coins": [ + { + "denom": "nshr", + "amount": "99000000000" + } + ] + }, + { + "address": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "coins": [ + { + "denom": "nshr", + "amount": "600000000000" + } + ] + }, + { + "address": "shareledger1legze0xkv764j0xr7hu9pv0n66y02702jmcyf8", + "coins": [ + { + "denom": "nshr", + "amount": "511251000000000" + } + ] + }, + { + "address": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "coins": [ + { + "denom": "nshr", + "amount": "88140000000000" + } + ] + }, + { + "address": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "coins": [ + { + "denom": "nshr", + "amount": "81000000000" + } + ] + } + ], + "supply": [ + { + "denom": "cent", + "amount": "131081865" + }, + { + "denom": "nshr", + "amount": "2638353321000000000" + } + ], + "denom_metadata": [ + { + "description": "The native smallest token of Shareledger chain", + "denom_units": [ + { + "denom": "nshr", + "exponent": 0, + "aliases": [] + }, + { + "denom": "shr", + "exponent": 9, + "aliases": [] + } + ], + "base": "nshr", + "display": "shr", + "name": "", + "symbol": "" + } + ] + }, + "booking": { + "bookings": [] + }, + "capability": { + "index": "1", + "owners": [] + }, + "crisis": { + "constant_fee": { + "amount": "1000000000000", + "denom": "nshr" + } + }, + "distribution": { + "params": { + "community_tax": "0.020000000000000000", + "base_proposer_reward": "0.010000000000000000", + "bonus_proposer_reward": "0.040000000000000000", + "withdraw_addr_enabled": true + }, + "fee_pool": { + "community_pool": [ + { + "denom": "nshr", + "amount": "878566566346.466758792000000000" + } + ] + }, + "delegator_withdraw_infos": [], + "previous_proposer": "shareledgervalcons1y8r4fznx6rjug0q593hr5zlrv5agd395z2n6m9", + "outstanding_rewards": [ + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "outstanding_rewards": [ + { + "denom": "nshr", + "amount": "11223667568021.430493204000000000" + } + ] + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "outstanding_rewards": [ + { + "denom": "nshr", + "amount": "3922794463852.604327758000000000" + } + ] + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "outstanding_rewards": [ + { + "denom": "nshr", + "amount": "14827976234524.610172973000000000" + } + ] + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "outstanding_rewards": [ + { + "denom": "nshr", + "amount": "5052995167254.888247273000000000" + } + ] + } + ], + "validator_accumulated_commissions": [ + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "accumulated": { + "commission": [ + { + "denom": "nshr", + "amount": "4263171659928.949825865000000000" + } + ] + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "accumulated": { + "commission": [ + { + "denom": "nshr", + "amount": "1527574730462.829296601000000000" + } + ] + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "accumulated": { + "commission": [ + { + "denom": "nshr", + "amount": "7753144062174.676691575000000000" + } + ] + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "accumulated": { + "commission": [ + { + "denom": "nshr", + "amount": "1903069462674.371336526000000000" + } + ] + } + } + ], + "validator_historical_rewards": [ + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "1", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "3", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "4", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "8", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000093463486431138" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "20", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000218822123745532" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "25", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000220703102022641" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "40", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000377516162732952" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "47", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000406673407598981" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "52", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000411671965857223" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "53", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000417148300454822" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "56", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000431352455780516" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "60", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000474988389212150" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "61", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000484856881281685" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "62", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000494039520393882" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "65", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000563708672837867" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "67", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000712125722039841" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "68", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000736089421009241" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "78", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000777743874967159" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "86", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000779823922271820" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "93", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000780635351345620" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "95", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000780635351345620" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "98", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000780635351345620" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "99", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000780635351345620" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "102", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000780635351345620" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "103", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000782982977958860" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "period": "104", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000783058012947320" + } + ], + "reference_count": 2 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "256", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001936452569113029" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "1", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "257", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001944485833528728" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "261", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001946018023187905" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "266", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001952466457264684" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "268", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001953289978335297" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "17", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "18", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "276", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001967734956617762" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "21", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "286", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001980862060470337" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "288", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001984524590474269" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "289", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001987484057694908" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "305", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001992491067436506" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "323", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001993137956802134" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "324", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001993137956802134" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "331", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001994301521898013" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "341", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001994886348354179" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "347", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001994950860951139" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "352", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001995569333820141" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "353", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001995616553948828" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "99", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000079161980080328" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "356", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001995848364310968" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "357", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001995973034707915" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "358", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001996019725862989" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "359", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001997495912442821" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "104", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000511826636481907" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "360", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001997575863321876" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "361", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001998769373020055" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "363", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.002023328847624660" + } + ], + "reference_count": 2 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "125", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001461354959944651" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "132", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001501313858551113" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "137", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001536209547868995" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "138", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001539748690207826" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "147", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001558373998748551" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "154", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001584314058731039" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "165", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001618792848214236" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "184", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001646314805777815" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "189", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001660506920276164" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "190", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001663986114629263" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "196", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001677156420964910" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "198", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001693167739361115" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "206", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001736659420677963" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "213", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001762339286752800" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "218", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001774170818061699" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "229", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001835504587161894" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "241", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001886358498504983" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "245", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001899587138493993" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "247", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001912360285277158" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "period": "255", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001922683967528770" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "1", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "4", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "6", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "7", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000040926394037187" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "10", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000056391312508300" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "13", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000142249378667587" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "42", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000301714290986666" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "59", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000806224413365224" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "63", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000898241420695144" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "64", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000955075255167377" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "66", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000994808055275768" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "74", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001031523154784187" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "77", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001056457851994718" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "80", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001060280987937096" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "81", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001062606420633863" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "83", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001067541894115927" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "85", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001070093193911308" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "86", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001072745701703019" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "88", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001115383058073372" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "89", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001123597119638623" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "90", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001124342434725729" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "91", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001134925370696828" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "92", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001163138768110027" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "104", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001373150517163445" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "113", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001377425332372542" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "114", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001377542475079532" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "116", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001378141500135795" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "126", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001379215546373700" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "131", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001379592308779145" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "139", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001379753475983766" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "151", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001381065914793454" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "164", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001383083601156827" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "period": "168", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001402127105634108" + } + ], + "reference_count": 2 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "1", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "2", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "6", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "7", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "13", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "16", + "rewards": { + "cumulative_reward_ratio": [], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "23", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000195749838465356" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "31", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.000437624827032717" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "38", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001091753061540495" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "42", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001205473621106834" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "43", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001229451844973671" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "57", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001296269024911088" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "58", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001304800749026840" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "60", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001314450015036708" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "64", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001323911606787295" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "68", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001334893196955451" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "71", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001345893696235175" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "74", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001356688860492362" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "80", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001378200674382890" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "86", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001452100288216519" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "87", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001453813704997583" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "89", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001472557740473906" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "91", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001484513897669019" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "94", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001564355108162003" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "95", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001578877641625292" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "98", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001604916716463568" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "106", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001623738717674754" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "112", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001634070247192159" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "118", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001634645420698803" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "125", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001634900488636174" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "138", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001636426748467598" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "139", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001636550631774381" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "143", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001637142443969409" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "146", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001637866711135242" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "154", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001638650033354790" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "155", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001638667477801738" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "160", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001638774877310561" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "168", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001639279447564962" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "169", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001639352535583632" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "171", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001641361193318682" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "172", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001643547620590599" + } + ], + "reference_count": 1 + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "period": "174", + "rewards": { + "cumulative_reward_ratio": [ + { + "denom": "nshr", + "amount": "0.001643547620590599" + } + ], + "reference_count": 2 + } + } + ], + "validator_current_rewards": [ + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "rewards": { + "rewards": [ + { + "denom": "nshr", + "amount": "1375270384375.861116864000000000" + } + ], + "period": "105" + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "rewards": { + "rewards": [ + { + "denom": "nshr", + "amount": "8707738219.895287860000000000" + } + ], + "period": "364" + } + }, + { + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "rewards": { + "rewards": [ + { + "denom": "nshr", + "amount": "60648816753.926701551000000000" + } + ], + "period": "169" + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "rewards": { + "rewards": [], + "period": "175" + } + } + ], + "delegator_starting_infos": [ + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "103", + "stake": "723852648.727496749000000000", + "height": "2005309" + } + }, + { + "delegator_address": "shareledger1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8glahgf", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "1", + "stake": "1000000000000000.000000000000000000", + "height": "0" + } + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "78", + "stake": "48000000969.538396303000000000", + "height": "1799465" + } + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "102", + "stake": "130301998.352670931000000000", + "height": "1992847" + } + }, + { + "delegator_address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "86", + "stake": "10999999999.999999998000000000", + "height": "1805005" + } + }, + { + "delegator_address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "68", + "stake": "171765678.740907594000000000", + "height": "1754125" + } + }, + { + "delegator_address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "53", + "stake": "10900000311638.733115324000000000", + "height": "1583081" + } + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "60", + "stake": "2999999999999.999999999000000000", + "height": "1611439" + } + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "99", + "stake": "73021393.442709096000000000", + "height": "1960298" + } + }, + { + "delegator_address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "98", + "stake": "200002999999999.999999999000000000", + "height": "1939709" + } + }, + { + "delegator_address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "3", + "stake": "150000000000.000000000000000000", + "height": "697664" + } + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "52", + "stake": "8000000319889.343878163000000000", + "height": "1582969" + } + }, + { + "delegator_address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "25", + "stake": "7229999999999999.999999999000000000", + "height": "1291169" + } + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "20", + "stake": "1026099999999999.999999997000000000", + "height": "1286624" + } + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "104", + "stake": "1000000000000105.363937216000000000", + "height": "2005313" + } + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "40", + "stake": "999999999.999999997000000000", + "height": "1573462" + } + }, + { + "delegator_address": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "62", + "stake": "999999999999.999999999000000000", + "height": "1612851" + } + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "47", + "stake": "2997000212939.673241564000000000", + "height": "1582873" + } + }, + { + "delegator_address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "65", + "stake": "322105.383862649000000000", + "height": "1634048" + } + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "4", + "stake": "95000000000.000000000000000000", + "height": "708690" + } + }, + { + "delegator_address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "67", + "stake": "428606.653699903000000000", + "height": "1719567" + } + }, + { + "delegator_address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "61", + "stake": "484999999999.999999999000000000", + "height": "1612085" + } + }, + { + "delegator_address": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "56", + "stake": "9221000141962.429363808000000000", + "height": "1583913" + } + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "starting_info": { + "previous_period": "95", + "stake": "62313064123970863.395899789000000000", + "height": "1850387" + } + }, + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "361", + "stake": "1008729390466863.145196991000000000", + "height": "1988097" + } + }, + { + "delegator_address": "shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "1", + "stake": "1000000000000000.000000000000000000", + "height": "0" + } + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "305", + "stake": "4918477121852.184215078000000000", + "height": "1799481" + } + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "324", + "stake": "898158768242.632389238000000000", + "height": "1804860" + } + }, + { + "delegator_address": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "347", + "stake": "1499996999999999.999999996000000000", + "height": "1850580" + } + }, + { + "delegator_address": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "132", + "stake": "999000000000.000000000000000000", + "height": "1573068" + } + }, + { + "delegator_address": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "352", + "stake": "999999999.999999999000000000", + "height": "1874638" + } + }, + { + "delegator_address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "125", + "stake": "500000000000.000000000000000000", + "height": "1527523" + } + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "198", + "stake": "9000000000000.000000000000000000", + "height": "1613427" + } + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "360", + "stake": "33593843036879.588859383000000000", + "height": "1960329" + } + }, + { + "delegator_address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "358", + "stake": "200000999999999.999999998000000000", + "height": "1939713" + } + }, + { + "delegator_address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "21", + "stake": "1000000000.000000000000000000", + "height": "697948" + } + }, + { + "delegator_address": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "288", + "stake": "19988999999999.999999999000000000", + "height": "1787690" + } + }, + { + "delegator_address": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "104", + "stake": "989000000000.000000000000000000", + "height": "982304" + } + }, + { + "delegator_address": "shareledger18ncqa238qk0xxpgq5v9yz88p79r0mc3tt0yyvx", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "245", + "stake": "82756000000000.000000000000000000", + "height": "1679469" + } + }, + { + "delegator_address": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "184", + "stake": "200000000000.000000000000000000", + "height": "1605854" + } + }, + { + "delegator_address": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "241", + "stake": "347610000000000.000000000000000000", + "height": "1678600" + } + }, + { + "delegator_address": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "286", + "stake": "22152977781628.465663570000000000", + "height": "1771356" + } + }, + { + "delegator_address": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "229", + "stake": "5200000000000.000000000000000000", + "height": "1661876" + } + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "137", + "stake": "3208000000000.000000000000000000", + "height": "1573288" + } + }, + { + "delegator_address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "363", + "stake": "598999999999999.999999999000000000", + "height": "2046282" + } + }, + { + "delegator_address": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "189", + "stake": "500000000000.000000000000000000", + "height": "1608091" + } + }, + { + "delegator_address": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "247", + "stake": "16378000000000.000000000000000000", + "height": "1680052" + } + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "261", + "stake": "38764428649042.338425505000000000", + "height": "1726717" + } + }, + { + "delegator_address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "359", + "stake": "11999999999999.999999998000000000", + "height": "1960317" + } + }, + { + "delegator_address": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "268", + "stake": "998999999999.999999999000000000", + "height": "1731419" + } + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "357", + "stake": "981981867.678468054000000000", + "height": "1922476" + } + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "147", + "stake": "5518000000000.000000000000000000", + "height": "1573477" + } + }, + { + "delegator_address": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "213", + "stake": "979000000000.000000000000000000", + "height": "1624018" + } + }, + { + "delegator_address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "356", + "stake": "279999999999999.999999999000000000", + "height": "1909727" + } + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "165", + "stake": "123000000000.000000000000000000", + "height": "1583480" + } + }, + { + "delegator_address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "190", + "stake": "1000000000000.000000000000000000", + "height": "1610066" + } + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "17", + "stake": "125000000000.000000000000000000", + "height": "681094" + } + }, + { + "delegator_address": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "99", + "stake": "9480000000000.000000000000000000", + "height": "837128" + } + }, + { + "delegator_address": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "257", + "stake": "71398108.596611179000000000", + "height": "1726668" + } + }, + { + "delegator_address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "206", + "stake": "2419000000000.000000000000000000", + "height": "1622556" + } + }, + { + "delegator_address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "138", + "stake": "789000000000.000000000000000000", + "height": "1573314" + } + }, + { + "delegator_address": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "218", + "stake": "9980000000000.000000000000000000", + "height": "1640017" + } + }, + { + "delegator_address": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "18", + "stake": "100000000000.000000000000000000", + "height": "686959" + } + }, + { + "delegator_address": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "154", + "stake": "499000000000.000000000000000000", + "height": "1580082" + } + }, + { + "delegator_address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "256", + "stake": "884701565.789562756000000000", + "height": "1719570" + } + }, + { + "delegator_address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "196", + "stake": "3000000000000.000000000000000000", + "height": "1611845" + } + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "341", + "stake": "6007717276532747.562143083000000000", + "height": "1850387" + } + }, + { + "delegator_address": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "276", + "stake": "999999999999.999999999000000000", + "height": "1759979" + } + }, + { + "delegator_address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "266", + "stake": "162274498461480.384025729000000000", + "height": "1730955" + } + }, + { + "delegator_address": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "starting_info": { + "previous_period": "353", + "stake": "64999999999999.999999999000000000", + "height": "1874868" + } + }, + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "114", + "stake": "50000000000.000000000000000000", + "height": "1803297" + } + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "113", + "stake": "70000000000.000000000000000000", + "height": "1799481" + } + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "116", + "stake": "2024000000000.000000000000000000", + "height": "1804058" + } + }, + { + "delegator_address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "126", + "stake": "120000000000.000000000000000000", + "height": "1805009" + } + }, + { + "delegator_address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "7", + "stake": "12000000000000.000000000000000000", + "height": "836781" + } + }, + { + "delegator_address": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "89", + "stake": "10000000000000.000000000000000000", + "height": "1611765" + } + }, + { + "delegator_address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "85", + "stake": "5000000000000.000000000000000000", + "height": "1583080" + } + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "88", + "stake": "3000000000000.000000000000000000", + "height": "1610412" + } + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "139", + "stake": "8018000000000.000000000000000000", + "height": "1831568" + } + }, + { + "delegator_address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "6", + "stake": "575000000000.000000000000000000", + "height": "697648" + } + }, + { + "delegator_address": "shareledger18aqza5jx3sd39uv7stkqyqmaf596sjvc3sztvm", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "104", + "stake": "180000000000000.000000000000000000", + "height": "1798231" + } + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "83", + "stake": "5000000000000.000000000000000000", + "height": "1583031" + } + }, + { + "delegator_address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "168", + "stake": "1000000000000.000000000000000000", + "height": "2046282" + } + }, + { + "delegator_address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "63", + "stake": "1105000000000000.000000000000000000", + "height": "1286596" + } + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "64", + "stake": "6095051000000000.000000000000000000", + "height": "1506531" + } + }, + { + "delegator_address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "164", + "stake": "10539000000000.000000000000000000", + "height": "1964515" + } + }, + { + "delegator_address": "shareledger1w4l5fchs69d9avlgvdehq9ypvdh4xyev3p490g", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "1", + "stake": "1000000000000000.000000000000000000", + "height": "0" + } + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "74", + "stake": "2597000000000.000000000000000000", + "height": "1573409" + } + }, + { + "delegator_address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "91", + "stake": "100000000000.000000000000000000", + "height": "1612363" + } + }, + { + "delegator_address": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "66", + "stake": "79579000000000.000000000000000000", + "height": "1572988" + } + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "81", + "stake": "1004000000000.000000000000000000", + "height": "1582877" + } + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "4", + "stake": "295000000000.000000000000000000", + "height": "686705" + } + }, + { + "delegator_address": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "10", + "stake": "5000000000000.000000000000000000", + "height": "837279" + } + }, + { + "delegator_address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "42", + "stake": "238000000000.000000000000000000", + "height": "948086" + } + }, + { + "delegator_address": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "59", + "stake": "683000000000.000000000000000000", + "height": "1218429" + } + }, + { + "delegator_address": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "13", + "stake": "2000000000000.000000000000000000", + "height": "891896" + } + }, + { + "delegator_address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "86", + "stake": "991000000000.000000000000000000", + "height": "1583139" + } + }, + { + "delegator_address": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "77", + "stake": "859000000000.000000000000000000", + "height": "1580115" + } + }, + { + "delegator_address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "80", + "stake": "999000000000.000000000000000000", + "height": "1582862" + } + }, + { + "delegator_address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "90", + "stake": "3000000000000.000000000000000000", + "height": "1611821" + } + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "131", + "stake": "100001968000000000.000000000000000000", + "height": "1809409" + } + }, + { + "delegator_address": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "151", + "stake": "50000000000000.000000000000000000", + "height": "1869305" + } + }, + { + "delegator_address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "starting_info": { + "previous_period": "92", + "stake": "1000000000000.000000000000000000", + "height": "1617736" + } + }, + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "118", + "stake": "1030069430530.040277870000000000", + "height": "1803600" + } + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "112", + "stake": "58999999999.999999998000000000", + "height": "1799472" + } + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "125", + "stake": "1145831257097.807914733000000000", + "height": "1803888" + } + }, + { + "delegator_address": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "154", + "stake": "2500000099400853.619065349000000000", + "height": "1850580" + } + }, + { + "delegator_address": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "13", + "stake": "2500000000000.000000000000000000", + "height": "759288" + } + }, + { + "delegator_address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "138", + "stake": "40000023768.252642481000000000", + "height": "1805001" + } + }, + { + "delegator_address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "16", + "stake": "10000000000000.000000000000000000", + "height": "828140" + } + }, + { + "delegator_address": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "168", + "stake": "1070000001542.828716236000000000", + "height": "1874638" + } + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "80", + "stake": "5999999999999.999999998000000000", + "height": "1610285" + } + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "143", + "stake": "5000069163559.486707743000000000", + "height": "1831574" + } + }, + { + "delegator_address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "146", + "stake": "100001999999999.999999999000000000", + "height": "1841502" + } + }, + { + "delegator_address": "shareledger18aqza5jx3sd39uv7stkqyqmaf596sjvc3sztvm", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "106", + "stake": "80000000000000.000000000000000000", + "height": "1797897" + } + }, + { + "delegator_address": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "86", + "stake": "2117147703113.760999362000000000", + "height": "1625824" + } + }, + { + "delegator_address": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "89", + "stake": "13836389.464097142000000000", + "height": "1645972" + } + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "68", + "stake": "14922999999999.999999996000000000", + "height": "1583079" + } + }, + { + "delegator_address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "160", + "stake": "319024.440262231000000000", + "height": "1853527" + } + }, + { + "delegator_address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "42", + "stake": "715000000000000.000000000000000000", + "height": "1286610" + } + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "38", + "stake": "1015100000000000.000000000000000000", + "height": "1228306" + } + }, + { + "delegator_address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "171", + "stake": "4962950786378.741594163000000000", + "height": "1960328" + } + }, + { + "delegator_address": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "155", + "stake": "999999999999.999999999000000000", + "height": "1850759" + } + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "174", + "stake": "577128462.589605079000000000", + "height": "1994075" + } + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "57", + "stake": "2898999999999.999999998000000000", + "height": "1573373" + } + }, + { + "delegator_address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "91", + "stake": "19000001046325.432913676000000000", + "height": "1651352" + } + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "71", + "stake": "320999999999.999999999000000000", + "height": "1583481" + } + }, + { + "delegator_address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "87", + "stake": "999999999.999999999000000000", + "height": "1634053" + } + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "6", + "stake": "10000000000.000000000000000000", + "height": "673730" + } + }, + { + "delegator_address": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "60", + "stake": "999999999.999999999000000000", + "height": "1578794" + } + }, + { + "delegator_address": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "2", + "stake": "10000000000.000000000000000000", + "height": "545009" + } + }, + { + "delegator_address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "31", + "stake": "120000000000.000000000000000000", + "height": "979575" + } + }, + { + "delegator_address": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "23", + "stake": "1500000000000.000000000000000000", + "height": "892047" + } + }, + { + "delegator_address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "64", + "stake": "988999999999.999999999000000000", + "height": "1582832" + } + }, + { + "delegator_address": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "7", + "stake": "50000000000.000000000000000000", + "height": "686972" + } + }, + { + "delegator_address": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "58", + "stake": "1331999999999.999999998000000000", + "height": "1573757" + } + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "139", + "stake": "85008577236407341.820961840000000000", + "height": "1805249" + } + }, + { + "delegator_address": "shareledger1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9w7z28p", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "1", + "stake": "1000000000000000.000000000000000000", + "height": "0" + } + }, + { + "delegator_address": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "98", + "stake": "1999999999999.999999999000000000", + "height": "1764132" + } + }, + { + "delegator_address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "74", + "stake": "999999999999.999999999000000000", + "height": "1599933" + } + }, + { + "delegator_address": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "starting_info": { + "previous_period": "169", + "stake": "1999999999999.999999999000000000", + "height": "1874880" + } + } + ], + "validator_slash_events": [ + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "height": "855735", + "period": "8", + "validator_slash_event": { + "validator_period": "8", + "fraction": "0.009753766172963536" + } + }, + { + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "height": "1839500", + "period": "93", + "validator_slash_event": { + "validator_period": "93", + "fraction": "0.009963597103812252" + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "height": "1703989", + "period": "255", + "validator_slash_event": { + "validator_period": "255", + "fraction": "0.008123421856066504" + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "height": "1796636", + "period": "289", + "validator_slash_event": { + "validator_period": "289", + "fraction": "0.005337614812094609" + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "height": "1804472", + "period": "323", + "validator_slash_event": { + "validator_period": "323", + "fraction": "0.007360829712725219" + } + }, + { + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "height": "1832763", + "period": "331", + "validator_slash_event": { + "validator_period": "331", + "fraction": "0.008241768996813939" + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "height": "1335670", + "period": "43", + "validator_slash_event": { + "validator_period": "43", + "fraction": "0.007284936826849072" + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "height": "1705248", + "period": "94", + "validator_slash_event": { + "validator_period": "94", + "fraction": "0.007045126146506217" + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "height": "1725293", + "period": "95", + "validator_slash_event": { + "validator_period": "95", + "fraction": "0.007095112106318836" + } + }, + { + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "height": "1993931", + "period": "172", + "validator_slash_event": { + "validator_period": "172", + "fraction": "0.009962828792900879" + } + } + ] + }, + "document": { + "documents": [ + { + "holder": "shareledger102l2e2wg8auuzv3vwfxvjxwwn95xaagr5f7zmx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b2bc74586175dce53bdccd46102c0d28fb8a250454967be037d1f262aed7abdd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger102l2e2wg8auuzv3vwfxvjxwwn95xaagr5f7zmx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d45e6d4e9a16c2de0c9e03be71a4da779d92c349b6c996d23912729906602893", + "data": "", + "version": 0 + }, + { + "holder": "shareledger102u6fl385282jnwvjfsvcxjnahsnfkgfurxaq9", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "73eecdd5265acd8aca60f6d6d85515738e65020c608732578906b025c00cce8e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger102u6fl385282jnwvjfsvcxjnahsnfkgfurxaq9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7a4672589881fc3b9cf96ebf904473781937742735b59eb2f9564a5534d7e64a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger102u6fl385282jnwvjfsvcxjnahsnfkgfurxaq9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8bfe3624990d33ff1af587daad91d39c479ddfea7011b9df279dd14ea3f6ee8f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b3409f4851c86e5b49f07c4367b7522351c7f6b43c080bce40369935a16ef7b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0c0c45790b59c92d64c255de951aa9c1b71280591392ba7b401013b530b9dce7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "195c2ae332674a4cede7773f35487ad51eeca3e7c94b5ed340e2726e5a08efdf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1bf69afe1462787944b236ce06cb517f5ad2d838b802207907b005b785b7d62c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5bf7180d2eac285a38d5414f9b7eb64a004e4ac6ea0a21656591ea959f9ed099", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bbd1e9b3c3bf73ae162348bc3a3c6792f2b4d4775625b6c7d12f29713402094a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger103kps74kwnv23xe6myxj4zvvn8ksqpql06ufdv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fae42808fe3a32be60a99789c58244457a74dab8382d9e98fd884c0664061970", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0651566b832810bdce66112e577d6805c6d30334d6281bc14bb7d33d1fa8e729", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "16d27aaec5b0143215912bab52ba480f5b79ed79196bec054530fbe3913ed6c7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3e08fe93e41e136d6215ad49dffbff2010f603d025cfba2ea19f2a2fba820a8d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "40bac7de90ac89334ecedefe633241e6377e1bbce9247c57d0405daad4503482", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "493fcf40a6151248b6da499258354d30f2748fa4714d787858113926b5dd2801", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5bdcb85c743063fa29e0a4546516810366937a0bd28fc6f13803690683850dd9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "proof": "6f83fa7fde6f8901f555bcaf2432e92392eb11e66f8c4f2d8864963f35be5570", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aef9fe966e442fc229e2bf632507bb275bcb3176638d89ca30355087ae5088cc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dfcf41be9983cf2a1347913be01ee6bdc0185a57198df8b740f0d8cbc3d4c067", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3197cc9d5a4322f00d93f87f0a5c3df8c390c208f88093a537f811f407f750eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6bdb794d0c7dfac681c810d4ed9991684047cba3f94dd9040368568ac9b6bb32", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7cd5d414ebc67793307046076506b471d7ff2a6d729ae87651e6f7d60cccd9a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ccb2cd52c610a1b463d224943e56edbaea3aa2b0590d5102f9df0243b45910d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f09381dce668fa19953a8e5fb3a407507c8630d4303ee8690feb52dcbea942f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104d87v5e9pxx3sh9kpaznyuwxccr8mv0pr0k32", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ec91e4625b50b1fa04ea6d3910ce9571a52dcadb870e5e306acbae0b14f01c3c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104sh8trl7tc650mk5rt7x83su94sv7qsjs0htt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9207bdf59b0ce420ad364c92324b5fd71a3b6f1344783d5a1f1b6f2ad821491d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger104sh8trl7tc650mk5rt7x83su94sv7qsjs0htt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f7374f7010888d87de45668dbf62c9f923b662b28f0fbc5e981614c41868ed9f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1052069k30nr8ahj8sl0tk3yfqm0d5eccs6xqga", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77250c574a7af27cadfbf2dc6705105b63e5248fb2ca8a31cedcd1274fc16673", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1054gfpm2hp6mc3vmvpzl8ejx8a8nxwz2zm5mru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c252121ccba8d1872f434a24b0f26ed5394a23befbfd5cd81fd545a5c1c7c9c2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger105u83pujnp3e7mjszq9x5w998vk6g82cr4zy43", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dc0ff60e7caa86031068f866342de5a71bb5d3a7f7d38a0b993c3eff8070991a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger105ynm4gyj8yv54gq8fx78n9ex9nypdhzrk8y0d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5ee7e1257c2b35d61578360e551e1bb167309d962129e7026585030a906e9c8a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1067e5jh6et7qgpd6spp6dnsyfg9yzdnlkvexca", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "673d299c26fea11c15b21895b0d1b37c39a9f656f1241c2423ebedfc59f1790261", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10784nexh7metvn2ggsartszw0pv4r7swpv4hv2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e66564c631b4b99a99d77cb947c5c2e14629bc5dfe830c479a225daa469ec431", + "data": "", + "version": 0 + }, + { + "holder": "shareledger108g2zednfqwtpppy3mrfxtx2rmux8fnvx49vzx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ad2b24465712c48d8bbb8229dd4a26dc0652a94023616f054b2f300321682fac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10ak8cxz5ap437r420wuqgqaqg7tldlleg9nsj4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3011ef5640719d30d07c0c97ec419365004f32ab5c3801275f831a278c9a006825", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10awcsld9nkf0eanqyeq2wew5wjv8q3qpe6t8zz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2adbdefa465c9042a85477b583f1d1de0b3de78457318c90b447e3a4c650a633", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10awcsld9nkf0eanqyeq2wew5wjv8q3qpe6t8zz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97db45ccc640f9dc34a7a74fecb257cf8b9cd7217997791280c6b30778c5d6f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10c6s20awwqd6wssrd4vjfya9g52dt4a2rx36x5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "14fe635773152015d35f031b21c4ff81959e165cb57c4932a2ba163ff68e246c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10c6s20awwqd6wssrd4vjfya9g52dt4a2rx36x5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "7459c295a39bd45469e3121f4430fc59e52af800bdf6adaa53fb3b68b7501392", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10c6s20awwqd6wssrd4vjfya9g52dt4a2rx36x5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "a40bab4e3e19c26c5333bdabb3c62c6d1aac16b4a3688b67b64b04a6ad7f1161", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10cgma3pf2ecqvq2dsa4dv24ngcwahg95v75589", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b79b873e857a8988b62b58964d2912d61b8c9930e71a26dc76061ca71654cb0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10egj3nafz3vk6hlnyj7zfg2tkqwul5devkxxfx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "75da6396bd78f24c716bffb80428f260a1c4174838911bd71193262105744f0dc2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10eh4fww4lgk0hmml84eexu7w5tvj7f52xvzgta", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f903b2e605a1c2b2cbb8d8b5981605e23c184cd7dd3cd7807cb2b94fc40264e14a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10f7lcaa0y8z5cg3ulgjl6fsqk8w6g8hwvhymhc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "498872e055b0f57be9eb4bab5069fee301a5c4240d1b4e5439816f7c02b0946340", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10g3akvsmu8fz2jlm9hz4ufeya7skhsrjwhuzua", + "issuer": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "proof": "1ff7a830c7b34ea4dd7a5392243e32868791b67d51b29862f386f1a59dd3421b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10g3akvsmu8fz2jlm9hz4ufeya7skhsrjwhuzua", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7c1dd0753eee6545389f2ac01bcc7fd02dc1f52bf74fad4e6c300067a64fb317", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10g3akvsmu8fz2jlm9hz4ufeya7skhsrjwhuzua", + "issuer": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "proof": "91cdbce4ee547e5c8293ce57b58a9e20d772e41f4f9c2705c6c7d7b30ff136ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10gfzf7z42gxyvqpu966675f8g6k8rzk095kqdc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1aa45524ec399b3eb7571833d9784dfc30201e4c2e59654fa7b9716d1db93e9c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10jrymlw7hy5xj74k5vyj3hd0jgy9szma8zsz7v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "98b07e70577e470023e7a7f6d32e10876495e158bb67cb375589388da33542bc3c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10kqt2gg3rp8ac0p0trky7fcfp7dp8enptq295y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6d027118eebca3663e92c3b4083120c422395126cfa0728dbd2a5fe361819af4e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10mptcsgynk9p60zrljjpt5quk29qqgka7v74le", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "07a120f6a74b6728e024015fcf1470457799e614234d84cd5d9d32c681eaea87", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10mptcsgynk9p60zrljjpt5quk29qqgka7v74le", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "19074c9f9e24d9c80ea5c952186a571e2cd4fd34f1c48e67ac4cd6fe755a0a2c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10mptcsgynk9p60zrljjpt5quk29qqgka7v74le", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "50248916948f8ce4f7c927c9b4506784560949aba8074910520818de6fb8d23e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10mptcsgynk9p60zrljjpt5quk29qqgka7v74le", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a53786a905f4d9c138ce83937dc0fe3e42383d2f453797b818dcd47c47a86fe5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10n4ywlj5yfts44q7mnssxt2j4am0mgtefhrfuq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a7671afc5ccc36e2f09cce388d9a5e3255143c5ccdad804f4ce3cc9bad9934b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10ndy587h8rmdec054338nwrv5wk9zsxkutrx2q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8667cca6d0501ae36db5c89733caef643f09dfa4f7795ebfeba7e5679be8501c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10ps74dg9wzypdp2pkp3v3m65dny4ryv0ghuxsq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77319b388b6043c47d107f0f6e402e3827b1fcaed171f072cdb15a665dc95e39", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "34d875559163ba0740c246b72ca358d3afa40076818ad14834d213108bc16f50", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "58b419234f524bc7bb867701d04cfd66b6f81655a7c46b871419a9a876e3cabf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7dd9c4f00237107c57d31fc16a2744d8d85d992da9a7ee5f3a030e5dc5cd071b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "842f512069344a03fb4a4c46ac2e63dcce954b0fb186021167768a160fc14ccc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "cc2c780d777dba793f63c191d52018abc3062ec36ccfa58d92aaec2ba8cbccaf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d9f1c48e78c67cf822da7c94033eb35539aedbdee74fa370733469d936fcd29a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "f707187422018859334e4cf25831d585d59b4704e238aeecb13f8d3551fa3511", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10rrxnkcdyckqg0lnvkn8j52gyghng7a93uljep", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63701b5d34540c0ab35b158ea62356560b80bc3c7505a0f270e5361945e40d136a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10rs7c07y8y58shjpy5htq9t2taemn65fazf6dp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b4cacf3b4b2af9bbe8b192fbadaa6d4fe90b31c0beb4cdde6e42ac15cf58731b0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10sgaadzkhmfnavydaa9tdm05xr2aj7exqt6vj6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ce46da5d8afbfea760607381774eea697b8fee3d2dd491a6a2bbdf619e2adde1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10t3p624nzdvhu4ezujw7a25dh36crpnzt6rdux", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "335d68ecf3185e23eb2225ae84fa04e770f0d50a212dacd0d3cf075ea822d1ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10t3p624nzdvhu4ezujw7a25dh36crpnzt6rdux", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5d4bd0830180aed3b7d80048aaafa1618d27345ec696f3e7188ca53e91485fdf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8f2db183ba9cce5d0207103582a02e89382001211a08565da4b2320a00f99a1c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10ukkafjem7xh5hdep6f0vgrrpyrggumqmltp26", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "07c0a597b6fb3342d905a730f347414ac65ba6ba7f3a2463b9a50ad9aefcfa47c6__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10ukkafjem7xh5hdep6f0vgrrpyrggumqmltp26", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fb835b0f1d4d2eea989c2b5e91563a2f1136ccf118dd0e865fd6c770492255022a__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10uzk2tk7tfk62m0xrnk3mq2dktc0epd65sqxq3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "80b019ffe4727aac301ae7955f4c67a8fc2dcb5b8c04a5a105a46bf3ec94082bac__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10uzk2tk7tfk62m0xrnk3mq2dktc0epd65sqxq3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c53f2141148b026ef2b152de0f026d90b5afa8e369b757a86e3a2724b6f8dd6acf__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f8999f832b05174ca74911fc3ec9554f35742c7c584f43758893bdd4ccba85d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10v2snd8gpduwqasyj85znf0e7zfz5u6qgmfxwy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1514f15599a16aba50b4351f3825ab8f2829c7fcf6ebf9e3f15f0f78b7961b9646", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10vkygvsuky25swdv5kc9jls8le3kj03696gnkg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e252c1cbbb664ad1d1c90cc237c7f3ea2f3af1fe43839edbc4dd49ece6c392fc48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10w9zneguh2eu57v30dcxe587zkle4pk36mhlxq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aca0b76f1113756a3b9010f96e8d1f8c7af15303f4beb9346d9922152e6c9fbf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10wnsdwhzmnnuy8ddswafjr6l3n6fc9g24ny2tg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3befb70b4ebd1f52ac04d1c88f059a108ae3de8c01761b998b02109d11f97bb8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10wnsdwhzmnnuy8ddswafjr6l3n6fc9g24ny2tg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b0e4015b0117655e44faee16fedbea2f8196d7fcd4f24433fc3189ae0a35371", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10xldm6y5uyf09xtgwaqrrpuppg7nhdf03x4zep", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1e4b3bc4cb1207b3c9c11da6874df6f0222861634b92a2e7aed34f14699b05c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10xtkp9uqekr69vzmh4chwm9k27ujutlv2r94x5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "67b0d242654249f497e952457d3a156fd1a0fa400aabcb1f78deb4114d4740ca48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10xxs2e3vuxr9ftnzf29s3p2mx85pdzllfaeq6v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "74acce8bf941c83a907a7f4bfee0593aa4cd27e40477841a2bc5374fd9d2e99298", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "16fe5fd32898cf2585617564be239d84cca69749cb4c564e2e7216eea7b0ee9d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "32394b64870cf42bdd80dc5e1822fa8e7ad2127294b2dfad784bc048c8f59d1f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5ac37a4bf312676ce03c98fcba255e4a955f62d44498b40e0591de8f739e1a86", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10ykgm8yknntec3h4csyqlm7yk4zna7zp0mx2f0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a598fa23ebb6e0656784d2abcf6a24e5c6596ea652e8a6853d5ae339c9fdad2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1429d86d70550d40d2beac67d18e3d159768f3a0b5a7000b6037a8e2fdb1de9c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "197c27f6fa6edbf13f5ea4b04877521603a2fb5843726706942b5a5273be2816", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "414deb5b804afa8e22f1406b9ca4533573e35a68aba6012902d9dd6ac1032a1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger14lu2t8vqu2kgy9grvg44az4hekz3339s6xdzmr", + "proof": "58adaf60009c15ec3f4820310a413c3faf6ece2c97fd542ea20706e836f7431d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "61d93998b17ec327d2eeb7ae920c581a84036e33190b6c1925ed036b633e68bc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ab0ffbcf1c1b9204321414dfdeb4e18efcf9e1d4c2fddd6ef5e5dccf8420341", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6b7bf585da46f70c9855f751b0b776a16d6ec2db4d5bcbae6e439eb0548ec980", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b4dda01378907d8b96c183d6aa95ac8c08e9cd09f16adc671fc62978e5e0a05", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7f5ce84137d50ea51ef4697d762129b24ebb4d26c4029dd736b1b987d3e9e893", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "84507f6c76dadd1e49b78064156f93705a7609ccdb3ba5ade137de1346c31d18", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "a294520b46a3819d114067782e83fe4ac199712e16f5dbf43ccd6439f54d9402", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b46c8e3a235be6000293fb0495d16d1e62fa68f554c11ed88c30ce1e0294903d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dc899d51b65aa2cb5ca150d81f2ea606fb12a05932ffe424c55fa576fa56d25a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "e8708f29ce79c8a4294d8b90115030ba5ccaa7d821b96831101ed6d1637a5f7d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "f6d165fb5de1d972cf352d0b999940966947bf932b5aba4d00ded0dc03d7912a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10z0qv8vl6z0ua4e0q0jufnncq6h6m0kkyekf2y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0e25434ed6c033b6335f6810768bbee97d093d967d2eaeaa00b1d3c0d7d4fc9b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10z0qv8vl6z0ua4e0q0jufnncq6h6m0kkyekf2y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "85b1106fd5760d750c69c9cb3affa302aff3536ee484bff70f29e315c916cc88", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10z0qv8vl6z0ua4e0q0jufnncq6h6m0kkyekf2y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a9e0e064be95aa941cb2640edb2b5454267ab13c1c56c56b0cec118a62008519", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10z7u3wz0n6mfrdwzfnmsk6dqtq7lwq908qqh3s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ae1903f5e12875deec799d43b72ca174f258b3f18a8ac0018c1214f4fb6864f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger10zej9tc7725ft3q43vl4kqr6xsr5jv3vzg3trl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ee499afe9ba5b1d1ac56593010f0ffb9e353c241688c4fcf767df23bca4bd64091", + "data": "", + "version": 0 + }, + { + "holder": "shareledger120hjhr7tfpuqw75e53n5c0f9shv3crcynf26gm", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "7a0732923949288db91638159e0ce2b391d44b77cc64e36bed17b37691177242", + "data": "", + "version": 0 + }, + { + "holder": "shareledger122gk69qd26pqrv9gt4stjkdr7uf607s9paqfd2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "37808b9256f2cd4a7088770a530d8b3c2714ab5ca33613b35e8c76b0f09acc9c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger122gk69qd26pqrv9gt4stjkdr7uf607s9paqfd2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dac0eb45d109cf1a451e9199f584edb053eda6efe835c4432fa6ffe8fddaa27a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger122v95upe4ye4nthpay63wjrzqczgy6y0qynzuv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b5e869d85775750a5fab88f274a1361cad48ba59e022fdbcc41a678d023b6b66a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12334p4yg8gfxcw4y4uweucv7lxm9fsgs60erya", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0c4838140f5ed20eb89d6f3d2b5ce5af737b74bc467a8e5c827c0bf9ce33ef73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12334p4yg8gfxcw4y4uweucv7lxm9fsgs60erya", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2d033b49ea8a057a5b7de33ad55f2fe8d9140b41bed949a083c441da53db04bc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12334p4yg8gfxcw4y4uweucv7lxm9fsgs60erya", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4dbc184a98a17f68b833ade66bf18f7b1cc6b1e0b5dcfc329fdf88798d161569", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12334p4yg8gfxcw4y4uweucv7lxm9fsgs60erya", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aeca08915dc624d68d27f1179124f94ede748fa1cf716e04e038f8e783116d3d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger123ern33060ks6lprah7jv8323gy0yejx5kz53g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "350a4db68cf3d7b979ce18cd73e2c95fbb95f2c53333864f21803f463fff99fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger126dgtw9mxyzgjcwyky2fkutw3tt6l9vqnl6mg9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cae193002e3af3339be9402acab9e64702f7fb1324232c0e52cc0ce2b3f46de7ea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger127apvn5cc6a66zh3t7szxx69kmu5qzldzfjly6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0f1f4bb1f2021971c47b8a46295628ae9b0f51ce3edea1bed48bda814b8b10b96c__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger127apvn5cc6a66zh3t7szxx69kmu5qzldzfjly6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3cb8ec9cf543ee87dde7d3d4eb9afd74a35ddedb02008768680236793e652ef2a2__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger127vgekkmhmwcf9gt6gjrfq5m5v28emmn6sr0mj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ca48abcb24aa214cf2b41c9924ee09e1fae5fa61bca0f39117e2a30d13e394409b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger127wmdzeq9xxwu03p4dltwk8hx6mr72y2sy9eg4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00b34a0e530ad247533ec4cc01e2fc95ba35bbac636810f0e9155a40f28623ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e4268ae1dfb3bf40afd0583e3efd7ef56ed8a5eef2e3d2ec7af76e8a8ed0de7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "34323ba05722faf81a3eaeef198e37f61661e0f17592ca2905853bcf3c41919d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63d9d39d0f2ba5c1d0f26cb375dad7daefc1eaebbef5b803a4f2a06a83204294", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "96e0a57e8f0e8639c6c95a2e3a8028196ee4cdc639dc2cb51a66dc9a2083b469", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c655a37916d62edfc67da8243b74bdf00adbe7aa1340492fd3ed94029fa35740", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e78b4534ea266ac3b83da92fa4d1db34b3345eb65996a8e8a1648fe05f3797ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eb237c8c3757f272cac15b08bcc1606fa19c1f42977bec4ef6155555f1c5c524", + "data": "", + "version": 0 + }, + { + "holder": "shareledger128r8nr3njm3682ynan34x6ahayw2n46n9uzuzk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9a443cc83a563b6b4662924cfca058c9cbd928997647472b4d7ade05f665921d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12d8j99suhhnuj6m8l5lajwerrvn0yjkvvzu9px", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "90eab041fd5c6e8464568a8bca4930e2b8c9e11933a811421d7569536af4114cb7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12e9wdezndkxtxzx29dqv65pk77xq7za2y7jhlk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a71619667cbb3bb6e26faa8bca05bdc5e0abde19bfe825f3ba4d15b9c4c14a71", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12jm3aq0afnrvtewsvnp5xrrftt93z4eetnxtt3", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "155ac618ec1f5660db8176fdb124de978c4225bc1de495d0fb420917ed334c94", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12jm3aq0afnrvtewsvnp5xrrftt93z4eetnxtt3", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "d271ba8690904e98319b17ed04ff92f322d8db2cafee8579df11c0399c512e01", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12kmgxdmsrvuq3r0gctqtfkaagxa85t73fed732", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "41153f2e824c38797ade7344fe46cb05e08a50fa8a5171b2148716a67901c441", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12kmgxdmsrvuq3r0gctqtfkaagxa85t73fed732", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "961d48380b9a5cb395a8103bd03f234f16087998dc56e27ef93c6dbf1f26de5d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12mua95xw7kquv2fd057wvczty9m4xqgk0x2w97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b203baf6e8a15b17215a2824f5211f7108db33983fa4d2a2ea6bd54e3e4db598", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12mvnvx64yju9vnankkusy4plzskwmndtmj6lj6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94a7c0b047cd0a89932953c3124e4b9510eedee18b172171d8115b3c033cfe1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12mvnvx64yju9vnankkusy4plzskwmndtmj6lj6", + "issuer": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "proof": "a5b0ad96cff4534b90df818b2e2b69beb878c84539da98e6f1d8e5f98ced5139", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12mvnvx64yju9vnankkusy4plzskwmndtmj6lj6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ad69ec3bffa686a8c2525f9ba68d63ff89510757ddd7cb127c83d0b94ddbe2ed", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12mvnvx64yju9vnankkusy4plzskwmndtmj6lj6", + "issuer": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "proof": "c3f6a7e6742a527a2088bbf17c6a3c9b9cd1af079b125bb0ed2bc76fd23ff140", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12nzv9u2hc6w4puashxdu6r5knh5cem7gatjkl3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "324ea2b2e4c45cf377cf7eeda4abe04191c6fd5414b8c7b068e61ae62ca235ea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12pfcd4qlhm8ga8ckud0rj7g97m7tez2wm4gagp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "06e4642bab2afcd86f7b15b958f204b83cb90cc1ceabcebece23607fd1166913", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12qlmeq9h6vje5ynpruuhkj2pf5ntx7aqd929k0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49fe881755b3ace71243f4bae56b8eed4a9095a9e59ba9f9f7a87e119d4d816af8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12qr8xd766lx8yuj2lnuxdhnu540h2c83ys72hx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6d504a06d9a1d61d1fb578a96988ae230ae07b3d7ad5a6c5c0b3dd6a733f078812", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12qyz8aejy305sn8q7q694vs6gftzm0mzr4x3lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "030975555b0933967a3d6818d0d0989ddb2361477dc484b5c08ae308e854700bz5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12qyz8aejy305sn8q7q694vs6gftzm0mzr4x3lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "030975555b0933967a3d6818d0d0989ddb2361477dc484b5c08ae308e854700f8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12qyz8aejy305sn8q7q694vs6gftzm0mzr4x3lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "130975555b0933967a3d6818d0d0989ddb2361477dc484b5c08ae308e854700f8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12qyz8aejy305sn8q7q694vs6gftzm0mzr4x3lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "230975555b0933967a3d6818d0d0989ddb2361477dc484b5c08ae308e854700f8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12rq2v3dhsx6460ahp2af0uwvkths4hpksdhf3k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b2dfada7bf3d98e5036375eec73a2ff209687e2955ca1fbb85362df4cead007c2e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12ry7qkhcu9nkk63r0zepzrs55k6yhn3ns89jvc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4735818cd6aae8f6ad44c398270b059f1070c0f8dd0961ed25968a0297dcea42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12s3sae9m328j3hr3uv3glh7eg584gkr6zrmks5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "15c54fa0f910f34d135e18db4748ae3580542d57805655d3364a5af7bff7ee36", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12s3sae9m328j3hr3uv3glh7eg584gkr6zrmks5", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "c837940a1dd16c9079897b696f5e77a01adfa31327f1d9a4bc4bfc3f543490e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6acf76d378129e3597c4aef8c9dfb14be53a74c549c9d24cc8e15c0481074abf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12t89z96n97vct9h6vd50tutzwqul9wk4z7v9e0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ad2c8b1c6e8454d126b389570fddd7d84d17ef646ca958eed50a4ec746d6ab749d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12umetguevuffzqrq2vy9e55f5vnalg9733vxnt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "859bee000d75a00f447ffafabafe57c018881e155adaccc3c9725122a52d85fc40", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12uszlqp727fg4rsftzwhs4e4t6q9cvrkzqkw0q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5353585cb7cf50c425f1485d77020f363051731141231579ad816205d332a578", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12uszlqp727fg4rsftzwhs4e4t6q9cvrkzqkw0q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf8296c116fb266e070871c20f0c867efbbe10e9ebcd18029529b3de09f57294", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12uu7lxlnlt7s0c4u4d7um7t93vz8getq485yhw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "384b0343952cb40276f762c0a39cf57592345389c2f3c2c8581869db7a8461c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12wq2r03tlwcx57ejftnm2nek00a3xg47k2f5uy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6dcc8197517bc08b7b8bb7fc4633b807e353cf9e7ab3067391cb4e81200c637cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12xtxksdmalemezy0h93rhp8lld3f0kyhrnqlpk", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1996a148124caaa5cb8cedefd78c40bf5f3c80835cc1b6278954af0c1504f4c7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12xtxksdmalemezy0h93rhp8lld3f0kyhrnqlpk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d0affd93ac8151003021fd2fb403b69055dde4e680d32553944872a68fe905cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12xxwcampgumwetfcayg20qeufsy2wral28jwec", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8cc384fe6e3803bf19a98ed9cb7bdcbecae3cf6e2a10388e5a904a290ad57bb438", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12zkljj83326edhjyx765yg2q95xqv9rjmjmmaj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "efdd0c3b540f23153870a00beaf9cee24517542695fad24901b9435fe3875d38", + "data": "", + "version": 0 + }, + { + "holder": "shareledger12zt5k0nudnaspkf9smlgxstpaqhvldx8hrkvwt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dbe70abf107c4d679ee171bcc44b17410363a1b0118a860c3045f52624f7559d5d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1300uq43uz7fruqtqzrdndh7m3kw6czzuvg3n8n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1c6d07cf20450a11ab5cf233ad942a7b25d390354b3ffca7455fb3657e46be077f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger132mnl4suwsu5hmuzzg3v5y06px960m3yhv9qf2", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "03bb2945794b4ca88107c849ec7288167cdf1ad7b24907342809076f728d13895c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger132phlgz6ufl2ajk835gjh55fhczh7t60rtyjgk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6962902ed848f19c18c32ecba221cb20979fe60e51ed54a8117b0a16fe56865b6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger134mucv2szzgy6c9nqw69m289448pm6t0vr4m46", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7cefe0263d9dfa000fe95614cc4545ae48e2803b4933d9045e5c8b8b393c0f5629", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1353yrx5xhurzzkqj3tu8kn6wv59y0xagq4hkrj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a9a566f23655e0a5c35d5664a3fd2a202dd40a8f30f2098805d79ee60d6c51e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13552n97g2luls36naz0nluz5tdjzj68caseruj", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627977794851", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13552n97g2luls36naz0nluz5tdjzj68caseruj", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627977982542", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13552n97g2luls36naz0nluz5tdjzj68caseruj", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627978090084", + "data": "", + "version": 0 + }, + { + "holder": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "10a95a5481325a30e0ff11e30caa2df08c47dd4d499991b91b76d6a8b6747794", + "data": "", + "version": 0 + }, + { + "holder": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3926223191c128c1d90ff34413b8e2eec4f70c023616ac2471b259c0f87a4178", + "data": "", + "version": 0 + }, + { + "holder": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "8c16944cbed4ccebfb4523dae1c5e82c136d2e877633dcd71112f16a69bcd507", + "data": "", + "version": 0 + }, + { + "holder": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "a5fcb51a79805c1856b0725b4b04062d7ffb0fd6ead0c30efd0df8ab6263fc3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "db6fb2edab805a916abab0d63c0fdd92cdd783a1423e54855665d2b5f975d160", + "data": "", + "version": 0 + }, + { + "holder": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eae8160a659471a885c18d7b6e67f022d05c258f012176ad7407ecdceb3040cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13a3079k2pf4hpkj52avtajetjkzzgzextt4xf2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27194ae1fef1091efe3f590fd6254d90bfb9aee68f1b9d6d6d65c744ceb6c47f0c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2d49e9ca02611f93f0b05e7d2b17c20e95e3782ab76fbacb136f8b6d3fcd73e2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "3e93638469135b0e70f5088b82f959fa66c4693021d5c0dc779901076c403f94", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "5a213fbbfed822d301ca7201850d40f59d0f1dba2e0934927cf89bde8e57e9bf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "9c602fc71a4e5006a9d3b77941b4f2a2c828dee79f5d34aae6b13b92c7a15176", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c5b95cfdb958d08944eccce05365d12a484d63c2aa09b1d9c66a718c04c05ebe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eaf107b72d9d3c6a9165828ee8a5ebe9fc7327a2c8e6eef8a9fef24c75ec967c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13c49kkmn2lue2nf8na897qut472swz750w2eeq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4956a73f0f51bb9c15045a6c7b6d3e5e9800ec4a2dd327c6cfd4f5400eb8543d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13cvr3xu0a2zjarx6ec8r9647dp8faa7w4p3pt5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c21ff58034c7a044f28987455cc3bf8195a336c7992b3adcfa3ccfd9a8fcdea4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13e2uzceccpfsyel6le5welrjp2gtjngqvpzeed", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "54f984dae852d298ec7c513890fcd09f32da2e8d7355ff6d521e39954cc61e99fb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13ghelwq872e9eht5q5w0n9r2wjqmtdchf67uvj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1d7eba31fb2419b7efd90c8b9972666a046a29b33530763bd7ccd362ba07e46f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13gj3w4x83gez4yj69az4ax67epzlgdnrm9h6a7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e5dc750b88583d880b344c296dfb02139bd847e8ac9ed8c96ab0b203776e2819b8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13gyk5vseww6v30k3wp4wvend5t9kel2kj76fpy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "683dca95d2c38699529716638ec21466147cc09b2fdfa950369068e44e90189f9c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "02ec78a3b8346553f80a83d8285f3d899bb03fd9e8135191cbd3fca7c5eb5502", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "05fd836b13ab43b628a8525cf4729831cc77632649d68ab08bf2ae312dcf7c59", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "06ac330bd9e9ce2645854c1e57d80e5b74b4fda794003b2462344ccf1ef42cbb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "088b525334cfe1972c72788ed58899ea628300c4a3ca173e41ea952f9f1e6044", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "09656c65a38127b30889314835e84d7a1aa3e452e2463824630b03543eb30f28", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "10d83fb7d5bfea533aea8f50b6f1e0351ba40f923eef9ca2cd9422830b3f511b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "124bf966c0107b81a451fba2c1a8ead4453cde3ecf8a0f1f2138c52289b971a1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "16e7aa6a9faf8829ed6b2cb09791102aa60a9e1ca46bf001effab0c121debc81", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "19cde0c7d3bfe3efdd7aab2837384576f73bb878780062def8a430393aeb1bc4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "20b210f8a7b73e8e65d63bc66798247f3e3b620893a16d1a93c95e846d9edef9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "2148a05b4ad6cbc8be47d78fa35f744ceb3e4b39edd7f95131148a4591010515", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "223d9b07e2bb41d4572c430b511f3f535d237d83a6d295fa68ff565617a21483", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "24c43c8cbc3ce8fd9ac07efa488601e0e315bbda8ff891b1e864dd06d6ae378f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27842061e023d606e2f2ddbd794fbc892bc7409a4764a11b0bf43ae7d356b775", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "2ddb2f01541fd3c2e92fc04487c683945d1e7c1c483040acfe8c14c150618b10", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f98d26cb7d1f7c035d80d818e77450cdee825326b0fab336808c83e3d8d574b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "30bc18622c4d7e662e6c522a7686e54f6f829b67cd8955cafdbdff0104e316e9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "360261db8b9c5fc1cd402c7d92196ae01b1a6e86239991145d129ebb3404b2bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3633e50552430b75445f54476d03fbe3b1eeacf47625561132cda360fea6d4e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "37fe36651662c0e5a099bc8d49763f503e6d17d68f8d8c50f69e2f548fa7aa08", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "3a105de3c942a3ac86949e994a71843e44b5a0ccbdf84e8b6232d4dfa888a422", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b0c072b306d457ca624bb4a065146092350c2d659bdb317631ce3cb0be3be65", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "3cd6ff29a12a2110592fcc1e853857ad9cc984ad24c297c7be65273285029b91", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "3ece2fe451fa040351ea62c3df024cf7af0e1f6f8b06f6cb8f9c1e84e2a00993", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "415751abc377f553481eb5c17278cbe9e39efd4083d9ea4f7f953f117d6e9e2c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "4243eab27b666b38ea41f29b057ce49b105bd3a2f1a6ac036f614a1302c46414", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "4645f37cfdb983b8f025d3a05d394c395f1b581298d989bfc567ebf10964b614", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "47a545f4c69774fbd9fa0ed5850f6c303a1ae8ceb2ddfac3efee8ccc41d973b1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4a6c3a0ad2e96d6eeb52c8635fa900c898b362666e5e7f56f7968a35a799b2b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5de8d46445c02fc08569fb48a2a81d8df73a6665f0c219f7f730b78ffe1df39c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5e3c2ffd7c58018fcf021e622903181446db8992a3b03593fd52d8e779f6ab21", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "634f96d74f1f7c31683bd432fa1d1a8306d340acda07794e69046aa28c1ff9eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "63d25538a14202e51573a24aa26fc1e601f4124957e4481c405b1d369f50a2e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "68272f541e1192816ec38c0bd603d913fdca23e305388dffe16d3f22f49a3705", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "6b078726793b1f346ee08abe9c76d384ee72cc36d1b84be7aabbced961d86527", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "73301f185dc3c5845bf28e7bedf7414a3886fdd30a30a12557850b88d6e006a6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "78e271154b9ebe0a17e01737c2fccfe9c373e2e326e14a321fa63e545446b720", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "7b0f03a5f51621300cb9917877f60377fb592e4ce695ac4a900a16763950befb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "7b50eb63004c8218ab30f2b18bc68d65c6f37ba0a44655b453d0178177261292", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7e196b7a2f3db885423257b349e3de1eac694891fbd9885392352a1bdca8d9f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "7e34b652f76c9491ea0e464016818531a80f6c58143ed2e8c54f4cb2a63102d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "7ebe216fbba61e136b9fd4580345e4f7c15b4ce7386d672805becacf282be760", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "836b394d72263562145bcca81322e94b84727c72498047e60345b45eba2ea28e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "85667c888d543af8f8fff753abff9399eaf652b7f7edc152944943fbbecd2258", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "87fea68780a248ec14bf9f4a6a13710f02d9d0326f32e1e5eb4a6e25dfdecdbf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "8c06c7d69f43d07397238ebacb5a187f7c734d84bc191f96843f17a715ceebec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c099f9420a01a00288371511ef178f23d44c0e187b8ba967482985101328a27", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "8db7e7f777d27dc40106c543924637d7dc2dc7176ee4da794b14378cddba73c8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8e826761bc88aa675d3caf490b796292e377542b861d04bb4aa1c5616da88f86", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "8ecd44d14faebf32dfd39e4d53752309b2ec052c5744b413fe2873d53e26a6c8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "90aaa76be66fc03ae73e50d6fd74bd657161efa13b15ddc1815345ddbd270604", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "9173be13e6942ffb21485434d590de97a16fc7dc65c5bf2720e091ea5f11088e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "9c18336be2728fe6e064a570ac38fa23e9f81315fe333c8f170553e4c62d3152", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "a13f67a9ad557ca01608af3ef30e0fb65b6fc097cdec4f506765ce981f955436", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aae943e0a973a89a98533b88f4e15d39c8efa40410891f410d1d8e9ed7884bf3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ac2c7f4dd911154a9fa3356f0fca436e62d5f9b889865028518e5dff28c1e54a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "proof": "af0272bd6d7e1bacc722d7f3545e59cec4a4d9107970780adaeda5cd5aabcc6c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "b593165b526610999bc2c6699e17930616d7c751e72c4544a5d5f57222147327", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "b5ad7baaf43cd8ee1e78877e5f21a5adaa4a35b5a7d22acdbbf263d62367ba14", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b83ae82850fbc2c14305560a74ec8a76eb36ff42cb3666a3c3a97d2905630b36", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c46674b1d6ae38aeb28586830e0e59a9fb6efe25d3240e1865db45dc513a1c0d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "c4f333779d656ec934758490d24d17f137dbd9463276d8720058794d70f6f6dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "cb1bba0fbe6af1511b2000e0a95455e31080403d0b6c1273b95caa569aac70d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "cc2334958f4db4baa60acf65ad0b24376919154199d01d5f63e0a9293d2dc890", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "ccb27f0d011a6f3b7a5e30e4d42d3052335c311b3fd7d1b4beeb66854040d49b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "cf2d9e13bff5c405de013a45978aebb98e4331b015efda15ae3a9ee00e60b8fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "d6220c9b305be39e0ed1b263eb9cc6e3eaeed438d7f5679d88371b6e8890d58d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "d8eeafcf2c51b24e1f6da486af01ec3595385733997341cd36cb00cbaa57f942", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "db405baeba24b246d55a499293d4574294dd3d8520a14eced7807137ae7ffaa2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dbb2c8d64c98d974c088370ad78923da7996b413c9682af63dbfe5d423825f69", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "df0332ff578bab7ab7cf7944b8a4f07fe186755120b6d24b07e6156345b5e0fb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "e0b71f74d114e1776e56542538968f5dcc30fa2b8aa97596dc1ffff0f03ef8ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e23187f5f3d44bf4bc0a2c044bb5fdb14acc59adb1dd8bb8a999683ebf583132", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "e646cd7653127997e6e5398206d56c32065f1446e7b231d55fd20242c344f6d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "e83b05956ad3bc6a4b51a3a8d8f4dde482cc1051d5782538d908bbd291c7db7f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "ee39ba2453d647a3a5dc32b41964d47ab4db19ec6ecb1b4005ae5cf1f70e149a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "ee69960b588681d950c3796beab5d0f2bbe5b9a00163e7a60f7123a7089b9a1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "ef23bb571add158f20028d0cb4c05f76a08cdd4355c3329badbfd38074a1fa7d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "ef5dfc7f2dd63a62be6c4df54c4a5ec9c7203c9208eb275467d96f819a6bd93a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "f1d6a7b4d2d86a8472e56a64d9455fad9b47a4d757685ff69bec207a00dfe1f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "fbc43a807266da82e38fc38ed1e03d6061e6b251047f98fd009f22370aeb57e1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "fbfd82b84f9b66f2d977885c32dc59fef5c7efaf2e436adfd4974faa1d7166f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "proof": "fcb9c4ca0204f2f97c3d5b590d1825bd1395114069e9d371b92c0ac03eb0d769", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "test", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13ledethatn9a274xjf89u88kk33w0rljx07sy2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e3aa74b7f16a4b7d33d2b96bfca296f75b2cb81a2106e3c98639e1a2d05d7211", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13n6jyhkdrs92yqmeqvj5gr3cc3nqa9fuc4lsdg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1f45e9d0c160100ba456b5d29defb09b62d124f1c8f6a20a299f054aaa57a02c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13n6jyhkdrs92yqmeqvj5gr3cc3nqa9fuc4lsdg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8143c7c052fe446880b8659fa5e0e683cef5e34982695892f126106c7eba6630", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13n7y3k87m2ds7zcd6002kje5wazygtvkleuprg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "98f2bdc95283c9e0d3924554ee18c18382d219099afde797d3b142696977c779", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13r92p5gve08s95vv5gzewf9lpsvqu67223zjkp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5bd77371618f502969a6934fe58fb409a4f97101a9105189c583d953bc2e73d5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "07d56d3fc7c68c933505d8666942a360f08be0b2d184253b59ffed27901d03f7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "1ede1d9f965f8a17bad6dc8170dfcf8e9ff2d7098fe03605051ae5f15779e577", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "20af965e28c0ab758858e041cc85c27ee0b69b1da4c9c0ed357ccfb109642397", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "440313e666e6f94f3cb2b4a3428c077fff2cc86c8add312d3f600295312b8c01", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "50b1d915d2f751998354d4c2e91c9f2c34f109785f698c6a993b7289ffddd640", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "55708468247ef4498bcb64a31217c10f04fd486786233e485cabba8e673a0680", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "5f632aa87312e49b9efae68361d14e44f7c2231e36c007826a963cd6682924c8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5faf0a196dd48ee8acf00ef961c1a4c79ca2468f75a4e1b589c37725be441044", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "664d5665033b60fb0d8995db70f7baad4f853751a4bf60bde2d6492454c0e82e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6c701879984d263b366a71a56ac21cacf2e79a3ddff24db2290b924f81954b26", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "6e158322bc4188b8adcc2df6bb79948339e1e5ac9217a18a207fcd25cc6e6af9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "7ffbb1d5155a9099fd3f056f8b34853ffa6ea7150f82faf6b53e8e4ef0dbd633", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "976be393272c809e274357d9fe02176a081118919e75260e98852cd70d6e3007", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "98f559877a2596d917f9a7a0f7440ad6ef22ad4e031efeb13fcf04115db1da3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9a794f0b451d03c6ea3cec10df735032e8cc5025b99e6e6cff40ad530f1fd689", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9a9c2eefd05c90ac34b7982e62d1763907e903272d129bd00988ba3836eb4c5e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a71e7548ea99879473d6fd207fc0aee7a269445d0eb21f95f433d15458cf9f38", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a72de9da80eb6c4ecf028301356d6401c84cd3e776132bbfc8b627247b8a5ffd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "b08c1579f9ddc2d14b921187f827b7c8f9c40d8143296de883f1a294f2b5e24a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b1d1daf87892291a8eb96e4b7e65bcf04b9689e328a649b2d8ac4a59da269666", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d8927e478bb1fdca377baa0199c30a2c60fd18c08b7eb2a9395c35b166df06e4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dc05f60cf1acc44ca564b213727a75ac7b9a80005954c03f0449b8e471af6087", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "e5431b96e931e58ea30b6daf50f9e9e88b4b50b5adfa9eff72f506d9221f98c4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "f1f393606f32440e53696cb203ca772294992d7685355bf3ad2883be4614c230", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fa817c3576ad8338cdc9bebf5bedc7e6a48372d4dd779cf90068d81aaf388806", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "fb4402504692361e434297a0ef70996adf180e478c308270a62e0ead45565998", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "fd7ad515b586b6ccf124a9222bd306440f606a7cf28d83c551ea34793606eb70", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13rspfxg3qllwzzu0u9wn8pvgu382pqzz69853v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f250b83b469f1a06c7ce5c0904336747c81b0712c67b8a63cf7e99aa16f52268", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "29b055f10f6d98f2f004d84f920364cabc499c792c94bed99944d82f021c6fea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "313694761cf37414e133e51f3a20cd6d8ee936ace648e859947deb55d894b1ed", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "440c93a9f0b8f41e3a2b12c9edfcb9b56d454530fa93c18dfac39f7c9eed5a3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "91977850fd313790913857b632a96c9246c4c19732ceb4e6e234eba338575e5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9f5474fe1e4d50c967e2b29294d090bacf4cafcdb2731b0b3665f6aec819c329", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b33180b2befdf8023ed11731754345e56eae6d1a8ea55cdaee6480681358fe8e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c1b62724f215b6a68b0451885947965e136d5709467f34b14a7b789a0511b535", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c46af24d84d662c44ead8c8e853393d2dc0a5450a4709b4373d482d36189e502", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cf5d788c1e9836410ceb67acf7a0f49f664f7d7b7eb72ffdb683b25a1b5952b8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e7317020c1797a5886886d379c775f4df342ba2559fc09a37c9a8fc39e4bc818", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ed3b9728ec4da95b5f1e63f85e2d033f6fc35c400c13e289526ab8640f0becd9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f47f8ad40ad0dcbe555cb7300bc841fe4427be2f778997103dfb04fbef1ce886", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f890c0c17abd4d466c0f0dc15b7fb66f1071c0718f176a4b76709ad9000de801", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fd827f82b11d37ea9c20cffa91b676adcc97c42dc7198f3cccc8e713a0b1cf12", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13tlmnzph993ujxm7zz0g9qww7jldfl0hk3k0lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "93c8a019753dc6bae90f85e8c7977d87075a677c5fc04efbc42481a8c0511ac5c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13tw08pxsqjtmrp89t0xchmh7hgtees9daqgw70", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9d9a5e0c4ee7f1a45ad595fe2351fa3d96f4f9b64c97fa488c35e7a21ce99511", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13u6wjqnzetfkpuwujsj8403yh6272ygrdrvptw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aad9811efa3162de4b7a2cf82470f72c4786ab79f9395ee8475fbe7dfe6d09d44f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "36fdfea66cc488b6bf4ddef33d57c876ef5d2c1c9963b3c977cd2988f224abd9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "567fbfed49cf088ac5662f24cc2d2bba9bbf51f40199d4e09f2f4bace0773724", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6562b0332fc5a9cece76260036e3119b445a0948de8afd2b15f013d128fc292a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "781e1d9d1a18b86d0cc891f57baba97340645a58f89e03f3d281fbe1bf3e616f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "7c9393ba2c55ec086ae1c1bf9adcddc6262c1ff3a69047c68baf3418ba6f45e3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7daf8a5afbeb76416c90e25b014e9ca559cf7e2a74362968d8f65a00d574146f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "86a3f724eb7ef2ca36b7903c0af1263ff72f0bf07865797969e361ae707ae321", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "874953c4de0fe209d53706dfafcf12d7b9694b563f3dd44dff6ea45644250758", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b3e655a9c4e8e8c31382323ade6532b41b660e0856ecb2be2dbeedad2c5022c4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d0bca29db5c8d297a52305fd3b8f987e651648ae0ec70e7b9b1eda74c388754a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d201a46955ad636af1e5bcf37daac4c72da7ed5f0b8a6449ea90187b1ef991ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13vts4zarv5n2z73flal844flexf3gtqvvajfc9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "78ed846604a27e78f7b9b8d682bde0bf285eea804647552c6edf25aa0935d803", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13wvrkd4sycldtfxejet80w4vmw3clvfy55wpqc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "14229ac1e97c89f2b17e575d7fb503b9a308fb4acc001bb0ff0bfe646f6a0d861b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13xu4s4j5zcdfzfhuq6ttdzun85g2q0hn2vrpgv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b713dcfec74513a447b3a5544605416303bf01f7763382d3123a591f44ec52a4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13xu4s4j5zcdfzfhuq6ttdzun85g2q0hn2vrpgv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f8571a7e70cb2ce358a6dd50ea3509a81f132227180a14cf4c66d97f3b839dc0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13xuhklwrp64mc7egr3k868j97u777jktwdteal", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4dab81c136fcbafd63a90c77a12782d9d5d7ca6cf33a90166533461f168e0e8c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13yxmhe2xsy9lh3prfleclnp2rtpp7dtpwzlewm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ec24d0169b248225ce2a39ea2de4735e88b0ad9f26c1cc98318cd29d79a2c698", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13yxze9wsaqcew6hs8qedu6fvnl2j068ftwv4aa", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b447b781f005215d268101a63f5ad375a62232cc1b23d9d741d2aaa4cc237fce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger13yxze9wsaqcew6hs8qedu6fvnl2j068ftwv4aa", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "efbe324fde7edc9cf89b2a7a0a1cb3540096fde814694edeff10fbc0158af611", + "data": "", + "version": 0 + }, + { + "holder": "shareledger140kjh95n6td9lf4j7s60gsvfhzfq9valyexj43", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b3824aec4e36d9b59176ba8c295216c20392a7ad48fcbefc1367ce31d2991ad815", + "data": "", + "version": 0 + }, + { + "holder": "shareledger140s8dk8sx9w5yd4vk8axlhe0xqulynazvzauhv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3994ff5dcbdc662563ca699ea8dc0485cf78fd7623264f64c8a49ef91568a974", + "data": "", + "version": 0 + }, + { + "holder": "shareledger140s8dk8sx9w5yd4vk8axlhe0xqulynazvzauhv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ed59669aef5ac6bb25e780e148afdb081def3aaf4fb6d84615862b044bde8b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger142a5mx9kz9p9qw6tc0ttst5g42yl06n02pdea5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bd70e06e308ccf441f1cb877028b441c47090f6cfc1b1bd10b4a935b0a24b2e0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger142awx25tnh8kcf8j35fwrsucp8kgjknzwmtn2g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "770c87f9cc84ab462ff4072060200f5c4edffcf13e999027c7caeaa56ad262bf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1432966tm58820zz8terp53w9pmvsh6d70p4pue", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bb89919fa7aca8ba69bfd7b93fee0d6dc302253f76275fb42bb973291ee4e291", + "data": "", + "version": 0 + }, + { + "holder": "shareledger144mrscguprm4lw32r69yczs00r4n3d4dem5v5w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5fe3c835ee1cc26eb287ae4ff52a9866f6449709e2959a56ec76b8697247e10f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger144mrscguprm4lw32r69yczs00r4n3d4dem5v5w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83fecdb4998ae3204f197f8bc8df417c4fdcbfbe77e8a842228fdc15153e5a0f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger144mrscguprm4lw32r69yczs00r4n3d4dem5v5w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f324b4695257104521dc14db91445c07ef08bb599ebd5b874eb5afb2640b88bc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger145yulsfy7hd3ry0ulxneed27fh76xgsf5ze903", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d721a26b79c1c7dc5282587a0017cc921b152ee95bcd912848984de5853b6dd0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger145yulsfy7hd3ry0ulxneed27fh76xgsf5ze903", + "issuer": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "proof": "d7cbac556ebda426568e3823934ec9932ebe4583261b9c36d02644a1d75d57b8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger147md59vy06y50gjwfp97qt3vu8crlfyy07fgw0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1930a2cd53d02433ac33bdd9bbd4620d9598cb39dc45554de2a662fdbe44b55d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger147md59vy06y50gjwfp97qt3vu8crlfyy07fgw0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2930a2cd53d02433ac33bdd9bbd4620d9598cb39dc45554de2a662fdbe44b55d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger147md59vy06y50gjwfp97qt3vu8crlfyy07fgw0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3930a2cd53d02433ac33bdd9bbd4620d9598cb39dc45554de2a662fdbe44b55d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger147md59vy06y50gjwfp97qt3vu8crlfyy07fgw0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7930a2cd53d02433ac33bdd9bbd4620d9598cb39dc45554de2a662fdbe44b55d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger148v7f5f9l74wdv3eug5augakv9cgxqxaucnga9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b97785a5679644e69c72665680653eb66aa47c22ab474d4648cec297969dfea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger148v7f5f9l74wdv3eug5augakv9cgxqxaucnga9", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "c422d3ab43239fb10fe1dc622a0133dbe08a7ada9f6355bb216ffef92ae42d38", + "data": "", + "version": 0 + }, + { + "holder": "shareledger148v7f5f9l74wdv3eug5augakv9cgxqxaucnga9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d09f42a4c92240827e6265bbefc2aa754646a04ae39eb984fc3bcd07844772dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger148v7f5f9l74wdv3eug5augakv9cgxqxaucnga9", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "f9a48cf1e4fd91b659a2a39c01d6937b0b7ed8feb848ed8af345742a756bf142", + "data": "", + "version": 0 + }, + { + "holder": "shareledger149gdsgyzrp0nn3zjm48pz7j3dz7mme7j0rtmec", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b4a4f0e1103e5c2932a0fd03d287f82f5b61948e235822e2be8e80ff6db316a5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "661f91f9e4d510ffb214dcad7c44c221fdb80d1320b9fd81fe4c4b440e5a6aa2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14adxd4p47kztmyzd3xcexaxjemwglrqjmxqmay", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "25ab1ebff89bfb3abf9ccbbbbc4210ca3fbf0af5c9e387f52cfac6abd8f32386", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14adxd4p47kztmyzd3xcexaxjemwglrqjmxqmay", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2a2e3f55caa890e02037f7914f2b663e954f5ec769aeba4ff92c44a9b1382044", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14adxd4p47kztmyzd3xcexaxjemwglrqjmxqmay", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8456ef768b712ad9337554a0b9c6101e276a5c405b415a8f69f9153dee013ee3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14adxd4p47kztmyzd3xcexaxjemwglrqjmxqmay", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8bca75f288931aeb8c4333871be86cc34a7834dfabac9ff936588a7099b13614", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14cp043w5g9v4968qjhqtl5f3nuktus977ecz2y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1bf503e0a972a93249ff3b3e4a1794cc6f2eb4e247538de57625b0b6775151e0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14cu5shmu033x68xez6rrqdgudhyjntdckzdjnd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "700ebf75ba91af44ea8dab766c06721cc5a8f1fd536a5643f2e6fb408898678a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14d2an8uf769k0ssl9gk3tapxxwmdgd60ugkqwj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1587f94f6b739a76a8e6dc8000034362d8fee05b6728343cc29983649fc632bc33", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14det2q7qwzjrq50zmlg5chlueejj6v6re67ffc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "521913dd1de8f3094b498aca70ab6b92aa756179bd9070fc900b65682a290310", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14det2q7qwzjrq50zmlg5chlueejj6v6re67ffc", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "b994832a6f309d70e1c685c6a217a4a442fcec1c3e2a0c37d12d91029b7c16cc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14det2q7qwzjrq50zmlg5chlueejj6v6re67ffc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ea2dfbdd349e0847ca2eee1e25957b115100c6a13f41b126c7cbbad4b1deeb91", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14det2q7qwzjrq50zmlg5chlueejj6v6re67ffc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fe18e8eb25a45dead05c3431221527f972da849caf0b33101822e722efbd52df", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14e8rx5j7hup9qhaqhxww94kswu8v6se0p326q2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "03f428f32cd775c2a2e359b0bf74d1cb12d0460b51f7e58c1d11a7e58418f8fc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14e8rx5j7hup9qhaqhxww94kswu8v6se0p326q2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6261efc2fddaf9f53e5c71d39e92518ce5d9bb07ed40d0731f9948602149a605", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14e8rx5j7hup9qhaqhxww94kswu8v6se0p326q2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b124aa0e602f00f3257bdfe7e7b78bcd9fc3093631dc8b1616fc5c6353a9bb47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14eljdkr677kg2du8qq400nnq3pfjdfy3fwd6v7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e156a7085a6e928bcda4be1ce7550d168c931803e7089111500a63419c50946f06", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2586045171f4850a7155e690d097497414b7057a98586529da570b72544bdc9f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2feefcbbee4e4bdf09b03840e2cc32e68df4475581f719558d8f2f0516f8c336", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ca89f6cc0a0bf148c44f3a530cf16107fce560aee72be8ab281b3d42e539441", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "947b5f608ac4f43eff9d0074a67b50d9490f96b95482d94f52f073a394f09452", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bfcfaa00fa07d3bd37d3e38830cd8575a235d24da38c263ee2feec732ac0d62a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cffc17762fd1299cdf20d0fb5e26f046dafbecb650261281fb5eba41f6935adc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "de6ec069091d87428dd6967e82c45912372207933e6a3ccb8ab26ee86f812d6a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e49e2b8844ac1b3c2721b56aac729093bc54f2512b190a1463edf95c7257fcb6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14f66vefkax7h64e5j05a2xqjmh9fk8sywmcjsh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6a4403b584b8e8ba6cf0530fd404dedbfb3a86d51926772085e9c2c1a0f725c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14gupe75jgv9ltmgptg74fjcwwdlfvlpzupz5d2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "28ad11c7f0c402b1da424c877c9b79be397cd0ff759ac0bfaba894f30cde05e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14hwt5kfu83cz84uj3algutddxf63w4nnnnulqf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4f0a2ebb3c5a21fe1b2d13b4b61332d119cf57aecbc3cce5bb61932644fb5e51", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14hwt5kfu83cz84uj3algutddxf63w4nnnnulqf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f3a7b72133bc11243db1a974e6893d639c0ed6004407853b6e877191d86f16ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14jfqttq6826dm0uhnuq48zldpysamnhpye99xp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2abc659a1e700b6d04c570b99dcd93303b8ca99e1f77bdfb4e2dcb025b56702c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "01f22ce965fd0ddf9094dfaf80c74f48f65b17ac9d445183a77dc0f9e7984428", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "09670721f993a8578f86dd30208d312083bbfdda39e89d3ee67548ec6b3e7ac8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0f43ad3d8dc90955175f99ab70cac925dcafa7f215e44dc6a009da0324eb2cc9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aece89eca1c9408637aefd0dcb3048e4d63f94b6f4e883b54548dca423de4871", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d9712c6969919cd85e791b394d671f72df496d425733dee4087e1bbd583beb3f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14kql8dfynhzlugusxhkjfv7rwnrrmf8u08kntk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "980a9813ad880833f7831156b972ccee0c1278fcd5b8517a493196d016808590", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "364733ad8154c680f90fa64d735452773df66e6001dca0597dd9d7a2b15221c7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4a20e6179679ac0a90342d271991e7dc3a99ae40455fb83af652ddec0ab87365", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14n8nfchxx5klcl8cclng28kpchqpx2psaqlu5t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "35482d9ed69a2c97d4b13e3bc4285ca6dc29440c99362137a1c1c9a51be3c166", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "122d092fb5ed9039f086aeb3ccd009732060c4822f086404769455c58bfa4520", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "191b0dcbb7d85bc1000b95507719989b12a7e4ac83f6d8a809a3955b2fe98e79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1d2b3d8d34f6ac4f75f3d1fc60174c76a5550a4a0a79bb0397d2f093cdb5fdcf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "2e78f745d7e82b6ab9bb15de42c5ab878f1b048782df8be664549f6dbddbb560", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "387407c438c226c9e39b8e528db88cd19dda1c9f985c6b5ac91e6882a6fb1cae", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "3d147bf37cba742afdb9524c2ddf14c66057f75aa28ea78411c8468640e6ad13", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "4d947551d17e7ff1714a24d544e08d4bdead84a5cc7e30eef2716b5753eddc27", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "50ebf911660416ca984d44ea10db34a1830f475e673dba694fa09b56e55d4bb5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "ae2757807f2510ebb4c7685c310917e012a82d70e6eca8f7d6c4c862a85bb681", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "b55ddcbc0c2b9f1d020a8bb3805c0715d141fc33f6102287f5c930f92f46fd16", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "bbbe90a777feb129ca96b23d40b85b83c444d44a5bfa0e1b74a2972cd8bf2292", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "cd49807356af6fcc1583c9b5257f113037b790da6080bd6ce60236e08fc5d70f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "d9c4f22f23d02af94ad2a6dae5fdd7538b4316c5fd9afcabe4dc47e45ba1974c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e89d5b0fc8cbb8a198b29d9cb8bfdb1e4308b3a216b72d3bbca57dd85270fa03", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ec97a586675b2d2b18404be0490d99634f30f9717852ac5b5e5a1c4f65d5dd18", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f15f5c6decd1de49219b6c5aeb2ddea1d5585f9b4485afdb1bc8cf3624314427", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "f715743f9f3d17119c2063da9d46ba10bf99b4096a6802a995205a55d81e0f4e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14pa8qj6nxxvjn83uhkgr7l0cr2k3lzmxymq44d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27e8583dd678302a60e6794fccad02aa5d45af02f430c9d42aa610fca9db83d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14pggr7ztg4mqgnqgt2tmns67t77m9ukewc6ylj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2bf8f1617c9d784309b11a74ad17cf48f4d4cdb9ac2529bfd262afe411b2154f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14pggr7ztg4mqgnqgt2tmns67t77m9ukewc6ylj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bfa03e2ede6871deb18fb4921b70f44c3c4466b1601d9e3a3cb9e9913df053ea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14plzqhycl4t2jnuyn93cs5dx9kr3z3936y96y3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1a4d8a2e454289fbc98f0a20bb61350996769b5d082cec070c2098c5cb7808c2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14plzqhycl4t2jnuyn93cs5dx9kr3z3936y96y3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "778b378801a4ec907d0ff52094bba277d8d1100e53d9f52dbd9dd60dfcece795", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14rd047arv87t3x6gnnp8dprenlgdrmzxgpdean", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cd765b9ee52d392511aac59f2c24041f8adca1b30a774500b8c25edd9d955dab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "05d9c357e3c68f9b511842ac0c70926a891e549e58f16ff9649baad0a0217408", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "081736b75d4d9e4df4b7b3c9627f1740c1ab2863be17be4ee98d189c10c3a3b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "289158d838c40f418894147c712b0dc84f00ad264f45a4e5f91e2c8b2cbba70b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "32ee221a504a9b0657dfe481594d0c234b73291495625cd6c0c07d1b4ec97f0a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "62c5645124f70d875e9d493667fd23e1aac8b4391d6be03fa10c2a6ffba80a3b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "7bee7d3b3ab51b6fa6b9dc1e6af2d94cf6209e2731e6b10c535c0177da3ac067", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "8d4705490d8fd02d7f2645244bed5473c611b0906217797fad7830cfe3e93b2b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "915d384f89872c80afa4d07bef7b69db289b5bc3f1a3c275f81ad7fc7c87f995", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "b4d18e7a7c757d0b635db0a7cbde312ec2034df515d68c00b30e261536d95788", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "be9d4e769eed5f4d4d8fd65fd584e8499a87a45f63a5b0be5b549db6953486b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c26917a474164ff80ff1f5bd228f5f2cf27ec3bbb1dd997c9e69844accbd122f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14u976szrthnfh2fyc8tad5l3n6zy8rngmqv4zv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e57cf12ab099fd9d869bcb3996b9884b809d42a8563b498d3a1415dcf2055b57", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ug5mafahm8zgxc0juwdskdn3k7xhxlxhh3jhx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1ae2e72d7580e5ed1000cd566d4060e26a7f9b21133474f4c0406c29a1f2cdae", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ug5mafahm8zgxc0juwdskdn3k7xhxlxhh3jhx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4fc843218f62de70d7c75fdae0764ef1188374c0136f8a1f78547346c2e29d73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ug5mafahm8zgxc0juwdskdn3k7xhxlxhh3jhx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ef76494cdad4706ae984f822c222ee19fa514ca0b2983b1f3b39dd58b2f27f9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14wf7r0l0vc00n2gnd03wsuf2nrgwgunxzy2kxh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b4e9b385e59bae06171b7cf58e01dd53c30429986241e84b210bbdcc87593d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14wwqad86h5uf2ua050uqhdduuywklgvxssffks", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "705b68293db155eaad43057c1cd3d72cb5d8564d48d5bd13e7d322b6e1913d5c50__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14wwqad86h5uf2ua050uqhdduuywklgvxssffks", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "96ca1ef0a5424c21990593086f0a1985924c82e045571f56949103fd1059278edf__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14xwyehu4wcezx78fu08m8vca24k7gvsa65n6vs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c7faaccb83c4d758feba82616b46adfcdfc4bfadf45b6be904e43c796997232eab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "000e2163010828d6d39d1d81ee7e92ee863e018d627b454e59590377f6831728", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "451d7340387ca53635a41e23cce78ad92f1012c89e840e10c31b5486bedb672b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "6c072089202aeec840e9c7811e0138c721b37e9820c2d704692115f255350712", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "8d39b50f4d6c1ff7d8738e03ffdcf0d832fb3f40f149e99dfd406bbdfefb11c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "94848239b748d9bd22d73bf22a44346adc11a46db0f044a1ab93299bac92ceac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "d62a087dd8ec0e937bd2ebc08d31598f4ba9a26f29c4b3426e6e144625f30450", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "issuer": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "proof": "dbdc71a9ed14fa0e6c37c23f5b7f595b1fd3958098227beba3e0dc9a1e9c69a6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger14ytguph48v9562uc4qprg7yjc8tsrk2r7dnmmt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0e4e5f397f67daeb9612a803c57333b2abfed960bae66dfe5af7439686eb222e85", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "02559cc2ffb50641fa98c5af247873da12ec19dda46175928e52a948de2db1eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0884a24537cdbc65d7bade4fa22c54f4f2b374b569964a2797016d544ad4e6bf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "08c86aceea5098ba8828980cd7b073a7d0959ac4b885712948d0889bb949c8cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "268e72064825e30c5eae36fc0ece30b66f40eb9b02760a8c58afa6ffcdad8606", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "53af8eae64c07b2946d413b4f686a17547d10f17b8beabd2e01c39032e5c3568", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "dc4358d6f41e8c1f44a3032a2acc5f8c48ceb4692f5fc9b52d29f25c44b9e22c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f17e848958f859e0aae1058c6c8aa6b332065731251458d6087930b477815567", + "data": "", + "version": 0 + }, + { + "holder": "shareledger150nj6cvg0kjca5dnkjqq3898ywn3zkjuy59v3k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "64f7af8dee51519f5c91f1954f81aa12ef6da6421a667b2e879c5cec48fca99260", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1524xj69y3xf7qpj9x8xduchk6x9kty96qh0wmf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "efb44f15cb71a7ba96c4567bbc50091cb71970f0295d70c279c87529e0252a2d04", + "data": "", + "version": 0 + }, + { + "holder": "shareledger152pp9unk3s7ukurvwuuuc7xangy5zfyddpu7jw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "233e4466e9e25cdf5d398e400db951d3f4ea3d12a732285acf013625934607e3", + "data": "", + "version": 65535 + }, + { + "holder": "shareledger152pp9unk3s7ukurvwuuuc7xangy5zfyddpu7jw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3bc8b588fe30ac38ff96c1439fccd61ee68f92a68f38beb76c3c29992ae95d6d", + "data": "", + "version": 65535 + }, + { + "holder": "shareledger152pp9unk3s7ukurvwuuuc7xangy5zfyddpu7jw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a2827f18198779d49088b01b64be7b6f3918ca5b4d90d04208119324848f8cb5", + "data": "", + "version": 65535 + }, + { + "holder": "shareledger152wmax63ucpfyhpypnleu2vuv5cuv66mrcjkvp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97067907c22f15bbdf8e7bb66edacfb86479fb2aef69ff32ae7ea9e26ef82b8661", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1537dxn3423ef9phrd2v2js7h4ygyy8n5scj96r", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627978370350", + "data": "", + "version": 0 + }, + { + "holder": "shareledger154302njxw7ezurlwtj0ajqfakmpla4g5qh0j9y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ef7ace9010d221364202929f553d9c9e1429704642e46e967369acba7162ef454c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "09093a8bf7f446f6dd1d3a5f1a36e429d034804241b8f3384e4ece6f6bcf93b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "153769b1eff6cb388a4c7065f8ab6ae70026f619f75d2f420efd4064ad440eaa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "417a050f2f58e90dc44a2127a64924528d038ec5e0402ad11b285feb58054938", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "534a64bdc787462e2b396a3626e7bbc465d7f41897cbbe6dfbff5b62e1dd480e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "78580a5b3d5adf0faeb4e9573ebd4977a5592334b9ad024109f83ee5726eb234", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7eb812e9065d6b6d60dc5567fd0d1f5154361fd3b3bdee54654adb03da24c881", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9490a0dd4985336b6f8a7d554360c2bc45ffa48c11a6fbe82dac78b27e62d43f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb2e83be159c574b3febb2dc5a2cf6cf5b650cffe7e086f0b9f357722a0c7483", + "data": "", + "version": 0 + }, + { + "holder": "shareledger155r7vjt870mdpdsgh5rrwkwgvqnqd6qsv8t454", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d85cc8bb1f25199af4a174431f82bddaf87efb44d14485c67a847ab9d33e1c7b2b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger156frwr8ctpt77c9pjphfztramy05gy07pngadu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4c13f34a0109710ea9ed6ceff7beae3a32c977d3cff630c911252db9b55f2dab1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1582qmzfmpf4mcptlgdq336aqdxr89as5yaz7pt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9c0e9c7aa7fceac6e064fd6e4163f010eaa03e4407cb2552aaca6bb7893bd725", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1582qmzfmpf4mcptlgdq336aqdxr89as5yaz7pt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a37e689ebe94494a32543c289f4d8377944561865b74421619d9665d5469546d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1585he9y4s57tmgh28cvthslkfgj9lvh2dsnyx6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "40a2ce9ec34561826aa4dbd545718cf6d997e589ee9a2c17ff567f0f6d02706ac6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger158mnvssgnzn4x60w8xmg6gjyyz87qag7tqruvc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a6bb5d82d06559aecb69bb95339c65c547f15145ef6789c9eae1eae9e5689a57", + "data": "", + "version": 0 + }, + { + "holder": "shareledger158v6qsxgv782fhj9ag5vfnh3uuvjn9mnlwtpww", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f521bbadb5e92a120b4f06cce37e016a82405844aa28e27aae7c4f564adb453512", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15a0al8429xqr28jju0zggtgm33mknk470j46qs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4324e2c6f7ca85fb7af1d9bfef7a620f8fd887b94b4cc85264e3ac0cfbb1a366", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15a7kutrmljqyhp3ldk87dd7wdp2f0tmu7l5fpl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "07d0c2120f27a5718a13f059a5af937366db5ebd655527a9bcad633fff3586850b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15cf4uslyjxgmuzaajehzussjz408l975hgfwgv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d46f840594189da7ba882804d3479597ddbadab0a05081b84962249df1833416d9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15cqqddze75tppuzqgqyawtxg3jlte03xp7kxk7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7c6daef1376d9569b9ef7ef83639ad7595128cbf70a22214f342bd1d1ed9fdf6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15cqqddze75tppuzqgqyawtxg3jlte03xp7kxk7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7edfbac09e325ca6f45201df3999a53ad83f8be388a76dfbe87f633777fb21d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15cwpq3m0slnaq0ztnk3dg72s3q5qznjtjy7xdu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b4ce4925fbfa7d3b101fb883a6c28c5281c13ae089049a8cccdcf68fe5860e3b14", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15d5kknwjejw8cfp3pu203pf8yt02wdp792qn3e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e6ea41ed7ffb3f5cf0077a2a6362ee468c0b6aee3095d5a4d94e13495dc39b9d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15dc8ylysuvuw5hsmqavxtn0pd273z9fww766kt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b2194f5342f73b92d74fc2ecd02774555eef10a37162c6862a48f746b72d12a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15dc8ylysuvuw5hsmqavxtn0pd273z9fww766kt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3fd917184a8ab07d9edf1cffa28a80d68c2088b73101169e4253cac583eeb56c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15drupa0qth5cy2dmg4vsus37ryypy8nnspu23a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6a49050b8695c42b54bc2d76c796fb72bc654790eef0368d60742967dd9b9314", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15drupa0qth5cy2dmg4vsus37ryypy8nnspu23a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6fc6441dc01201693f078ee11140559fa0246713cd547427ae3ceca77497a0ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15drupa0qth5cy2dmg4vsus37ryypy8nnspu23a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e0a426ed4e506abab7c4b08092e2684d12759be5dd8048403493930520411311", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15eh36eklk4uf0gsqh503e47fzqhru6pvypt00s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "28a14917cadd992dd6247e101d8e006c930747ba3f9557a071175a7c3bbe513d67", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15eym2877yv9u94mxglppslcnwhsv2pm6etx8fv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63b9edbe5e23291ba573f1c0c64e68c03ef1ad135c049d7659b0243abd0b7b92", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15eym2877yv9u94mxglppslcnwhsv2pm6etx8fv", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "6c397225f90c9aa0d416237efa1c0f22588d033610f7201f9575a22c41ed61e4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15fjm6ncx0wxt7gktlwwrmy0rnrmvtfdmrnnymt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94eba2eb0ec15cdfa7958e37de46d7607883d86346b2ea29bf073733b455a8f943", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15ftguxa96mkgt9d8mw9x3nln3jhgjgeyzy6ee3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "748fb59eb9a10574c380fb62de06a05e93e9a05f187f1a7b9760b3f74c6091fb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15ftguxa96mkgt9d8mw9x3nln3jhgjgeyzy6ee3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8a0aaa518fa7766801aa7c42cf3ab8d2aa9ebea7ab519ec1f33d2fff4fe28869", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15js5zum3d00fyeet6985j9r2es4jurdt5vrguy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "86a2202dd788b97f2e8bd67a7ac0a9475df461fbd41776544d07db945da00d26", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15k872z3uu9qr7d7mhfqh62khw5rv2dwwpm9zvu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4f5122aed4811681b33e9c49b47ceb64641af0582853f7b0986178156846b239bd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15l65tjzel4wtke2x4hc6cv25rqu4xdhc3675c7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9abf26a69ce72181f88c03d046e3e88119959c91cb4723908c4df1462bf9bb6a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15m9c6hqs09zlu6t0pn9cx8mg8skhvkp34w3rs2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5a729122df80fb60b6739eb1dbd74a6a75f9b7e79dedc480f412eb38eb0a55f682", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15pavx33tsfv7lh80kt9m3xl2xxvn3q24e8d8g2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e83d4d45db926957ea6ec4eaf3a30217f0e62b524aa4cd8eac6e89bd447558ce2__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15pavx33tsfv7lh80kt9m3xl2xxvn3q24e8d8g2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fe3aa2503847d8d7236e14b6165a910344d7f4e680cc296d066526da0498666d9b__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15qaesd3a0ajk3klyhmyhdz0mgz55xhkjugj9hh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c79813d2bc6407b7a31fc412d987fff5a68567d92cbd6570645c8ce4294bb629", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15qk9crt99n8r3e75xdhky4na5cny9j26hden4p", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c07262b8ba9c579c70e13ec347fcbba3cea2cabf8b2591fad0114c00f141e40", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15rrvx70pvecuxl65e7yf7mhz6lhgyrx368xh8y", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "1fee1e3d793e7f241eb6afabde1ec9ea03af1499f21454a4f13987fb1a87b123", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15rrvx70pvecuxl65e7yf7mhz6lhgyrx368xh8y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4161502badcf652acd7e5e133b199f215f75ce2ebd4216ca53fe1bb3863d1f3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15rrvx70pvecuxl65e7yf7mhz6lhgyrx368xh8y", + "issuer": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "proof": "abc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15rrvx70pvecuxl65e7yf7mhz6lhgyrx368xh8y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "abc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15rrvx70pvecuxl65e7yf7mhz6lhgyrx368xh8y", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "cf8ec19acf0ba365196c13505e78352936fd3311034cc3e8703406b40527eb54", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15rrvx70pvecuxl65e7yf7mhz6lhgyrx368xh8y", + "issuer": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "proof": "proof-data", + "data": "payload-data", + "version": 0 + }, + { + "holder": "shareledger15twsd8cf0fnqejs699ud5ypye8s666kuepyk37", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0ca0e6f20ab570ec47b40f9143dbfe6043665b9c0a52f1d4c121d0a6019e821b1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15v8c735zdj9fz5jcgp3qjqulhejm94d2a27kal", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9bffe987234482a9432bfdc500d0aa27ce3cf374f7c5b5ba748db571741f7cfe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15wqk3dutkqdssjdk7h0x6md9tdptad6urxmgxc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4161502badcf652acd7e5e133b199f215f75ce2ebd4216ca53fe1bb3863d1f3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15wqk3dutkqdssjdk7h0x6md9tdptad6urxmgxc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b5d8bdd4d643383ea316944fa40ae9a68d06981da3784af0cf9b092fa1dd6ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15xscpwy0w6jc275yyc8asncec3yqg9acx79el6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4ed0d18d8aca725cd6d6b557c0fd7c57c9eab86665859f1088abd2f3c6d6658037", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15yq9tyersd73yxgwnkk2gj2usfrt9mwju9n85c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c837ac4a315ae378bdf9e9890698cc0c44c503d323fdb6755b1df5167147563f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger15zdme9u6tct0s39k6rzf2yfgt5y4r736w6edxw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1476635dc0fb504055857cc2d816274d362c469865e69069653427e3b49c8e82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "01aa13f70a486d5a7362aaad7df49d1973da51df85ecca952b5ed392cb4251bd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "23afb6b9d3411a5e15de693a1d4fdcdac07ffe547875b8e4e586050b5cdd4530", + "data": "", + "version": 0 + }, + { + "holder": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "87b464486bbd5d9186fd0af7c94377be5d9259ae56bd11754721ad526de937fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8fc68d1cc2d7e3717be63d08a5b38d8ddd5b41c8669a65fedab8dbc45dcc2ccc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a112b7f6bb6cae04ec560f8874b7977e72f44faa1a8cbf6a3e03f92bb17b4938", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1638ynzlarl99ghrcujt4c90sas7znmmj55gwm4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0e383970c5a97a0ffe349e4b4cf5490d8d8eea4aac86023f359a54385df62fff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ddc692f556dc1d8b18e482670a35f7933e81f2f8bfe6bd0134d4b4779f6aedd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ac04b3cf0b793aa2938ad73ab3e697c64b514f8e9260b32b75a1bf020ea9b83a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger164aptzgmwtup4ff2f2mne0edef7z90u596q3uh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eda73b85ea2f51a6cffab802a40eb7d02d9f43ca69caa620d3ad64bfe4ab013d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger164f5k83ejdgjmsgex73dtt9a3nd0t7ljudax7f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aab136f4ccf8bd2e834f608715016c0855fb5eedd4ffb7ba1a548bf9f01c7e44e1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1652jgg7r3flr28nn3rvnteqq369hc3f5mzj90a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "de70cc47a547ced264916b220b61701dc82ca0ad3097a91f143f2210de18cba4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger166dx3ln6q2cnrfp2jk6wsqp6f3l8g0rh5eqxhc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1173d9c8851fec515d2d3d10ff9784d57b56c523449ebef7e3c40e668fd752f2ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger166eyunxatfpckdnac307zpljxluuphl67wktlk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2cdbc327a769012938e6434a6d280bf75c467db3f0568ddb6904dedb02ad954582", + "data": "", + "version": 0 + }, + { + "holder": "shareledger167uc8gantrhvdvnl8kutds6eh7y92rm9wddpwn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ac0b53e1be413fad0f20bda52d6939d38f52a60806c8816c35ddd268c47fbd8a16", + "data": "", + "version": 0 + }, + { + "holder": "shareledger168l086dwgshrd3tafpsdgk9qa4k7ycxe5xvnz8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "045c4d1e1a3a4e1e95c15b6aecd83f98adc9f21ff97a9fc2d90c2b8beafe705c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16c2yeykmt95wldnfr85da348gdmhy69nz8gvp3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8780c25bd790834c7d2c89d9057d4ef1536d860a49b778b5efc3c16845f78c3f94", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16c7p70jmmcufv64awllv0ug8zrkl4kgxzmmeyv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d9842d880cbc3ba57991d55d32c484a3e93968a6d270599402c2c1a443b09ba628", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16cf5ndlhqlzqazth7x246a97e5uf5lcur52nwu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "13a6e6b1aa348d7f2dc55841e2dd964a36ac239a83f4f1c9fc9072e716f76eef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16fjez9slpa4d8u4pjwwdpa09zz9vmj664yn3cf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9839a2f74cbb5d00150fb7135ca8b378cb9abcf2becc35277c34555eda3853b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16h88phth99jmfet60vt8auctxkj2ch6yhs5xzw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00b9849993d48b98b73027f7aa8420c08beb221547c27b9251f094473de40d6c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16h88phth99jmfet60vt8auctxkj2ch6yhs5xzw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9b8339468487be5bd87b55a4d9d23c9ef0075816bc797bca60bee6480ab643fb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16h88phth99jmfet60vt8auctxkj2ch6yhs5xzw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e8a27de9d66dae6d31dc4411c87c6fc257bb8286e6728cb29a35d16b1cf7ad3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16hfttxvqwxtyx89t58s3wq8lvhfcyc2h8mzlqw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "722fe4349e2433d9ee5191fc5a3745cd684efe15bdbd9984f4be300d93482ac5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16hv3583nka9wyx7px4l3q52lkv8q89hv5w9k4n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1cf70b52a93085bb1e813d56632e6391829f16627b49f5ef19c370afffd6b7d448", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16jx23tyjsnjzj8hr9es2j4unvnddk558dukf6n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ab6f3100df01305b929a5bedea61038d72638bbe9d6c43e05bd8a724f9b748581c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16l0m2x0mzwzl3jcanv99f0c4sgw6gcgp7sllaw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a34ea173e8fee37235884da6a47cf9785416e9f00b51ce39182e635f9716454", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16l0m2x0mzwzl3jcanv99f0c4sgw6gcgp7sllaw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7c995cabfc3cdaf35ded3ec4c6d6e6560666ab518ba532ed8c4cb322826c71d5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16l0m2x0mzwzl3jcanv99f0c4sgw6gcgp7sllaw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e2bf4a8558d71d27e44d06a84a0a2d6fa204485553884e0aaa639d4760e4ad95", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16l6lf035zt27rsa6zkncc8znkx0z2ryaaw7atv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d20015a908137882c8b9c98a3712821a6036a00fd1b23a8e70cc6d929804509d17", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16ldy6lzfnwtpvdplj0y60nznue2m6dfvx8k3zn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e2d4d8644361528995dc830be60b120595b17d8e3f0a310e9aa5b50320389852", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16lva45nu7vk3z8mpjy655tfrp6zzeszh4q3rrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "99fa6abfac73b5052da6cb07c3dc03460ae32b338c85dd61ab2a5e646d9ab546", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16ngynjsn7ul4qym2mynt4dapljty7nydunjdxf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1ca97101e609a3c7c2a89ad402cdbad8001eca14b096f5d9c529dc850584bd77ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16nwaxgvfp8hnhrhyjmcej848r4cezj8jez5t38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1c25b9466eda7f72c61b94d0d3a2d99ed0b43d66a1fcf6861f62702d478d234c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16p34gvqs6dum5sc54z8m9uh3n2l0q9885kwvzs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b6208c50c2d80295af8528c207c050259c9e1d9d79422297f094b5f6fb2b3c2057", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16p47vcgzm492fgj8z3hz8f7xwdl2kqdkw2jt9y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c82f4854d490ac13a31ae57e4ea6807fff1921cefa638523f1615edadda41020c4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16p4jk47kt977xcc9ma3vnzdmxmjeztuylp35zp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fb87973ee5f51aedb054920f9f1b8a3d85c5272836a7922ccb7f7799e738d756eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16p7wv5dteh8jhq5c3n6e6h8zmhhw9pq4us3du7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94129c1e628970c6995f0da3d0e33fd70ac26f35c41e3693e7e8bbd3874b599b4a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16shxlqveys5ddy5kzyz2drnsnwj9g5jzx9j35p", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "164eb9b2e393d31bcfdbc3a6e047b3f4af8760e38d04e23e4d40f94b7b7e5279", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16shxlqveys5ddy5kzyz2drnsnwj9g5jzx9j35p", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "c0ed58e65e0f1746158d1005d578c6776f0922747d90093affa70c9b8be1abc2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16ssk3gd332pe5uqnzcthx9hdcn6g7uu5wg0r8q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "68e5789ae3098fffe6e61b23199b1725053ff3743fcac1db106223cb1f7bda9c99", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16t2fd5ntktk2kuqlkqhrq46fy5xctx4yea7wqx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "160f97900dc8a3365744c6101501c36afb47c038a03a7fc292a5792291e6b292", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16uqkxyxlgjndtwjll86832yj8yma2808wllxgw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7e5c8dcb13206bf37a9e672f4420355de0bd74fcc56869e549728f5562642c89a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16vasxpgf6z2lzmlatwgax7nz80mh8uae99pmuy", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "17a23cd552c35d8f1a6f6db4f17120d6897a51be8695dd20e3ae45bb68140eb7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16wlzmackqepxcc70g8qu6aac99wc6s65sqg483", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dea9253a387778d075a00ee24dea2ed888562c42766daa68d14c3d8238bc609eae", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16xd5m4yn7844ye92mfy79q9jg36lzm63fs0rku", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf8b5050fd852aa8b36b28545ab9c82efeb56560b4511ff7cc89c03c455d4dad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16yr2zjcjjq8jw5u7yzmpvrecwlyfrkal8qg28e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77f35d4a9b84662961012c4d8a6592377c33d4392931f0a19c519dd83932898724", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16z3cry7cz5vttk975yx40hxfyrcndkfhqvd2r6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2cc6395e6a442ab49e8a75ceff78a01ddeac221555d0219dd286a7f3e227f695", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16z606eer50fv3dm8fzp2545uyrlley9ychzhcm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "03f758d0e68c4585c834bba47aef4a1ac4337aea8f1d7816f52f95ddad1e1d75", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16z606eer50fv3dm8fzp2545uyrlley9ychzhcm", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "20dc35537fa42db311b7acd93078d315e03692cab19a039df4b1bbb96f6b8e53", + "data": "", + "version": 0 + }, + { + "holder": "shareledger16z606eer50fv3dm8fzp2545uyrlley9ychzhcm", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "4fd0e95a31abc1572d50b756b1f93e1e81d33dad9572bef7a7997510174a7bc4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger172pw4m4szzcn02raq733hm7l4yku2d4xrw0ql0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c7b9384887bd51d1589fedef4c732db5947cbd5f78aa3dae15021bef4feec10", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17387llf7h0y533syzhvtqaydl0sdx87jgram06", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5b5c871779a8778288372ea6e5ae3f96427ec41087ee948ca149a6729e48618c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger176m0pep6src9lafatnfee7fw8f0u37zzsn9ks9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d3cc891c7e3f9a2671fe7666aff71e2af0bdaad0706d86d30e31dadf562435b393", + "data": "", + "version": 0 + }, + { + "holder": "shareledger176w783dr7x84gpyep6hk8yxttqvk0j2gyekmrg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bfa56bfaa6517ad8bb3adc135977bd86d6913583e83a3736a2e3ec3925dd2640", + "data": "", + "version": 0 + }, + { + "holder": "shareledger178acmgqe8k7vqy4u3f06a3mxk5wwar0zhk3fhz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "66c7492e2a17509c976e493cb52476b108fec0c1cf9fc66652cfb0a1d629796d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger178ydqnqg3d3yesf57uh4uvrfzf5xuccl7fjmdv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00d58e7c949654aba33b283a9837e25bb1da9ac844029a7f217005c7fec4e8f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger178ydqnqg3d3yesf57uh4uvrfzf5xuccl7fjmdv", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "71a3447649dd4ff78b673d27417199af756330f448dcfec590a198bf387f1c57", + "data": "", + "version": 0 + }, + { + "holder": "shareledger178ydqnqg3d3yesf57uh4uvrfzf5xuccl7fjmdv", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "9c896e86477a1849af8b92c73855acfb66851a5c658411fe0064c74e0136d0a6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger179vrxfx6xx2s377va8vu35t2l85c9u8s4u5s8m", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "158a280e278f2ef9f6f56c6be8fe6278787af97ee0fbdf5359e1d1059ecd8beded", + "data": "", + "version": 0 + }, + { + "holder": "shareledger179wjceqm9fvfqea3tgfawmt97ykhr52tg65lhf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8f76d510a2fd06b62d5427f418cc1f0c04b13f4e35446fa723fcb723892cebb1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17aw7lwkanec4ehd48s7mdeje04yz8yzs42eswc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83bb69973850485fe69ad90f4eb28b630f60a41e0f2b099e88ebf417f52434e6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17aw7lwkanec4ehd48s7mdeje04yz8yzs42eswc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ab74576a8dda863e54d6b2e14c1abfc42a2634e12097bf5cc50fa88b3b10a88e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d2163794cd3b069ae71646fd421fb3b4924538aa52dc734111a91957d9f7799", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1a977bb65f7f37f947d8f4a1da21bbfcdae04e7611b948f6f330b4dce29c8b90", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27aabf53c4d2dbfe2baa25c94c6727200a965e95df518fff2f67426140253cfd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2840c8ebfe64dde4791410c2f274d165736d17c56a94f56f7e0b159cc25e8647", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3011e1644047f1857f1911376c0a0446fc7dc20edd70a850922c114454dc04d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "309870b4b6b10f2c9d34e4005c10330b7b9d583e0652cc6ea5d22893a9bb2731", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "394b3af692bae9522827fbd1f5b833bf17c15cfca391c836fac43d6ee5c527ca", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5331dcc85395d9257e7df05b2d128072e6e5878a43d73b74b8a0300ddb36f05a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5af0a4687314f364fa5b8fc1309d198d936f35b3b9e1f09724b9a873c1b060c2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "656ef59a4275d846807c5accf83adcb8dda32430f8565012b1f1a61aad6fa47e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6c34597a1e65cbfe629bc24fdb4f258b016075d7694f6f74853c175cb3facda0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6e7e62d0d58e8d6ecfc2cd21fabb1916cf2346e32692665eb032c53bbab2eb0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "73979c37625d20628746d7116c990456315b264f7a36d9f900c8b79b164d5ede", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "757b2227c023a021eb63674cab8ac89d947d1179162d25b4521a49229f9bf8f9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7803833f6f14e2d3fe4d4d6e39c4fe745bbb5dc49c4936934fb8ecd289d256f9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "79d1f9a556ec0b31b565af772153e4f4e53867211063bbd6562a578538f2d9f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "80390c43e50055bb3d37907f25fb982156b518d0f8bbcfd9bbc1f3b98533128f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8599880b0e94953de66d2ea26a5af72c27d85051f8651e4e492615b07ecb9c0f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a6eed0d89ae52e768e28d2ef0382ae38d97ef49af3d2a9eeaf1d6f5e992618f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b2ff32fd9ad191bdaf68f5aaa11c7702b5d10fa5a005df092f86d4199a434969", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b858f7108c7b51c0efc4aae512e84e0828dec38e210c15fc19191c74f0289913", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bbcd2566ebb4cbcad0b5f279638ea7d28c9a56cbcdc47f319a4ec2848de9d93a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf5bbc6ead09a7ab5f862b796be245f24360b86a7fbe33906b8b9186900ad953", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "proof": "c8050a1b831abb341c7342745f6bc1743be2b95c1d06cbaea32b4b23bd0f5328", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "daae30e7cc1e01ae98984f93edc93aba07778c405dafec7cfcf3845d37802b7e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "df4636dbf1e5e652980c5ae7a8fd8ebc87ebbf345ddb8fbd8cadbe28fa041cbe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e496dbe99a80c195fa391f46ce0d83ceeb99f3a1be09d044b16e313148d8d932", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e930b52cfd1cbd14ae9a654dae956626f0ee60cb83058b3a10cfd3541e8ca20e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f2c9ca2b5fc49dd4025190db4e0bb388c995f02bf68e88254bc2ca5905140995", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fadd7b50e2747d4a71351a758688eb4d7ee253ae476049a1507bec05471b2713", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17cdmmx07qn8wu0480hts6dhgypnymk4gwap9he", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ffd17cd75fd07dfe85545ab50b642b4df05626233ee3d07852979c667678ed7c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17dcsl8ulahzf49d0awf0hswnkkdfggq7sev4nz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00a0de5a613729f0672979e0478b1e2d99511ddfaa9e5fced6be03fcf0d99b1f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17ddtnjdy6agtqer234ynsske4tg397x5mus0kx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9058918ae1ec8ed81a9d0cfa16868e7454414b3a040248acb663d809e4704a0a18", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17e5rltjxnwkx6sdgkaayvklpj5ksx55mmnc3m5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "933f724358d7ebcc6f4efe7d963e384fb352279d4f25a1fa923b88da78d4f69c99", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17f69y5ml79f3562c3wakud5074kjua278fktrp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4c9ff9a607dc55e62f1c005a47a45b2e6126ab5194d75090bc321ba410b6e2e9ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6284b908c36772ccdb9548a83f18f5ed377ff2ad4606b76c1b5240ae3b581a1c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8cdf0a57c28482b97d0783aa70c08ba933b9016f917aa1635ac8f89edb4624dd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17jvv3fl0gtxr0g0mukg76nw3c5ssjcklz4nnsp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d7ba05e4f0ba0e815c81dae9fbf31365d9948a37469e5b2d1bece0970338fd89", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00197a1fa53e448246ac187aa483a254bfb2dc116b3f86ce595e6224b3ea10b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "10cc2280239607f71fc42779b71df9877e137cdaf42764301ed10cc7a0448ecb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "141b60d8992ea4bfe66fd3d5bf9adb5bab5ac0cf261c5fc178f1b2658c80df92", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "187e24ca56b4212fc380c35fcc72b8727a78cabad04d38abd62f0fce4e116557", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "1bf92326d4ed61ea5b222684b3c9234270144dde3698ad377c28b1a41155b681", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "1e79855da184403b08d51762c2bf7350ff6df42dd61f76611408e26c293b10f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2c65904688116060c66b53b9c9ed43cf308891c29eb0ca6ac9c4f453527e30bf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33fb237eff94a463e5cd53afcc6fd0719a115db54edcdb61c9b4818012734c00", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "354d6862403624c4a4df26b6b130afb5ffb572c1fbcb592efeddbddaffe0faa1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3895ec40c2a7d9316bb82d6810d4b8eb6cabc5d955905dc572becd9bafd2a401", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "3a083d8ad48082539e1d3e2960438350327ced9ef2a2429e1358b0ed504d3815", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3e8bea03e54f9ac648e0237f7fd4250c66e496ac648aeba8386f59d99ec66aa2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "445be4c7b4cb8cb6fbaaba44d0d39329492891f15c6f0438bba9dbb507414caa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "45531da005a9d817eb898c4cc50f1c466a2f0635d719d18c0c404091e47b8108", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4557bab3c81667350da6efdd1d862a9adf5396d65b6c41c7308f4d4177bc1753", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "474a764c1e457d3cf60d6adb5a4a7cd21fdfba0942186c97953f8cfe0ffe5923", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "60b58c6d2201b8be1579263e235d6078a9a8b373144944d30d31fd153886b6b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "64d7ae442b2a7eba66d638ec4005f5e7fe6c4f9315ac9963cd7c86e7e840b65d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6c402c7cc99d0ce416333a9a84dceeb92b9763c478a48766623b48ff2265c277", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "6ca4f104ccb505abb2feafa1e8ee41b3ceab50f158adedd553966573ecc125b0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "6d9a173e69296e2860dcf463990ab1b02bdd8b4edb5366fa526f58e402b3047a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "6df73019d713b16889ca19c0128aa8e4cf21e26f86d3adcb97a908f9c7a873da", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "73da6b10661f424e353f8495bc56189b68dd4981b4ae07480d1c41ae21545988", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "76ea1ec51bb3cd08d18b03c3a9e56d5fdb60aa8515c2a45f12040ade0ef571da", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "77560a454df06e3d48163c0b169cf31dfb3450f0cd14eda838d7d2ab27fb03fe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "7a28a7de5d186c26e351c73b204c30662cbdbb4e6800ac3ec821b37d6e7dc9fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "7a57bf60e69f44175fc8c4c77951405cc7ef9f206043cee1d4bbb3f846e24391", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "7aa4a53525f9ff83ef6cf863c6a56906f13c429f6163e2367feac472506308f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7abea7a3084a6a48433d6121c73c50e6d594fbfd46a8caed63eb21dbf235f795", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "7d607b961c4f1200a722b7880a7bf1e7fdfe15d7c3abcfbea225e0067325df73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7f20ee4d6492a5597d648b237fa9d448bb202a4d990c09fb537d5b59798a4ce4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ffbf46ee3d1e98c0331e31ffbb8fc4d69451e92c7e82bd32a116eb4ba74c918", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "8e32852606cc16fa0ddcb9e6972640773cb083035efcc99977bf6c941a2659fc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8e826b245b2d4f5afcc7668b25741be8e6b5300e5f92c589db7b1f0321d3b691", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "939c8abcf2a666e344fbd62f5a17f627f198d35c429d32a6aea2f8dbed85f55b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "95119d75f9ee26eccf40d80b96a40856ab5bc7982a602b376718397ca240cae9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "97ae052ae3d87d6cd0ddaa2aa137793a68bbe5b2bc6f039fd9a523c905547dd8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9aefa198274718190ea1b9b979c1317ef712fdffc28b06ff4ecaa634437c4a21", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "9d505153a2686884dc8fbb677be3fd4016959ef233cd7605946e54978a3414ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "9dd495d947de92739eb97f045d1fd59c4176fdaecdf6e948e7527a63ad15dee6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "a82a7cad04609878080b3b6d0e10cbf32b432af5253bd12a5e7e4803f70796cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "aa99843290dd2aac1882bda901418a18619d48c219f806b5693c3186540b74f3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "baef36d5d901fc19b6b018d21763bea11b7cf20b25f83411851f8e8f8991c6ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "bdddf0d6a93a1c1195cce95aecc0c78d37e85c785fb76376851d61284a1ecb88", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "c67694af98783caf8ee24b4d60afdd22f5229f154e883f3726f28aebdd36ac3b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "c84cf6ad045e1cf5f3638d7eac8ae5bb706aff73724a0ac06120c6d01694bccc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ce5e1292cca9032abb6d4ebe1831b670a7ae24b76ce096017f0c4cbbaf162d0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "d4c3204dca0557c7d011c00748b2c50f479d765e16015570ec7f9efcefddd0a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6b2cc3f087867aa333843aaf3d2799cc3a2564472cc77ffa0cd09178f4e6e68", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "d9105fe77c954c9c92c84f978bcccaef3e8648c08a8e02f3741831efc02df53f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da98ebf772fea07bbaf1d4b47cd299cc348d7e3c0ef041474aa16387678e2a58", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "db742ee16500a74a86bab562fb857e12e9aba29d7653d0ebc9e22e2caa01990a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "ddd029784dab3c009c69a035d681134e6f3c2b3fe6874a78c32d98a49c3a4d50", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "e1f5abd2ada9f073fc93ae0603aa28d7f02ca7e141b011f76ef66a8161a2d021", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "e2bef686163ef2b4d1adc984702cf6baa6bc828acc97a92bb1168e1179ee854a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "e6e0be51d89bc065b6361a1d307a0c3efc44e7a72cde5cb35a82ec6bfc29e037", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "e8cbe7e285e1445376399da08cdd0252b50dc8c96b8c6a90c9b68b47b25276ad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ea084c9de19301deeab2f0528af4a4e01abd878e716dda27ed0a1c88155ebb83", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ec68f90a9afe0f1ad9b17966d5b934098877ab9b762077b4ac268e2d9f3de3e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ecbb1b55484c7d46a83e395315f1f7015e1969e49ce6318db9f5562b63e7128c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "ee73dafcfc2768f64f726cb033134135c7cf471c1de140da4a61ffe3bf02d254", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "f5728c4650cd4760276adbaae9a597d87decf6835d229d6a270d2774fbd5273e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fb4cc5024448a2bd19b217cab89dc81e9e63592936dd53d8b07ab66d6d914e3d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "fda54eda777e58289fb8829bbc830d43bf98cbfe26a7bf52f351006030842934", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "ffd69e26eb699f0b7269def7421213dd0a861d4daf7b2c3214593fc8c3c5c9f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17leapzvtwhufhm6fu7hdswztnrgmvksngvl2s0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9ba888a208438a86909dbcd0d31795a2a915afa8389ebe11298fd8d509b5dd3f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17leapzvtwhufhm6fu7hdswztnrgmvksngvl2s0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b64ee764f85cacc3983dd7d483d4981431b8dd08127c06be9de362fa1c96ec4a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17leapzvtwhufhm6fu7hdswztnrgmvksngvl2s0", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "ee0b3d0ebeb70abce5816a8d9bd24215e8b655502d55b70d4ab72fbc13786894", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17leapzvtwhufhm6fu7hdswztnrgmvksngvl2s0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f17b30aab44306615788f714509f3f91782b477835e6e39f00227deac901ffee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17lpqv2aakev8c3ptsv42w60a90q4wfr8e6g6mx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "54cef206474fabe9ea4eeb8dde999aaa1e47a5b337e1c4345019e0b392dee40843", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17ltatawyp4mcadp4zyameagj84fcduz4n40k7e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a0cf1ea23bb9f9034588b16683dfa24f7df60a62b5eb74dbe829084d54e2173a87", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17mudapxns4elmqxzfw2pj0375nmyhydqathxjt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5755aa9c425ed8d68915cea6c54995be218c7e7e71fdc9746ce20f762a32b53bb7__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17mudapxns4elmqxzfw2pj0375nmyhydqathxjt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "57973895e5c41025fcc7ce2222cce0af82ae5166cbfbc78c76b331d343e83a3cb6__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17ne0dn7mur3x66323u8aarv9enp32yw4fhq5m7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a698cb7c1b3c67d917dff952f35b1d5b3dfab4293ca8917795156bfb121bbc5fe9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17nq7fd9gux39pj6y292g0w7epfcgrulvzfmx6d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "459ba9579dbc40a7a717194b410745f934155fd3f3659309cb3c460d15a495bac4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17p3rg9q5c68rmj0sm5xch2eckxcxgl6s9v2qaz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bc8755b32364fe02fe171a0754b28f2093beaa8943db2c46ead36b3133ff7de06c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17pnpg0z7uvhzh3jkh7smmj5vuf27slqq7lsnag", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "24f3d617f44f65a0df455778dc8eb0b4f140938595b6bc35a9d8ab5048cbb84c24", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17pre0r0gqgv92rqx3yhss22amtx8ag07xenump", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "058b6e51760a3b7e0ae85f081ba8a36393000bdccd1b9d596919f693ea3b5de786", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17rzx8l0qtujq0yt96zwd440jfv2x3m2crjq43x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dbd3c1a4a92bba0bb469ba3038a5486b53a1abe1f6ffcd18d01ffd168670a68c16", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17s77z03c97p09w865awhq7vucdjcwszsqp950v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d1936a734af83725d102bc2d1dbe386f4ce69fdad160e176a2ac688138ce6f3c8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17susx3ss2tg9920v3e0lpj6gkjxmsrs7dfckpd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7cfde7cfb905b51495fda6a0ea52583301e1f2901bfcd7a597a64b633a8b900b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyj29w87cm92528efwm7grzqx9tt9s4cekff4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6c154e02b7fbe1717e9a27358094876f3001a846bba84ed6974029400887dba456", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "proof": "10ec9050baf0a952e90694fdfaf06e0a71b95ef78feb86b76ddbdfd234ece21a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "2ec0067460e207cd0a6be17c5d4ed6c46fdb7e9cff1eab5dc7eecb5f8f9950bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f27806af6d2e3a46f27f0d8e2840d4b2de8f35c97828d377f3f381af5a801e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "proof": "33509da3e2c5305a27ec0a519a906f7f8fcc28f0691ca97480e6bb5595e8f183", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "3dbcd08554860918258cdfe80a8bb7256486390bac31561cb7e897fdf75b14a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "3e8d8f57d09c5596a3072d5ea992c406cb7a38de545715b70c13ec45f619c2d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49d7d9123f7558f83732093afe9f9476dc8d85514fde9c12af221ed8a6e9c221", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "653d59a1baeca0b82a04524e86dbaf5e79ec219fbb1eb11d1c4b572910fb172e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "68fe0ccbfebd454239aca12d6a5a6ccea4eb62de9f19786cfc6e1ce96e7a8087", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "proof": "6dc8ed50d53ec37fcb5c88de913cd7865b5bc66b04db04ec42eb114f73d8c7ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0c622ffaba0d4daa904a9e770896737296da985567c460eef83861bb1c5aad4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c13c6689477ee9c554621df1ab1ab2d3a710defd7282789ea50e29f7d3cd9ca1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f615ec34442ef4159371dae810df7669c0ea88e67345a830fa61d46e8a7bc9d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "f79bd7e63f0baa24d6e28d174440e19904bf0752ee4bc42eb9043818a992795d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17vw87kp9p77ykmskyz3xl5a7ug7e2d0vgqgls7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "68301d97d863b1e860c5b68598c1c9c426bfa62509bb0210f346d6f7d6364546", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17vwl5v7tgf7lt4335gvmdakfk9ln8xlsz5d48s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c8e347916390e76d7163b0ab3ab4b26147922b6678a5527234edfdf625e71fa5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17wm777qyjhmvy97pvhvef8zcteec0gsd8ak7f5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "67936f3a2b93babdac8de6d434ab8a393395ab2d041c2bda2e95832249d949fe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17wm777qyjhmvy97pvhvef8zcteec0gsd8ak7f5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "825bfc5455845f473b12328bfba32761f350a354079629ecc2e6aae4d384e821", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17wm777qyjhmvy97pvhvef8zcteec0gsd8ak7f5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bd28f019205cd7da20a79e0d88be8f23fc1d47dfab3801afb4a4d38db09250a1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17wm777qyjhmvy97pvhvef8zcteec0gsd8ak7f5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d3bf49fbaa901b389cafa9465d07b6277ac1341400c1dcc4cc307f6fd371fda1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17y4767pkpv4x28d6kkqjmwpkkxl49mj9ppffzm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "61eceddd50c435fd98069ee429fb66923b2e97a15f7435b986a6a4a64f7dd798", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0491e3b2964e12d95c828c431d3e7f5c2488572ae760cacf3d0e266e2197ad9f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "64117c5d74a6a15e026aee37b613d6381e02d0fbb91199c12299f2a50a322fc1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6c8fd46ecb5604e6d10b890c798b17c9a475d7d83ff8e16ca89bd0c295f5c9b6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a2a370c15f66f9ef6337e191007e1ddf1375be354ee1acdd70a900df9756a7a3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b28b691b0923b1bfeff8a657efffe65130a91b68918c59f65b88e426a67c895e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c414c54775733285ebaeaba05a36ff4224fe71ad9be306d493c8773802198c47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e7930b5cd2b5eb85b2bf4ce28e92a02caf3262cc9981ef36ac54199460658e25", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0ca04f3c1b0769caa12e5c4ea4fb1c262a32140cf86d2f61cf400dd13ac6895c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "29952314265b1bcd2c48f325b901fade0437610d0d8275d4d2337f4c733912eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2d055252b0050f48cbdb69e8f0b5d5a8a437b5958e8bd467c0a18e632a0839dd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4b4975e0b29f47d30e204d695dcb91e691763087e970eac09742219c6f4ab9d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5dbfba89203c7418179ff18315269bf22bb3e33fb800d1b2ece155afb37617e9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6d1d52b0a7ae8c0b77166f32a6710a4afbe645935fa4a5252c667a228cf7e953", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "858c8d34ebfe4ca4f08b0f240be1d274dda4869b6b75d0db98f99aa70a3990eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "917defce5cbf336fc7dcf4ee2aa1ebf33d071e67fa79203c3df9ff5cd483748f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a67a3f08d020256b66f6279ed2d92183f1f3d4de9f970ab3a935c1908f0d000b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aaa19b6476489dbea568c8d33318c302ed5d67df8acfb6ed049168e225253621", + "data": "", + "version": 0 + }, + { + "holder": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cdbdac9e54a6d8efc1ebe746ca125797447ccb8be5a8626b296215437205b2f1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger180ywww0t9n0f3n0hzv5zwhtmlnd9yz6alymjgl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1e3bc57951c63c6154eb3f9d00088623117ffc57ba46acce31541456df39839b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger180ywww0t9n0f3n0hzv5zwhtmlnd9yz6alymjgl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b5ee666b0ea3af71936ceb0fda087e35ff9c227830845a589f246c4693e5c2a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger180ywww0t9n0f3n0hzv5zwhtmlnd9yz6alymjgl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bea41d34f604e7e668ba1bf02c8cc92149677f7046a3c106ac6ca9ced70ae18e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger180ywww0t9n0f3n0hzv5zwhtmlnd9yz6alymjgl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f37de0b5e62e5c48e5c59c812448a330fccb81b9d5aa2dbdb2f281ade2f06063", + "data": "", + "version": 0 + }, + { + "holder": "shareledger182fr02u08a84g22p2thpjmq3svyzj67hjr53ua", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "812bfcf152d4dfc30e501592aa13e4238eb216fa41815d8ef1eb8536b25d63f01f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger182vxy8udcquclnxvkrsefqemh6v7en9s7muy2f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0f9cb1be2ad9388e4eb183b211629c691c5f464edaeaf7a605dfc9ddf9768f1b62", + "data": "", + "version": 0 + }, + { + "holder": "shareledger183c2qm3vv7sjr0r45rr6ue8tzjm9axkdhd0qy6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d034cec2a17753cfe1297b206165c6410ded9016a52149491e9b7f704f1f6edbc8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger186ttw0fatjca53vwr2v77rrnj0qwcdz7k9c3uu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "681104120937746bd9647485eb654c792ce299046eca0b290c956602e0f4fd6f9e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger187lhg3vx9tpjsskdytcc0ptxx0rnh69enun626", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6e5848dc7978c8452bdd15a1e54ceed33fe4f94af92975b87e0e16b28a81e526", + "data": "", + "version": 0 + }, + { + "holder": "shareledger189fzy5h9u858k8rr5r6q427hk069gvaavqg4gh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d62f202447a43aba986239173874267d6397986ae905f6387aef5317a78cf091", + "data": "", + "version": 0 + }, + { + "holder": "shareledger189z77wl32h8m4ly8n4jqqly4urpn3msj6t3cl2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ea61d78b7e58b466e57dbdf582f2f88cbaf77de793a069f96f69a653c73040b1a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18a3d6szdds6898nedu7xn4205yz7pesnfv9v0t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3462bd8bee3ec65fa134891d6bf5624888c8c029847c3e25e77f01da25777621d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18a9ys36u50fmmlpyxd7y9e60mv8jca43c3tzxz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33abefbaded11cb15bdf0d00075bb46708b10ecc0a2316bb8e81378100aabe89", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18aczashzm6zn7qmuypnkg96tu3ksrsccdavtd7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "163941a65d1f00e91eeb170d280e96e998b55a4d9d42b48329b817cb350b3f98", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18cmz8vyq7evmrymnkfuys88es69fg6c6r70q0l", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "59b16d9071523e10ba4400c54df5714519725a527b22fb62b075315ee3590745", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d2twfhrhn4j4dx9423xthc8lmzcp8e580w8k9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6fbfc7069fb773d8c73c26dfaa07515e2bd54820e896045eaadaa03ba7db4f2b1a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "077f9303422b173dbe7891ed42a5fe245136e42d850233a9d4ac57bd0883bb2a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "59d11e3354906430adceb27d853f865363f45acde289775aae879b875b1b6797", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "84948e3cbe64341025196aa00b43c02fe9e5619b811ca079cad5a2f07557f865", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "8c8fe28aff505cb546bfee96028dea7f9c92f9da255abbc2720e88cadbbc5a7f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "bcf5a805c8c216073cb80de9f7aabef0bdad1589a7c80fdfb7126ab276cd0cb7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "bf560b044e396c3dbe3e0114d5a705c83cf1f3b7af26e60fa14d75a1d3398b82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f9b68cb625bee01ea09e74520702d7bc74169a24cfa66c3b4d48f674d310091e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18d9v42rc5f3s8jc7w3n8ewdyj4g72tak4rhy8a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "634fb7d1288890553aebecee30f1bbcc0a598c0d78ce6cb6bc9312dc388a7399", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18dg55agj38x2lwssq6rc69ap3hdj8rcgsa39p4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "10281a5469fb3c890a2fd05827574557bea6ac88ed56f657c0a5c8df860ddb9d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18dg55agj38x2lwssq6rc69ap3hdj8rcgsa39p4", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "6cb652c3e126e3bee074a3f724dda51fd82465356b3a534c7acdffda2d377bed", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18dg55agj38x2lwssq6rc69ap3hdj8rcgsa39p4", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "bd0d4f3992749b1f3cd3c194d6e9929db53820752f824fd8fc1008d7c0d53a2f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18dg55agj38x2lwssq6rc69ap3hdj8rcgsa39p4", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "caf675093e27c28ff22d6c825551a1a20020f9a2fbfe43079fba6d024b8d8f3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18dl67sulr3rkpka0r2pwntudufsnkn3gl9axj9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "66a9bdc72411bd29cb90b1ea92296d6fbfc1a5bdaf71542823bc47f76bb378e43a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18ewz9t8t9afycwgxrdphmlef0fw04emtdf0ug0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "09211675f0dd60cfaebb4972af248bfc5f0e8deba190bf499a7e4a81731e6fc0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18gmx52hfzusxtevmljalxa4jhjamqlwy9dex5t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8e9a6bd76358b11cde680bb2383979c2c7ca6f2c39c0d40cd4b4487bb69687590b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18gq20edujq2gvn0fndr58d7ztpx7lnvakvxy9q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8402976f78035ccf0d599fc668af520180c0dfb94264e84b7a2746bfba0f8625", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18hsj5xprfxxcg8wr8cjfgdqvh6mrqn8ua3yvhv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "de46a41ba846f7fe04bfa9d6a5afc52b27797de9c8c7ee7d622ebc872f4db797", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18j4n0neg6h2dstpjllgcy3gnhe6hajtyh7juax", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1159ac121416db7e312bd3b76bb4b92905e381cee51b7a110e04a62c32b45ef0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18j4n0neg6h2dstpjllgcy3gnhe6hajtyh7juax", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8ca79b67ea46c57874e5e86f2f755469db0f46f7f96f2cce02debc22652ff54e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18j4n0neg6h2dstpjllgcy3gnhe6hajtyh7juax", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "af11596386ec44b8921441acc353deda7e2332254acedf062eb1df71e619ddde", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18j4n0neg6h2dstpjllgcy3gnhe6hajtyh7juax", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f59fc4eb36c43a8e90494ef4b4f9c7451a292dfb63dc1aa644cae5f84d747fc0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "143c20d43993254d92c9e70d1e4079bf7b7fe72778a9e72bb7bd4f02d45b75e1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2c4838014cdd477e81038efa6d7fcdcac0fc0337b06c2ea5ae8743de2fd51e24", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3ccef084171706fe49f692797e0ad2baf79d8d6bcced88cee04990e9e9dba574", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4060f735abf8a02bd880d96838037e7da7e42e4e83d33b8ed9c86fc88c4de558", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "50bf65b5d682d90c44f5c747625df938386d232db75bacbf3cbd67b58e3e0d9b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "65d6db7a2de85c7a10f023bfe8e10eae4b6813c70febc615a1af0e7235e3c80e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "734585ed6bdee02510ec690dda233a53b31beaea5c44bc98fc6d615230fbd265", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aca62777d35573f3644d001f75703947c6264538d9c6eaa12b77582cdd6876dd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b1000d682bb090a97f5d2e1be8714a11ff0602ed9e5a95838134be7c390e80e9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba112a2a5c5dea47111f5622fe32d89e2da40b4ee50109cee4882eae51c49dda", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c3fb7235028fcf48665eb4ed04996efc91a2c8f38dea781473e6d5d334ddc65b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eb95f116e3af119950db9ac6bfa80e4ad276126642d7f510c6df86eedb0832f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ef30a04307789426f19626465404520b846f861cea369e6cb4427158e53c0118", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f4200055db8d9cc000eafcd36b72f342c2635f04ab2a162920cf42d575b74fca", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18lwkjx40w8klf6wtrvdtwk2f685gz8e0pmmymr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a5ecae49f62b9e7e03aca13275fd504c34cf89b295d8a230a5cc5980996de06f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18lwkjx40w8klf6wtrvdtwk2f685gz8e0pmmymr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bdb29ee27a689940a9b5f8fcf2a517d2b7e35c3f666abc9ca8c3644e0d027912", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18m8ch9x6ejr7yvgx3p3szt8a04wfpemv9ttg3g", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "5a5b10393a4241d8c710aac0a2338a29b8d2fa1a66ae15dd5aae664ae773d37d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18m8ch9x6ejr7yvgx3p3szt8a04wfpemv9ttg3g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6024a8160a338527b839555b9b19061b52a3071db4fbe3b658b76149e14e3a0a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18mteejsyfxpytwqvurslmpy8nsxv39c7tfykh7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83b4c6d0e9a2b45dd3e61af8e12f510cfea5be6a28693c0bc05eac81b8a27ddf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18n0fg4kktxe68h7eljnyek70g8h3kt75s26hlx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "34b0ccefc352b9abbd3cbde342eb61736e83fcc6b4dfa310c288f55ceca5b399", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18n23sfnslgykncdgw3luzypnnmn8cqqw9lg0kl", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627978368300", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pufllgsethcqry093glfaeuj533h2jvuuj80z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0852705f25c1d957d163b65b6b9751361215cb1454bd5777115c5c3af4df7b9f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pufllgsethcqry093glfaeuj533h2jvuuj80z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "117bd9cfc2cea9a66a36330a0faabe1dce41936f93d3eabd629d5cdd1ce1fddc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "00d6a1ada422e8e401bcba3bd1c07d3273a1ad0fffc93255cc9bd2247b65ef42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "08865935b14b919399505f566e934e517da42c1b54b777bb8c88a6e68d804bec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "0eb2bf3095761a0a24fdc27fd1052d67c146e8ba340bba55516384bd923ca242", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "11ff469883ceb87075f90bc4ef980ed6699e185095b5d4c51a96fd3e708cb1db", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "13a45fe737f83a80c184b8f6a8516cb95e53b0b18639b9c627ab76feaa94d804", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "15549ebd79e932a23645d7d2d0160244b0c4b816cd3c365b4e484f04b64b73e6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "229721ec2aa51a525b5a01f52f9736c81a15e19994a468442048dd5174919a11", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "26a713e417bfc6e53c678cd5351320c5c30e2ac2c8fa690bbe564f121e9bf536", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2bbdad2eb74dc2c7a9188f4f0a86b23be2e2cae64ffea323ea495f9223a147bf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "2d029c0b3b3852aa3bcb590638d2725119f8739dcbf6fb7f0dfebfb617a11738", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "30bd37a61cc2903e6ffb1c0064ea07dddf9540c90ac5f352ff3310257a670bbc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "31e1ca4c85ae46658200e86356aa6e96b40fba717bd5c3035e5601cfdec81027", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "33757ac704e4cded7946580524851c867716ae01f0f684532d84044225b6a7ca", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1nryw8q00f4expchtpgmfn56n2q9slfsfejdn2x", + "proof": "3fe8820b2240011c2f7b47b84a373ee6b62b2c2c5ee1ffebff993e687d6fbfbe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "4a3d35f3d1519b4e4952ed8ff024b2d8e0e8151811524f27a86d7ec27c79cd79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "4b263078fc439e200cd19dda60dea440ae4d9fcc0240a5a61bf6ee5971a2eba7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "4da46dc3f3428a721519e48b7a7bd6588d2fb14b8b8b75337fbd6c101a550689", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "524b94472b6c1d4029d3eeb8d70da6d1cb239689ec82068f07702101f11ae57e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "54e0e38c568f56b8c601a20a509e52aabb0e310868a11e5588d445a68b21368b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "5bc118789460cc41866f58a2c57f181b2bbcec2070495baef4992a274aeb9657", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "5cbc643b3f94ab74c5819ee6a3625eb825fe35a576674cb0c277f3a19448fa43", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "61910cde0d128690b3849b5dc98347ac571f85c1d37807f122b2cd252cadb4ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "64ede50c101372a3d6d6d516b6d9d6bf889fae7376f499d350ae25f98935bd15", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "6881cb76773b3072ac934c920a289b490aaf24f98852edded3084fc5b14ba22e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "718ac4ad6cb6e4115b1ba5ee55bd8c76ede00a693c5f4b9cd1ef801ee55c082a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77ffea5941bb1e9c0577f1da6f93ef32c995487e2fde539d246d5355b5ef4f77", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "7b76f2082dca2d5de530621ffdefd504eb73be28997ee267a98f433c63f61424", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "7cb40285e35ae8ac41a43f692098bb2645dffac925f201e03713a2341dedb81d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "7ee02fa1da7adce9284d2003df3cdced72d0ecb118de5578e50c6b2411d9221f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1nryw8q00f4expchtpgmfn56n2q9slfsfejdn2x", + "proof": "7f9cfaef63b0724ae3dc330908b68c5577ea0aeca229149aa95af51666c6dd17", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "7fabb13b63cfd5977c2719a88f04d4d7d55a17261ea7ae2095c6392589cb8556", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "8145fd20efbde09d5d20eea11a6fb825af0f5466016c7d329fbac1740384a4af", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "853c68ef99663ec667c8730fa632e6b0e4f93b8afdf3bb33a8e32dde31c298a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "877a5cbbb8a1bba8ca0f33302586147cab00788130f9db4824add11eed36aa6d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "889bc0bed999e9d5eed6aa76673cb145d746a840573ba0d966b77c0f922cfa36", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "8e0c9da3a9fcfcd15c1904eb67b632f6bd3bb89bf23303198c6036ba2cc8af06", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "92fef6c148887c5aeb7e363766d2a9eb091ea62f80042ca0687993183eaf5649", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "9355ae8bbb70c668141d2fa51d69017b38d0791c829d8713b4e2973dee68ce74", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "97a5aedbeef72f0fb51e17ff566c29f3c67fe498e77c1e307e0aaed0ca921f79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "9c027385194896960a5860477433b6dc73c3a54647a5873b396a209ae92e1c81", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9c6d2e29abf51629c41fa5ae16e89adf9cfd89534fce07caa89dc7e1b5d4617e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "9eeddc999fc5fb2860f31dc838108d0cb946e247812f3640419244be9df9425e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "a011efae0ce8fbd58580b55df6c717bf387acae537b209c90c49c9e1ee51c564", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "a2fd593d699a05b7a0f9a41d50aa69dab1fc7d1a36b160d7cba43faa6a3bdb41", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "a308a870468b8ef95c02bc53a032fc073f729332a7b8a61bb1c20905a7a98c59", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "a5f0855b58457a56401a97e5e6776138d07d5bb7f3eafc86c57db6ef90964231", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "ae043717af9a8e0da815f8877b87ca79ddbeb34d7eb82a67a0f26c72481d9956", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "aeb4b1b32b05882814a561ae9255760bf308986c7f31943ae22d8a8c563c1100", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "ba37851cd785f45bbe41767a49ceb68223f3b2b8c8ef23094d7acae42683ef64", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c073f7bd81e5076cdaa341f7c5a0288cfdf48a43f9f841a1044e81973c80c324", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "c09f35391b907d8ecd0d769e86cf674c3b84c3850d302afcfda5e3e3efb7db48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c3f698ceda25e1057cb6b150821f2262f69253b53d371dc1832fdb444c9f808d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "c6612d2f841b31753cb175fa7e780d0e3d21709bed5823810aea33911a4d98a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "ce7664d7d759f1ec87279cf624b7e785b8ad6ac321e282600f496c6c13278392", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "cfba812ce6c4dc9287ae5e397e07897922e3235636821069cbb0de44aa9aace1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "d940993b016bc0cf0b062226b6a52c3116dd77e7bee23ce7d3bdd9c0afc0daf2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "d9b22571917136a3c07598e73e0b38cf40bbf0a87c6cc50b1ed6b5fe9eaeb62f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "db1bfae6c8e4c34ac328095c0115a7fee18008f0a1d22a7f1245a2f6790c46c6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "db728b0c3f91ced9e3972f3f85b904fe1cce66ba3c4116f4947b679b61d94e82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "db796d003bf090ce9f794e4b031cff9985a57fa835d02b74c1394e4725c8f421", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "dcd97f2b2410df5fd5833d7c167d2b5ea9285fa803be34f614c529419fdb44b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f50d2c5ad87b697bf5af5d6548fcf071674082138a6e987a6299f56b51c4355a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "proof": "f679b971346cc16bdc03156775bf571c88a8d0b62860b8144f8a158a9314cd48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ff68a6a85a4540e12af6feaf921b347876b39951872c79e58bc93e69bb4e4214", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "issuer": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "proof": "ff9bb54a96b2ccc5335721802ce80036a97908e5c372971a1564dd7fa5cf7c76", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18q69hu4d6mzupgsatm4tjh986fzxhs868ltwsx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "79416d875bafb5df3ae0e97d0fc1ec42780ff50210de30b73c8a3041b734ed06bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18r6d0ea7u2f3e7uqrlka0ed90tze429spsuqdd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6fa0f4cbfbab005a179d0e0bee24e07fcd1bea7823f6d07cd1118e112b0dd35d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18r6d0ea7u2f3e7uqrlka0ed90tze429spsuqdd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f0eea4efbf2c3df0ce3023ce1582345c696ba1b89ccf6e71b4af258e97af7c5b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18r6x0u2v2nkr70xefr92ayawjzfxjys4l6qj8y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63c256110d78e8fa5ccc1a387ef6753bbe0ddb410f8ec3b46a1baa06a7feb39b44__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18r6x0u2v2nkr70xefr92ayawjzfxjys4l6qj8y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da8af2d7bf34683807c3ebea54a8c93971cb0ebf28c33717d8a23bcf03920093c7__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18s9e8g52x8h8fjkk6uueyuqwyz890ve5rewypg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5d8a4ed9fde73868273053faccc6f3ce0261cf485b5c08967a5a810ea6e4069755", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d36dd5887ac2d47aeafcb822924772dc8bf5f4d97f12126bf6615057e345d86c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18t0vyywyqv69trnkjn60f7xnkmzslnenqj74vx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4b9cc0a3f2c41893a3ddea15b0c4665562ac36fe83013e66818348738fd52b02", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18w8xpqh6ke86jkp8tzyyc74uwh4gwfz798w6qp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a51e37082f674c433019a15daa85e7ed87d458e573d7243a33d40d42e81e038", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18x5agrzmz0hj3z8hz0kg3kqwwxhner6qdp5yl7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "55f92656656fa539e6e2c6404bb069e22e7fdb7b9d6ac15f77f87fa6fdb021a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18xdke7ymzl98330ryljhuljy44g66f868s0uxa", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "300751babdde7f17b8c09c41ee240bc95b4bf8e24862bafd9b433ee2b4e9de6f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18xgkeuhdmp30dn27lttxe6p58xcl3ea30hhgq9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5982dce0cc01361e14d37c71efd37fab4dcc129d3a7b75038336ed5b23546ae8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18xgkeuhdmp30dn27lttxe6p58xcl3ea30hhgq9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b99068ba65468caab467347a5a260dc16ffa12e0ede4fd0f5958de57dd3f02c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18xh7vassac6d0vwyffmtr6cuhm7anwd7lr76u4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "88b6ddcd69c9a1b44ea3eaa9ca6c601d2d08d2d8d1b9ab3745fe3d5e10d5afdb99", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18xmrfynrt6pr4t0t3xc7x56f5kdh5l7nh8fmjc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6f8126197c5e0b49f057f10488337aedb204ea8421b213ce7c14718e53c55092d5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18xr424yy53gj88mqph25hxa65mdt4zhrae0gvn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "187cb10a26ac7395ee47e774d34036bfd651dce86729cc8d6a2f645a59cb1bf7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger18zqy9nsz8lstnvmtt3jm5gcm3l08z2l4v5gfp8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "76450f16081ca0453ea9745916e4d93eb62bcc1d10c0d868a7d4b22396b245eb95", + "data": "", + "version": 0 + }, + { + "holder": "shareledger193pc0djp36metznh9kefvswurh4g0lgcqweckl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6aff2a051dca020654c25536d0d2eba369cd1f09277236fb0151ba72de1c9e46", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194qjr5nyk8u42cp90fypsu6npau0wjmtmqurl2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "046d7ff7f2f12b6228fa5f8d834cd932e55c4a5d04cd449f4224ad05ee7414a106", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1001bf9342944fb4240c18f8f1535187a3850bd321bd4aa0655138ab43ed4c1e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2a7b1f32bbef6eeac0be1d858d0c8f9af0aea5e38d424aab320f09451fbbc612", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "552556371cfb7d2ab954cd3bb18fbe6ac50b9a0e1a0e3916cf5f524b855acd5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "65b597eae0f1c58c6251db430fdbff18540ae17dc15d20389526070a4a7f4089", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6872682facf64fcd9b99ee0eac9af7b1fc3f6c2f83c5bee2436104eb2dead76f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cd39bcdbabfc9ea9098685fc2c405c5fa9eedcd79a73a654de63d340b19d057f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f21daf7093aa9e4fbed3c6d26c46dd1f6004fd07e524ecfc1bb03ce9206c31c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1956vre8jk8yzfyy7k6ve70hd0mken705w0ga7d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "823b7860f882a76c8095e64988ece9c87c6cb894ef4a3212936bbcd4e646836377", + "data": "", + "version": 0 + }, + { + "holder": "shareledger195l9juj5w70ywty8zs334mc4kqaml6l4dx9ech", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2ae1b04d907c6c59b8f0d8a5f49ad749ce68af9bca3a178274d270b61a0ed3ad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "553aa60236c19df51d304796790037f6515cbe89ac2113fa078e3d25e44d823a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger196jy68pzpgappxly3gsft57umtvvh83jsvvrnt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f5b0fe37e00c8cec41594674f1e6f28eb113b002f52a91d9c6b35d4717098d0164", + "data": "", + "version": 0 + }, + { + "holder": "shareledger198gmpcferc78h4sk303d6ngedd96dejyla4xs0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "06435c4da220c2b392290b983c5c45d0c1f471ead0bf2be441db06778b34723e3b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger198pvwv7yzgdpqg3sen0r0xmwmuhxq7ffmcsvwu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bde648093417e04beba4e5cfbe2fa0ce86313e4fe7390452771457387a50f6a322", + "data": "", + "version": 0 + }, + { + "holder": "shareledger198yd4uuzxhc8d4s9vx40y7t5lunlevanhjvlh8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "31a5a19e800600e4e98b0dca1af4ec572f9341f417617860c57ea57d27f275e2c3__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger198yd4uuzxhc8d4s9vx40y7t5lunlevanhjvlh8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97ce0f760479972705fe6aad74a01f9b1434aa8bc0fe53b6ae8942e0d104d2560e__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger199cpkjch5469fsyfq9lrtfnj2mxnf8r37724ae", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "063852b6e3b81f0b768cdcd06247a9cd76326a8deab9c3d758c84c639fa86241", + "data": "", + "version": 0 + }, + { + "holder": "shareledger199cpkjch5469fsyfq9lrtfnj2mxnf8r37724ae", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "759a509da25b64d2487a2d9b949c2557c50d0113b742ba04118c68c32610313b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger199cpkjch5469fsyfq9lrtfnj2mxnf8r37724ae", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7908d017ecccda401c895d666cbd5799d6dc7140531e67400feee5200fc0d062", + "data": "", + "version": 0 + }, + { + "holder": "shareledger199llequcug9etfjgrs2m5vu3jqvhyzytwm5m92", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a217f166a824eb2e465ba70a5b4a41e45b65e54d13f5248843fb9e1dac3bcc235c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger199prtlqzmm6wqc0pewmxqvz760kpqrd2ze69gk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eec9417947314f1806b28f94150b9d7b4fc5d68cdcea0455ea367d77fa2fcf2b8e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger199x74a69ta9mf9jsj6vmf2fwa702km92krkdze", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "59cf4c596c8a8882ee7674f02eb5b23f4c73367718533b80b35ccc271970912d96", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19dgjh9quc63zfyrfcr85ry4lfk76utuxtsywa7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f06864eacc5341887af2627716ebb3e1bd1e890a498eef7d513f7af3bb392807", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19fd7lygw8tjw44wnyzm0fmjcmaavrwp7hagphj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "72656e9cbee5a610d4cb51e1be6607c53555fbfdcf3d6296350f48fcf73d5ed8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19fd7lygw8tjw44wnyzm0fmjcmaavrwp7hagphj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fc1bba32068d78c16f1769adb281542a2247d22eca2f2cde9fc282f06d0c9f95", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a465fd23df05086cb9cc07a61e6feed17c9664d4adf5635f6c4e4bf8fbea0bd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1a45ed08ae8b0267ad505567460290b84385d7b8dc1f5e9080bfc139d73aee06", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f574c41b32e99b6b8e56a137d7249ed510224fe704a081733b7a5dfdd1e8803", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a949f118106bd2642eaeeffd999188c4e9cc3009f9459cdc8ae9fe11510fb0f3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b94485d767399da17db9fb9b8004feebe2ffff48cb6edb237fe30174190ce76b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2d20a0876d3f208a2764dae58e941351f1030bb5d7a7d268df93582c63bb1f6a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "60ef8bfbfb4d21e8a159d98b69edec7eda722e703e98e98701f12c590cf55424", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "71bec1ef510e67e6c35ddcf7050f96be87b7554d12368067374b52d93062c010", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "a248bca0abc75bbccf1978c2f6d4b389490b286639050b1d0d462fe5ef6575ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "a560367219273f7cf4181f90d954651e771def8fbbc669bc33481c47c427eaf2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "b362f2cc79aef68248a3f97439603eafe54856c5e07c3caaaebf9b3b779f8db0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "b99f7cc031dc1b5096eaee1ee8834f04c15fc29216899a2abfb87b5e6bdbd52b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e30f2cb83012b404d33af5f09080e4cd973f7e15b1a44e27cc876dcb71a64299", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "f8288c930486d4e6ce867cb1a174f9daed3dca57893fbf99a601bba62d0e0b77", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f90b310cf4478b58904486fe0dc7eac9036a458271f8f54c40147adac3d73038", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "issuer": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "proof": "f9d96de249c64017bb62928a6e230bc613724e7ef35cc96d7d68f1323f25e0b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19jnw8j0nw2wpze467ygkcgs9chyytgrk3rajq0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "08b4a039db082ac5180e441d32eb447fd441659b51c16ffe8989fb4c2d9e66f6c8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "3619f7023b3072eacfc4c4e8baf17de3c9dde451b6941232f451eef293e49656", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3af727e2c78ebc45752f90aa98cdd8fc60f5c5b944af76f873dcbc8ee5164cf1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "issuer": "shareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "proof": "e6aa6a1101ccd6d6d30c1921a5b747ef8827456ed38d87acca94d881fb3a8ead", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "f2bbb264ce277eb269bf57ebcf7252696042270277eeba1804b60a889f62f0d4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f9a87ab0cdedddb35e194e36a35d1593d0883e6578f6a7653dc151d36f36775f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "proof": "13aa4475fafae1f7bd83aa175d886168192ef58739d624579efb1d822a7daae5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "239d021155fbc534d36fea95b15b87d4357b5684d113820d3ebafe5b9cb3f30b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4f2700c09f37159bc28b8d73a030bf6c879a89a971bcad8f8c322cd4ab2c68d9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "52e347ad8b914cf0d21ce610bff0e4334458d04223ccf4b85178d804ffe0ef88", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "69c063e11c6c56d721abe94e194da5ae765cf3d4352233e83011b36069288070", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "7eb4c02495bb8b5a9096038779ff7f95d79516528654fd72ab17192005b7a526", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "a7403f5f8a21411c8db8a28a6793ecd44f9cad601e3cac3e455267244efbc6dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "f06085f007b5327f185fde52e72de8f5dd3c097d2424d120b1002b47b3ab974b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "acf43d1a8c5226c35885a1751a5ab8d63a8e58cd5d5fbb23d687ebdb10bf2361", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cf8a82541f86eade175b45f0da6d8f00edf3d2fafe9c185d777add89c5e82470", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d631ee19c9455b8659bfa4230a263801d162051ea255dfbb9fd58fce8e7f7d4e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19mwyye4cvn5nx2fw4wn5j9720pm37ym7lgca23", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8a810c65c4360e3593f401b86f714f154ad7ebb48194965482183edb3a7fb7bf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19mwyye4cvn5nx2fw4wn5j9720pm37ym7lgca23", + "issuer": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "proof": "939be2cd0e027e9e8bc9eb970290934795914a296c0777cfd8b8712669a1c672", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19nvvqfaxtundjpmydf0yk3s3h7tq4kh2s5guxv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "188b3848fbaba0690734c117fed72b0af59605ac0fb9013c76b4101168324651b1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19p3ckecgwye4n5cssej73npl8a5wm59qp8ft4w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3d8e6e9478e38175032b35254526eede7beffbbc8164b806c1805de0e1be91bec8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19p97fwhdcuw6s0w9jmen0wqjkjhcgqk2mp3n98", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bd063ac4347ec6d8ee8187540e05bd22249f12b517a5df8f3e7a5aa47dae41a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19ptcj3kyfm5ejz9akxwkt20eaauvkftyxnl4cx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8bdaeb81e2aab26cf66e17ad444da1a5f39a8989bb8b4456cab41d20c05bbbca54__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19ptcj3kyfm5ejz9akxwkt20eaauvkftyxnl4cx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b37a74ec2febbd0031255fe5ed8590d0b62f213bbf7034203feeb09f60fa8f066b__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19r2s989e4s3l8cfdwz89mmcpzr8hquhjpj9k6l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a22ed60ddc5d33878d0a61fcbe21c4857ceac6efd810c0263b05191b524604e32a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19rug3t0sa63k29mn5vc2ngzc2njh2n3pry97ce", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "74e6c25688bb46ed852f226d29cf994a05b16d8723b2b1a43b24cec7f3b6e61908", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19s60d457dn5ld8uzprazqx7e6jf7x2uuxlkw0y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bd7f9f9e3d1ab14b15473ac845306c57624809971ce563277a87edd64c06cd4b50", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19se2mztdhznpcu0q0eklknvz3w77hk87wl5ltv", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627978404606", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19turf7p7f6pnsgrjy9nnvfl48tjm68c82752ap", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f124284a64a574474548fc871aa43c87054a975d07c63fce8be75752849ff1470b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "issuer": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "proof": "05bbc74645c6b55f7f101e951cea0400d04972783991b41e055219871b8280a3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "14e38c2121bbecb3ead5931231f17016dabcf8ea93614d651a53f795034aa7ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1dbe729efd5a3678c6ef3bf8e860d74b68a36cf096861d8c55809da93939ff8f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "issuer": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "proof": "ada39fed9c3ba7c951652a7e16a1d50be5ba3d6fc15feb6f0cee67ba31472049", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "issuer": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "proof": "f6c8c6c271c6daf3f87287d8f02b2475c7be66995ad3d1bd3a8c73388c6d464a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19w3hg4xtdu6e0fe44n4nmappswdz6d5rcl6kfz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97be5876032a9557d745b080a583df07e4600afcfe16347c04fc9adc71c7bc1e56", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19wjzd4l8j05fxwny0a7854dm8euplh627tpsnp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a2682d4043876086c8d26fac675c1d815099ee1732d85382b2caa5b29e436772", + "data": "", + "version": 0 + }, + { + "holder": "shareledger19zaqeqk64w4qay5l5gztuv957cs686xkq96lnh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0be907b47e291c338b86ab89c2618686ba23355b7452d7a713a7d06e3f64d66d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a08rw6ufvw5vf8tw3s6swyjxxekv5q20649r9v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6470c45d67fd4abe2358a6f45bd2f9c01db7a6eb7dcabed8b3fe2f50b382c0ab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a08rw6ufvw5vf8tw3s6swyjxxekv5q20649r9v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c089826b03de5afbe834e83654259d04ed3970fb4dd384f12cb493cd392458c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a24j0028dxr76qu5mmtlrg5egaa67gvd66yte0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3ad52c001e6910c3897ade1f53344ad7f477482f1724a0dc1ba310078be367a4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a4p2pas8s2gff2f6jds8ecrhhgr4km06g55r49", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83c6e26fa77b0175e31eff1d4bbba4433f3673bd5dbb1bbd7fcecdbf1e35882ad0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4eba1904be06e0314ebc746ee5da516cba3032ff65f47a89a6d9c79cb84efe76", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4eba1904be06e0314ebc746ee5da516cba3032ff65f47a89a6d9c79cb84efe77", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "78312d9dfe794f2b7a2fa952ef168672f50a8e18be425c8258463500d695206d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a84a5a78a5ce3a4df6684fcda1bf0546af45fd4970662316679c6cf5ca24a73d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b719bd4ff25f8c3244299d1d0247e7d1b0a9634c0f6905a8e7878c8d9c8c4121", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a63xl6vg54h3hkelkm28qaavhuk5nz82lgwrx3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "03cb4d92fbdca305ad4512406ca7d9b384d198513427d06f68bbbd4195e0f43a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a63xl6vg54h3hkelkm28qaavhuk5nz82lgwrx3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "85a5e5008f35d71a9a1f590c6945b406eff80019005110d1c3de9aeecb4f3548", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a656d3qp20pchzz3xvylte500v5q3x58v2ur9j", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "69bb191a65fa3301614f07c6596d1ee1d046a759e9ea4233e851e37a4afa1e10ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "023f284646e08686c8ccfdac5ad9f900d7da18b4d3f81188a3cebe168e7ee73d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "05b8f95aebb14914487c0e4aa5123023654fbef75f279541e09a19dace5dd520", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "17478a225bb22ebf092d7461397d1bc03b898f35d14a9df70197afeeb5135e4e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "1d6756bf798750c1e90c7a5047983348d52ac3d2a87617f473d693f54af1ed68", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "2dca80054fd2a89bc2e1633f9c6d0bb1506fd76e42782ef44aee2b0542d4bbd2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3f8037019764de874bbcf3abe27a3630c087f7fe593668c658dda1a08c1428af", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "46bc3cab1b5cd1af01da58e07e9f6081d66013abdb14f77ecf6540fa51ded13a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "4ed637d6549b8d30fdcf4df401e67a4381f6ad63e01323ebbe10572574d9166e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "7dc8d4eeb7687af14ed6741323e84e09c7f370fd11d3534f6362dea2163bdded", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "89ea632a221380a30b927a1be02508b42377d85ec128d12a5e298d7e357f5c4a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "8c2fcafefc0c255928121e8023efe4d7e1790d43fe84ab7a82da9d68ae9707f7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "922264cc9409849d7137ef9a71b0348a63d63ef2824b25ee9421245b0c99ecec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "a9731234db947c5c4d656cfa9677dfcdb9588b67900193db027fcb9deb8dd278", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "b25391a98608b211df09259e6a350051b048f047681cefab60dab795c5542510", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "b825194a04d74ce9b4b2ea01d3df6e4ad5be4ac71d50fbb7f34ee141c8f1185a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "ca288739ab6d33fa0b81acd400f7f23327c473d0835aa5359927006edf003757", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "cc1a32b129ff7d56269fc1b96779e768b9f50a55f103501c3cd19320ea70d179", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "d078dc0a1dc3a18e394c35f46a7ccee75e0b8e13c6be4407fff178b64a94fa01", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "dd6d8a296b9936eb039af69f98605c832d5133e2cba64a5fde4c04efb124d4b0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "proof": "f807968b628892e4de1a9add1fc47472fbb8c44a422ce7407dc8005d9ecd6f62", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "f9b954146b18727f0bc7d74ee89acdb8c86a99d85601f94c5ec9d76d7192a50a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a697sccxpjd3txr85c0cyz759gpvhef50ukn7r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "935cebe8462ce25c1947b287d97bd0ca571bed01dc5d83464dd40b02f262e2e4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a736jht6yrmrl2swddnruluhwaxsgt00z270dn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4cc09d122e0499aecd44321b21082ef9f67036fb9e11b2755a516c2e0b334a55", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a736jht6yrmrl2swddnruluhwaxsgt00z270dn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "80b584e22391479072d88579afdb53ba11c4023174abbffc72729a8dcd53a419", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a736jht6yrmrl2swddnruluhwaxsgt00z270dn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a66b79ea00430c0a9400c3693e44a3799d87ee1c33915ddf0d9c8863ff7c38a6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a7fffa437alljafl5ad30cq5qgr2d39fulkmts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d0ad109b05fdd29cee0a082950b47bca0df5199250394b202164d929db0f2c2ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a8e7en0j3as0jdzhhslt0heajare844fdg6frd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "671c86e42e2a3190e4ceb5a100d84ef602c33d698b996358710b7c412fa0c569", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a8e7en0j3as0jdzhhslt0heajare844fdg6frd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "72d00e7013efa70a37ffb874c2b6f73c07d55fff4c22216fcd724b412c0dabba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1a8e7en0j3as0jdzhhslt0heajare844fdg6frd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "78d5da9b15ccd36ebf2f658e67c5a44eabe93491f34cc94f84e1d35657f1ffb8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1adc3d6mrhsrncwup7z8tqf9ntdacz7dgze6exl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "30eab1ba2dce049a4c950f4e7ecb30df28c8d7943bb284e3a6fd43ab3655aa8f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1adc3d6mrhsrncwup7z8tqf9ntdacz7dgze6exl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "720771deba41f51ead9b077a74174d42e3f8c17d9c056e870ac0930cb74fa979", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1adc3d6mrhsrncwup7z8tqf9ntdacz7dgze6exl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b48f88ad4fcb850a614d30f02b05d90610b54be8d2e791f6c19f704ff1307923", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1aenny4th75nzklmvrp4mmyn5tn7457y397z3cj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0f05d2bd91803c0dfd1d3b870b582e73cf0066817aaebd4bac5a518f1d2f21af", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1af30386ncq2p3cl2vg395s78v5m9cpqg0l284z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5f112e257c4c9d7c6dd213c623a677080f2e15c93d6f702fa210edb474376e81c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1af9nvmwdpp5wrfkm895lr74mxvee8qy30atarz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b513a403ceee86a397ccf54657e23216906ad636058de1e4fe50347916e56c24", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1afuvr8e9usyx6f97ym0h4fae80f8d6eetnrkqu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "47c428dae347cadc5ae754036159293f1b6477d580034952478c25d844f6324986", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ags224y58x2kgpd0uj3y8q2aqech6ep9c725vn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "93082c0cf4422617fd39182a9f9411a63ecb9888fc62a5aa62ea67c9ec88c837", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1agupcqv5wsj74l9sd9uzw9s8g849zcw4mffss2", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "1cd02af0830bd914f8489f45aa8420c1dd6cd6de6be115aa81eed699e548d26d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1agupcqv5wsj74l9sd9uzw9s8g849zcw4mffss2", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "2ccb39aaab4fc32b3ca75bf2822551e49dffb55dd95a3ed00bd0dbadf51079be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1agupcqv5wsj74l9sd9uzw9s8g849zcw4mffss2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ff2ef743280b6296bbbad62ab587a67fe8d80b09f02d4b9f505037efe297ef6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ahr8uqpsmgtmfvhd60ymr3j2ml5vjly90g6vm5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4e268325a6d50aee5d6da982fc0d52d0e1f32c8227b14ab2d0620476db8434e537", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1aqhk0ap6u6yy4kz564kgwn7rxzcnqe9r4lmygd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c652d43aa411b1e091475ea4415fc2a4eb50a16512da81c811fe9adaa4a0eeb8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1arv9yjzmxvkph2a065zw2gtk7sea7dpu80ad8s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "621d530bf9b78c244319b45303014101dcb0551dbf572b0169864594d857c784", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1as8nn6p38ygvuuvdep2h0wd7dqyzg9vs3kl7ae", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cd5a35330b5bfa0eace21b78e3af0e48ab078999a177e26d29f18dc374935fba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1atek75qqp2dx6xk6jkyvm6q8v52tpas06z3k9s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f2d95501d29c1fb84fe5f6d9f7eca03cf23586d693e65456b96b0d00816f458d2d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1atn4szhhj7r8qv27rvfxn46gxy2j0nmk7uufyh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e809a709c7c853694e3ce38c56ca83e206a28e8ff5ffc5ac19b63cd8499d9c6586", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1aumhy4skv26wh4tvpc9latzq6m8xav9tvwy3pa", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "43f8981f5705e3731b9f1d7450594dca4569e422af79f937997bc7a6dba74c2e7b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1auxdxvp5gne0hk3a0zpfqmp0v96w9vnvhrdqrf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "689066e26ef6a424dab22cab1f98ef84d266bb08aa171c64879e740b7f658195b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1av8s293xwxuwu4sqan66kt99g3z6f9rp4z2d04", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5201b8a120278ca77d2a0490c65fa649611de5b2a4a67a9ee35062348efdd4b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1av8s293xwxuwu4sqan66kt99g3z6f9rp4z2d04", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "816e9447ebd99f4eb5218e51823922801ac79625d36c475c550841b1d4d44ff6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1av8s293xwxuwu4sqan66kt99g3z6f9rp4z2d04", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94dc5f2c9503f37b3f2387a1084fad82ed6df068e1170afea3e7827a2d920d98", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "17c82bbdc1e7085933e578501c1ed0651ff2b12c8379ed04831a5fe57e8abc5b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1b790508222b6717157359b387b1f7fc3aa44e2d3f23c0a65103989446da8558", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "1db0d8bdfe36ebf9c4d45898d391b0a99bd810e754681d05260bddea94fc6426", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "20e3f45eb6c72a89cfc5772340f8128cd42d1d58e12e3be74a7ff912b809327a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "proof": "43225d0d1958d906a211b58b29f919ccdc582b23c0f8093c07f18130e9038abb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "53d208e17779585c8785c2641c3593a35c24d2c98cea7d66ca78a3ad24c01439", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "proof": "554f7b2bffb092bf171afe9414489b56302c82dae427209f362cfad83fd31273", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "78e83f0fdf52c4fec70bbdd40f8393b6673e3ac548f44ad917a33a774bfc94bd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "86167743af8760b06c86ef5fc168ce6bae63e19297d427488f1b479fdb021bb3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "b97d299ac210c126ea812b22aac455a1e0ed7696bfcf5f252d3c3e0cbf0901b8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "dc8224d1101ad64bc02e34ffee7275cd5080ffbd8ffaaf1b67c280a554d921b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e2367e25ab83de1ad0e67a9cd1a33f9fefa250f91eb464369e9b33f7fa8f51a5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1avgedl3tm7pu5xpkc3c3c2qrzxj4y8s4sc2j65", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "13aebe13447ad5a9ffebf2f4e361bc4f70f99e7afa6ca6638adbd5e1b905e755", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ax8773szkak698a5qgdqtrjycqmgfk3h29gevc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0769fd4d8f0ed623a3e6f5f1d3f163cb766c5e37dea9ddf9fc60d45bf4f6bac4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azkf66v3c65uu3qwce2amj9tt9avn7jvsat9yf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ea2973162eac18eb5665e973818649f6e443b72dd3ce56d40bc03c8bc0573646", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "proof": "32b75b0852b26e3097240c8b471a0f456549d06d693d71d6e8007b474ed9c924", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "3986c9a63ff5c7be1f3c8eac7485df24972254a8efde4f173d31e5840a478f42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "3986c9a63ff5c7be1f3c8eac7485df24972254a8efde4f173d31e5840a478f42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "3b0d17dd0b6dc9de779cc373325aebf6d6ba37e2a221053843c08676584492d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "433f963c417ed2a772e1cd9c8681c566ceca22ae744d226f78c3855479cdad09", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "56ab65311f1673888c2969dc15faa0637c70b9dfb0895bf4961447250144936f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9b8d9176493e56d550abc53dd6028a201cfd409ed3206c73b2894cc7745a31af", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "9f9b95b5f365af481a87c92d979bdf631a4bdd50f9e4b72c023773c66f9d8801", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "c1bfbed20d9b3ce6eef9a3266a786694d499fb4bbcc79bd632378dffb58a9d45", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "d3f64681f53157a65aa50f9fff41859f6a7433297f74a852f9287d18ee88b61d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "d3f64681f53157a65aa50f9fff41859f6a7433297f74a852f9287d18ee88b61e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "f6ab760ede8c163811fb908f3a79e5e21a6531b8fe57f6585b83dbfafe3d9638", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1azph6q0mhj9dhjd0jskujadegaugd0gqfggvz5", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "f77747c138fbcfa53ebc77d26790e74128bbecd8499fcc11e949a255e17c7ee0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c0zpy3et8n0dheap6k8ufmaffpcwhqncwu5kk0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba9e50025ec396f5c111f110a7ed786fd3348a89a1adb57f8183793e40db3aa83d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "039756041ec7fc1fb7160313b158abd83968e2462bdde2faa15ec4bb6770f2e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0434ba8a77abbf6563c7ea06c7b40c8e746188272b3045994d1a5bac820bfb50", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e67596c2c6aae6f26b186abd1bf7a38273c0c583a439cd6ee4dfb34b8a0a882", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4051504d93f34c5701269a8f17a68e02cab3f3fb91fe515c60c76f4a57c0fbba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5bdf2e8d185f2b0e8d55ef105aad1a63b3ee99a20be64ffd49e4640f10552b79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6dace19519447a9488b3c83e680b8cb3357df5cec76a91709e06260d2b218d3c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "967aa54d1a00a800d07b1b8b2fa831855fbdc0560ee11b87a7f9e04a91dc504a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f9db1fe77b105b8d09f4fc4272df0bda69c048fd6ed092227e9154f140088035", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4u662nyqs5a8u00yuzq6xsusnm0lt28cqjrml", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f831cd7b100f53674a3e1e28f6ab46aefba6b02fd3e7a44737e0e9ffc9bb2f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c4u662nyqs5a8u00yuzq6xsusnm0lt28cqjrml", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "ee82f2cfd2b8e0e87073080f153248b527462af241e84dc8ff885e5d626bdd97", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c624qf93pqweq646h3wwj8h7acxrl93qtf2v2c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "836c1f297b8375f0b62a822b371f75938f349e6bbecf2a79a51bb7249cfeebd4e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c64lwy6gxcxkupzt9kgqpkp0gcg0glav7em0wc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f4bf28e1c09b1d09709d1501d6af27e36c5c4003a57d54129c835173b418765", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c7c0wmsld6tacttt255rg8mzeqp280weruec00", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "069f6162910c93e9b3661e8a0495c06266f332da7da4a2d1f3f6f45f2cb8e2eb3c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c7g4ya34wn4fxl6mvsge3snnm40hj8ckglpzvr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d4fa9c3392bcd18e3fb0c0c9e1102fb9d607511d852c6ade5757d99b485d66fb4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c7r7j423gxhumxcsq6dhtuy29s0ng0xanhlsur", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bbf4a4cb98a306eff088359688d1bb6be0ce708e4ba5aba4b8c022cdc0d940c5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c93lw68m2jqyuha8m2af2gjf3725mgwqs2m4ye", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77c6d66e10e225724fd4bdae60690d846d33cd7ca5d67c5a58c66e153678f5f5d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1c9trxsf6c5ftgd7n0ghydjsltpf3a9ctzj9xlz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d71d4a126d0720d2fe98d6bc2793715168c649c39deef8d0e9f6ecc69605bb71a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cavyky4aqedw08qmgeelhuk24qaej5h8xa5hds", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "646224d805213c1c754b45af27679d278e120095a7d1ebd690ab1483de7f5d8a8a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ccu065envc8cvsgfcmt6v06ltyx3y48fqyd340", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cd2903bf1c19964ab5ddbf6e58436819aa5a69627f44637d0370eac047e4d072", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cdg8dvfe89hv96dnnckam9zetftjfqnn2z7t2u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "76bab975ebe0275ee76f599fc274b41bbe24a411e9657d4f9de7f44ea1d37e591b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ce33few3e98tgec63z70yl4uduscrr0fkc9kg8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "61af2e4a6fadc781a848b027651d6e0e354869b58b6504ef292046f52eb1db48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ce33few3e98tgec63z70yl4uduscrr0fkc9kg8", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "621261b557419437b52d57e063295cadbf819969bb13bc6a1234f9ecf5d22fa6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ce33few3e98tgec63z70yl4uduscrr0fkc9kg8", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "b5c1d81583f6af978e27d6f659c80517357633db0e83fe042e48cb8b8a11332d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ce33few3e98tgec63z70yl4uduscrr0fkc9kg8", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "fd35f65aefb8b58bafe788838f910c37fca758eb4073e17b1b1a4c6dc2f5d3ab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4b5e81850e5cc0bf52c15013b5a8a4135b708c75282c2a8d009a6df22daa182d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf5h2wq4x8en5ytxwt8twe02tc273jlzveu9jk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "05101cbae159d38646b222b75788d387bcd977b84410adff678d373b5d0e338e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf5h2wq4x8en5ytxwt8twe02tc273jlzveu9jk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a302aa4defb545e345471fdea951f0bc13d47ba2e3266a571bbff0db757b884", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf5h2wq4x8en5ytxwt8twe02tc273jlzveu9jk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "771f5508b9b6217b9086a5c2fa84623996b872f680851549ece774d05ced6b8c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf5h2wq4x8en5ytxwt8twe02tc273jlzveu9jk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "800b47c45b003d94d971492e6ada4d0f900d18a6a67e07191b98793b05e362c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf8n9hzvjryffy9ruevpvylqsyhfewut8vpdn4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "76bab9568b31fe24dbcc591d4755e24700562b0edd187168c9bfdd9ed993663b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf8n9hzvjryffy9ruevpvylqsyhfewut8vpdn4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8f55f6db2fbc091f77de12bbe2a59d85c36f34312eb2808833af2d528420f0d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf8n9hzvjryffy9ruevpvylqsyhfewut8vpdn4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ff8a227e3347da9d158af7ba702afa406d498dc3df8feca1197cf8d5a0aab9e4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cf9j20llzzc3esd5v57v9uw5m3yzmz3d37u889", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ab80b395401214d422d7d118b3034da30eedb166ecee8ce92b0aa5c3850c395f70", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cfrgtgmfesra3zwx4spjqzu452qfmkhewezvpy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "511148c351ed4f267f5c16ec0977183513315e79fb0b3c234751ece7062fd3ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cfxh3rzjutj4qn5sqa7fhhcl69f93ev4f0hqhv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4acfa48865bdd9864c63cdd53340688da2d50354221a96455f2442312a3b94d3cc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cgx9ws9g3plmmg4drsjansltjdrumasmr78nje", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7d4caeb8d933c4ed5d1f5e2d1405c28eda6a7cd8eb178914879174843725600e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cj3lt8mztxmm9cne7gs2c5d3lr2sz6dm65tqld", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "505946d8a4eecc3594378d548c82dceacefa321dba5138aa938edfcb106fd51862", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cl54l6mm32cll2ckdq2tcdk4jdvvp20qmarzxq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "62031933ca82834f5b0b6d2f59f962e54b03530d45615d7317a802e3af93bb42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cl73vad39w48zjk6gzjcss0vfrmluxsp3f445y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4e24f8b3e7a6b5f363932d6524676fa92c78853d258e54ebbaa1695fa468268e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "007229b741adb55e9262723ee46e900e4ad492764b93d5f79f822df3cc580de7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "02bfab37e378b0a4700504e072111b9dd6197e975335417c99d9fa5e150c48b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "427161df026a3df66a977d18162f82b8890081210285b4dddafaff55479f80b8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "4bc1bf385567ceaa6587e35c34a49dacc3b0148b371b79cd900a098da121c1bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5a8d06a724a56ca256b751ffc7fcb01ca5af08b1c2f65017ffb9bcb7907af629", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "701bf10589a39286ee3407d704dd4b1549f7c762df1ed04e59417d7f0cb3c212", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "749b494c485eecc13e2c4f257c69ffd5056338d36ba8cb5f8e64d7d2933c4f58", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "78b079294b15e47d29f7257df40bebd53fdfc95e23f54e3487d89de6c75492b0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7f0ab4f493204c4c2faa56e48f89b933228c5aa9fa682db19d9021332a6de385", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a781aca2808425ac47580ec2ee98941dcebe5de32a1f201f2b2a88528212b326", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "d70d45a28de1debfca8a7887d72ffcc5387c8dfd97661e7bfe21c3141bc0e121", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "d9746f92ba8373a3f07ab60abfe39fbbe1f441c51966bd6d7125bdf3243ae825", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "e044b93fbce08a16eb489ec710689b7750ac5b789d0ad7e7a2a6ae505c791a23", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "f4789d04ed962be12ca943e85c704229b2d7a39bb57ef24a52f1b60190796413", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cqtpsuee3s2hgrap62zw865ddhyeh9wr6y6nsl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "71d63b5d93255801cb64f70b30424fc576cb471408b9d4671cddcd77450b35a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1crnnl5f9mdkcul9qcltzqrhrzxmhl5usymy08v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5c29cb02c09e26689e755816c4338355deaa27fae0431474a46cffc46f46ac26", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cs3uwml3flwlnh07m00yfcqp64yfgl8edxkc44", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2d6ad6ca5a936a7030d4a7c3b3870e0435be5123a690366d277edb103c04c943", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1csx7ww4f74fm2pdtmnw67lqjrv5qrp8wlfkj6w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "363d463de4952be81a4df2f5ba5dac678b3a9bbd2650370339c40f66920f54a9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1csx7ww4f74fm2pdtmnw67lqjrv5qrp8wlfkj6w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f5db93967eef33198015c368e8c9d292887795428f6cbbd98fe47a0acdfaf490", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cu2cxeepe34c9y8kfvj6qazwzewgy67slhq50u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5eb4b2615229ed247d320de0114228b8666040e625652d285b2cad27a0b7bffc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cu5u934c0nx2ala0ukxra93qkx65afwkmj4zn3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83a8b0cd0eb69a35c53bf988be6b1d9c739bc8cc52dfdae691b6aa2bf373698e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cuqqfeapulwgtysswnh2vejat6sjjgetqzgwl4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "92da8a8dc20029c6245fc68c161e78d6aac13082709afaeee36c93ca1a614b06", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cuqqfeapulwgtysswnh2vejat6sjjgetqzgwl4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d389d18b9628501c7dc2a5220313a00e5beeb81cc960a33bc89578e8a236bd19", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cv8ev7hp7xhvp3cuscz6vs94y835cx7520njm2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "327d87c98e32c720fa03280f063d57af21c0bdfa9595347354e2e6a04ff622c3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cv8ev7hp7xhvp3cuscz6vs94y835cx7520njm2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "feeb58d4456c794018b229f4945e33c549752ebb2319860d45a70dacd909ec00", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cva0z6slqepxtu0r5tpu9ej4tx08pzl9yz32vh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "078c4b7f733a04aeb88a98b3b992f16107f99585d34e37b3dbf282af2194464db1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a7ba942b998a9fcc599e516f8dd4316624f7331453a313161777d9bc451aebdb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "17fc21c21e56c653354851f0414f451bb35c5ced222aedac48d455d3467ff8fa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3e45a99ab8a5890564ec8ef68c338203df63b2111936e1553d3ca01c3d98dbe1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "467ee78ca275bc0e2bfcc6bff4d4b0d7ea3602a17d293daba3bad954b4211a5b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "59216970b68659d5fceb73d5a172d3a74b0b94301bc7bdbbbb76ec6c27c308f1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a0938becd945d6bb9d3eff48796b482432a450317fc4b97838c6b87f0ca449ea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cwsprztqfetrcnlg8s6q35yxfrmcr53z28r6da", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "73f0f69241c266eedf90ed0475725db0b49574441dffc1e0d0aebfb59069e392d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cyc5su6qv4f0qh4k858cjkl9qlx48mpdaujcw8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83f25bb24c9df1382637ac13eed1e1c8a9daa7f06e029460a4a0f2970eec2d59", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1cyr8xt9fqdqs5lxksk9qj23quhcrge5enjp39f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d35245735697978726d943d14cbef34424cae3df990f8730257261d8ec98dce2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1czmhxskdy2ne63fdpsaj9q2pwnl95cu55pt7sy", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "93f379d0adbdcfb18f7e0aae801a489842bc23ab3a147c1ae88c481dab4ed9a9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d04ndacnztpegynjk48hlaxq094jga3zjn2lkf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2a6330bcac75bfdf2c70f4f8b492b117e067dbeefbc6e7f62dc2226d3e8b2426", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d04ndacnztpegynjk48hlaxq094jga3zjn2lkf", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "82c74ce31ec8a050c4cebc9da1c6e04ea031023616a0adb151efcca5aa2bd2ab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "45faf9287e904b24c43d17d0300c4b3515b96af55adf7000fe1a1a8427c69a07", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6aec8b0b2043ad32f535a984f9434ba28053bf2d7ca59aefba50b8b69f3d56ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "b7f46925e587fa5229199bb9ae6f6941dc72cb3051c23a5f2373ab8041670ee2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "d526c138156a64b7496d1dc0f9ced496cc985f7af9e51011dd03a2796ea286f0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "dbac9c760d53b5ad73711823239fd8fa6d8a3d0986fbb1c7a9d11b6d4f6830d5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "edcc8634b4170ec3d48d3549fedfa1139dd07c9ad2cb87cf59fb8445c74c8d12", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d2a8vng5yua3p4dk30ms34djknftgwlyhalfm8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0b11c185ff40cb668b5b8a28c8fb00f66be90e080d6fcea15b77b3dbb1729b80", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d2zsc3jmmk7anxgc2x4pzk8ptxan3artvp9pdt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c677804a1390f1080eff7ec57da8ed5ed78bb8393ce4514dcb839ee86497e14ccc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d5avwf97tzt22fe047nmr6uw32a5wxdyel4pdk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f1e36edaaa10af8a3371cd05aa036d02c2c89e21386f4364be897e63ac46d6b22a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d5k6pp9jnl3tlxljqn2klzpq4teflnvh3e98xl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb6d80bb688aefde92c8193e8110b7375258239124c06c79f902ec113cf1f20f17", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0385dff0c7ee9d2abb18a6911808705c1f33d72c8d32a093e5841eab1f0a9553", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1d8zawnnyuldmsvsjxvaa7algtfppc3l4utnj20", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7526c78a91138034448ad1ab81ee30b9cf49d907a022b1785259b9b77ec45914", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dd8ejewd46fstud0msagf5yy6ychj2fnjtnsv8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da7b5e074c83dc7056bbd0c3870394b655cbc1a597d3a2f48cd08b8d6c344091", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ddlumfyynadpalspcn79y298r8fry0tchtc4fm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a5e50c725af100c8bf166cb0ce666df73b0dde6bba868e5567847a6ca3a7fc1c39", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dfdr90xqr0lletwsw324nszp0m7rugqqklz7hq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6014aa7c21ccb7245ca24149f73e5eab625d85414b9b310c86e5f509fefe93a50a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dgcjatp98rfywq34ytx3zum7sjy4my8xtrtxhp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "31e5913a7b017f3f5bbada68d6d77acc284c86a7ed0df93c905d4edecff3df111f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dh4ms8ang3txzs79xkeywsk3lpclx399thkgpn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "052f310d3743c07b87c706e0abda529441c2375d5cd4ed6c18b1a839404971db24", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dhsd5hn57x87jumqe5ahzya3qdlpd87lnn76sa", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a8a79e763529bd2cbe6920c731dc3f9b416f94588a35f093170141772dedb69c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1djxfv73k2ht3fr5empsvtle893f6dxxyd8dzpg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2d80a32bc11bd72b6f4a50c20fef3f60cd211d2de9134b464ea3079f1f9d01ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dk0dezfzp9p9z8uudvfqqeftceskj2kgmny7y8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ec7062e262b11d9cc4208fd8828ace8ceb3e368d9e66df1c462a0eb21b046a2b40", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "1a73cd185cba65fcdc3a8cfba5a23672f4626f6558c8da2f73b9bf8ff3e14d0c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1c5f9f616de2942147ec8568fd1fb059cc0b7f1dc83a219eaeed6bb5e44d354c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "9d642297cadd3af16732a9ade9863de61854c192836090de620b181dbbcdd70f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dkcqyc6ka2wrs65h25kwk87a69wmxrg4kx9aum", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bca39ed1cc75d7b1e0851dd6a9107a64a30207ce7b5e68d29341ba39562b823ba5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dlnzq5c5al38dq0tn6lu23n6h66wurp4l2yvz6", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "53c36db1f4ce12d1b8ef6458a2cd3bb9a9deecd0dd4b51e353ffe4071ba3a634", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dlnzq5c5al38dq0tn6lu23n6h66wurp4l2yvz6", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "9466bf7e56c3c6a74154dbec5823ec8cc74248266d5641eb4377cd20e213d47e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dlnzq5c5al38dq0tn6lu23n6h66wurp4l2yvz6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c6987fff3930e0b152113b4e43c708f9c8c84587dd1d763c5aebf7195a69c79b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dlnzq5c5al38dq0tn6lu23n6h66wurp4l2yvz6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e74c4481aea109b091cc0dfb1ed7a22ab54c4fe493b4cb232dd52aeec1241f64", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dmepl0nk5yh7tj37vxya7qs9n2t8x6k9562vsz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2147aaaea324f4850f749a24c29347bec3e585250b591c01880318f119359d3276", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2d318c39164cec61433a9d0fbeed467f2c6872269289501f2e828b12aef9e6d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49227e7f7a945d30fcb5f747716f539bbb1de4f6000537ef954f2a373a1cb927", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "719f1170166130e90e89bab1d0fc54b2faa85ca6d8a228262db6252b76122f30", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "99ff9dc774a63af1e668bf8b088f51f28bcea39a4fd9276ea6d6a2bd9fef7c79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ca62b53a8957a2a3bd4c1100a0abc5865eb79ab5da204d7552eabd9be4d38d5d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "e7a2d744fcae671481ecc4a8e24907d14b3b2d83ee8d044d83d7e6e0caf8a214", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "f3213362ffc37f2d4ab153919b2fae19afa7794bd49dfb2a75cc67935886bcc7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f345faeeaef12baded1619d127013eb0745f52df64919005f71e03c0417ef4e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fe047cc87393c62989e4a96d436fc20206fb4a983e0c0e8b4190b445f27c3e08", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dndvmtw3q28m482ufg4h0d8me3a7fraeu88akw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "47ead2832e9d13f072bc0e2777820e4d709db14f2cfa7fb673f62332c8e7c572c3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dptc0wylhgnfmacz4ptrx9uwe7hy2s0c5kmp23", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "41f93068c0276dbc01c3118f6e64038848983d8015cab174736960e9c6df1d19", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dpu5xperkpnzdcjew99sphz0sup5vjm5lyp9xn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b01813c82a2b2ea0e3b6e70630756980fc87d2f05f56e9f81101fb1c876f489", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dpu5xperkpnzdcjew99sphz0sup5vjm5lyp9xn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8853bc23ec4d5b5dc8c730c0c3ab525b383a985b19057cb7d60522305804ae48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "14f47e2b6813090112551aa023280dbc0e69878afc87f5e4e76f69bbe015d137", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4ece3ca085d50b7c1d267e8259992574f5053a5ba1511dfc46b53f4b66ff45a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "7d82af736ea76e559c56961576eda5b301a47601829edbecd34c99666f08ef1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "issuer": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "proof": "997a058cb69144086af6463151fcbb6a4416ac613b0ed57dac0701b5c33f68d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e8d84ab25644af93cb12730535b8064d364431660d3566a358dfdee6ff14c00a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1drx5ahhcr99ev5fwf0xj347d8nuuwm6wc2lj5x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1b869e2506b1a0b69d3934a4c83937ea8a1a4a8a0fa2e54aca4cf4dff7eb494c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1drx5ahhcr99ev5fwf0xj347d8nuuwm6wc2lj5x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b2b155a43aca1c511e639a466c8fbb0d5a0ae9d7f844d7bc9850ae7424dd09d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1drx5ahhcr99ev5fwf0xj347d8nuuwm6wc2lj5x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d7cb2025dc909a0053195f208a30eeb5461eb6443db734a038816d8c60784c1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1drx5ahhcr99ev5fwf0xj347d8nuuwm6wc2lj5x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e0f67781044304f014f8363f87fd9d79add3d1e88c91aad5b247c5223e060350", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dt3gexu9xlrqygmxx5ex8hfqerut4rtjx8g5q0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7e1f42b81d5bfa0b5596f7a6689c227fa02c9ddf416802f937b44acad56ead0189", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00ab52afe32e1ff8f803d1303e2d3008a2d8fb9189b5a2b600dffac5377da37c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0475ae451c316c36835e6badc210a22630f0da92c9c5b08760bc9a87308125ae", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "07dfcfd1ba65678efa682b9e1f0fcb55b2b03ec0485ef811aa21e21f58e24660", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0ac793525c7daf0fcefa2b48b86d0e9dfb3b6e98b63d8d04081722bce96d0556", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "0d27798cc7a96c9d19bc52723eed114c18c77689dd75566cf628e725c754e226", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "0d6e8dba17e0bf17deb1d01e8ad6b938e980770701a343aaaa3f6e02423f3340", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0e15f3e424f9f1d22eb3460e91751ee9b8dad675c7a5377665e175320772054a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "12df7e7dae020d3a42f5d2d9919dc13fd24db2ed929545bdfeebebb8f77e6a27", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "16286493ba85892dbbf8d26b2f569f20a5662b11706fe8e9d5c5fcbc61e91ebe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "1e6dfd7df256a841c7db0f4c8df9a91d979872833aae2b6e86e991c356844ab0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1eaf73b92df2df6603f3755c4baaad9f544cd97f7e90fdf1b01d4df1e49c1b0f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "273475792d78dcc1d1badfc9ef35216ec123da95e490c8d75a6f5d9a35df950e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33b1fab59974506a573c9c76fbd1dae4f2bda2ebfe40f0677719c4c4acc2c598", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "37ddc6d1562b75f2f71ecb968cf57fbcdb5a28e9a74a64a08be3c533d450e1f0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4a296d6c40e1250ddc94d29c7fd6ed1646140056ffb92dceef2a8f31f22f86b6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "50cea181932c03d822a2beef14652be376c8cb4e72369c45c953eff7a93a3414", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "573081537f81672a6dc1579da7958c87ceecb11e8a930723c27575e07d9ce85f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5ce3103c74e2afc3ba7bb82ccc9db751cc9328afd70abe0103076ed20773571d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "62f641f695bbb01b18b12494960c81ab55264b0c30c63fe614313577dfc8e6c7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "65403166eb0cfffcd2e249889530a94a11f5fc6b103c4be41d48ea6139113ff7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6783bf56f2098cef06ed55f894624dda19da48460488e114072b8dde938078e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "67ac62a03000d38a0009fa8aa2d3461dcf6482e6f2f3dc34b6b6ba2fb65596b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "6a0dd0446df9d146a6b9a0f583647b0e362d96920866c17c1d87ef04eb5ed64f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "6a5fcfa16f5fb18b09548ecfbace158cab3ec8618ebc63d3d6d14f09ff4df186", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "72b3bcecaa4970bde3de37de36ea601c9d7d03e61e5a45e74bff29152f88ad5d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7351390520eb8b89d72f2d9aa666d08685856a96a16ee89745c4ec8f81ff0ba7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "74acad086d86fd86ba20f84cfbca96be6172a67e3615c397967a33528ecb7b82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7a65ae9c6fdd2adaabbf3aac1d6a824ee7f45f83db438afedc3b8df549e182f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b838830a0a5c567c2ae3baa4b60e4044ed59b20d9922283e2ce6d85f4e75ca6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "7e5b624139be53aab091095b3c63ce3975d36ff4bef815b049468a4faa016086", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7fb1449ae7352a2c918687c98c0162c65289e9ed292d3c1a1189da59e9682ce6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "8a094967934add38846dcc3afafa8a36bbc845e6fe79c23bb7b553bb41faf857", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b35e85e9d30e5f8bcb62aa23a1484595e671ee1057d6506f9af0276895b436e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "90a99e1cc83a4da1f8e13a33518dcc791a5d5779ca7f073fac46d9568ab743a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9764805c14d04437ae002d701634f9c33478a32a0b28c8b64d3d4a4c1a9c1201", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9886f6e9e8d2443068a3fad85f86e632382dac70a57d7e1d4bab5ba7eb88f855", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "98e9d37b67b4bffcc0c5f2067dd091754338b867ee2ab494300550dcc972fe4e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "9ce67d3bcb88a654783a2f69da87fbbe9a05f369fe41c9e194b616029b07e1e2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9cf261a0a290848dcf35f89d4a5a883e573c9e79a8d88a57edaf30de776cc0ed", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a0994bbee8eff972b2088dde9d37daacc2f74507a014c4058098674ef0be83b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "ab4b5ab6dd92ac2a7ba6c6a1746cf4305b2350386529bc2495b76ef8e4d88932", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "adb8761e8576ab62ff160d066429196416552f983f377ff6a42bb196cb255914", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "afb8fcf4b1156217af2d7fc5eadefa6514539916abadab0ffc78941f2610a960", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0661906f8432baf26be93c5d488efb54b6b5fb9ebc54f70a694334c28502eda", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b24a72b08a13673d4335a7a819ecab0e78ee5a7718687db9452dae39d8332310", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b6011f5cd50cfda3af918780e2e25a337876b6d760551f873ad51e18e01c8811", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "b6a456a0ae26f9b5a19b5ac2a715d22de92c030f437de0a67053bf43c048646b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "b71fe6e49dba2fb5577f1292a124f75d73f6048b763d4f3a1de9108e6fb11184", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b8af121817dfaf6b6864cae5acf449624b9c5af299d41971acf465b541530705", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c42d168445ea4f4530b390068ab6a004c15bd45c3dfe5b2e1c53442d37f7ec7e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c9cac6f64032439433f98a31c87409841a3bc9670afe9f1ec38a01bcf785eea4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "proof": "d7781b222dcfcd36e3cad9a9a37e8398bf9f25e774fea73bd0b4a4a3b328c405", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d8101b0d46b61d13b3df3420c6c6980de2b629dea9173b847bd46cd8a775d294", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "da0484fa6e28fddde30bcff1011b223169382cb8ed030b30cac66d757babdba0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "dbf703046ac1481010afeae879539204b516c9023c46a1d8e2334568db85ab94", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "e6ddcd528b56404a1ba329f6468bbfe1eacc291b6bea95706fe17094f1e1d10b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "e7b9a06a090c69d3f8bbb9f8a4f3e02df1d65929f75e07e7fea03dc4a7326074", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "eb00ed39601af42b9918432a711e884bd3f7388cce0408d936d311dee2e3ce67", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "ec2ec209eabc52875368508b8df5825433e27d5d2ec66814b876c46ecb92517f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eeab061331a48bc149ef8f2030347e0849e7acbe73cfea12f0881f530e164520", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f35c37d29bf91389f752784b0d24775fed7ad6b03d3dcb1f371eba20a6b6f883", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f37b077b2565f0b921832c0fb83a2546ca46432b3fb9ceb0a6198fb232cc301c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "fac68e2a2933222360facd3e38a94cc5d1c59458c8ae4652d5882afd23425508", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fcbf1cce4fa5da9f7e78c9eaff1728431c70239d92fe0f5595c0b6a4aaa0f56a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dumr40vax9ax5s3sxfwwm3gvw76hls3yw09qlw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "40d8e9368460fcd016504935ebcb93041a4e516f12a2a559dff0dca16ba9c1d9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1duv8kyclgr3z4p67j3d6mk69ykdmhe2hc9glpj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "85ec00b2d549539d59bbe8324d27f97615664015fc1098d7bb0ec560ed591471e4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dv6wtqq96ncyhe6p5yq6tsqd74enkzndsec25k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e6bf3a0bcd227c9a153ed45a00c24388abe9fb7ac97ac7f03fe0170b377e11cb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dx8pj8ncxte36hv4ekvmekmk6q7v0q6dr8u22s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b456353ce5655e4e18c90c8669fc110d03b88e9c60b15ec511bb63f407a1291", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dx8pj8ncxte36hv4ekvmekmk6q7v0q6dr8u22s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7fc7a53e48b6129b6bc87730727bf36be33846ec7942d500b6cb3cfd15a7c9c6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dxa047vddglrzufuuxnmsnhmga6hckfg9znyzg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bc128653fc463c653d237b61d1284908d9584f846db6dd2a3cd5b110e5110d74d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dy9qu3cmfuuu80klcdlcwyvr8s54av7mp0susw", + "issuer": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "proof": "53585abddcbc0af4b7c39dd3f34a947bda848289aa2505b4788867b6ac456236", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dy9qu3cmfuuu80klcdlcwyvr8s54av7mp0susw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6b46a53040f65e63ee4653a74e2ba3953906a79cc785f7c081053bcc4be500c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dy9qu3cmfuuu80klcdlcwyvr8s54av7mp0susw", + "issuer": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "proof": "811e9d3a1d72717a969d08ca52daaafe11fdd4fc9951532f6aeab1e7751c026a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dyp32w9kq0f0ee8qygfh8m79q49ldap0f5rn22", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cab6c5d901401142d48b0a4a96fbc0a17fb55f0f3cdc9ce407ed27f4c3921f85b0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dyzz5nertryc6c7h5kaqml5wde5hcnjxprlpap", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fca298b24bd04a2c4d8c24c5fad3d1ac87e0b7c931a2cd4989c20a438f644a33", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1dz0mvxvh38wqcu4jcc3a4av5qdmlv3rmtv6hhs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1333d9f9e4c185577c8aedc74198f9a02ab770e556c1bb6526fe35dd7fe5387846", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e0fj88e0uxjvqtyd9ext6m67mh2m0c9qul7peq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "203152cab62fa872b8ddd5909b8aade5e8ffc43269f85d69bcaec48936b159f1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e0fj88e0uxjvqtyd9ext6m67mh2m0c9qul7peq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6605334a9f83122f463421be5d3fe43796e89f2d7b7110004e0afbcc4dc7bccb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e0fj88e0uxjvqtyd9ext6m67mh2m0c9qul7peq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "69897a6be25cc43fd89e8eb076f7ff3f7318b7fd0a9f51bfff2b0497592ec10b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "007a6c67cb0438a623f5d77409acb51ea5404ea52e98896648d1c7fa71f9b35a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "020a3198e1265e80de8f687c7e97107226ff1ac7c19a0e510d31080546fc00a3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "02ef6c95e5fdbaa4e0354aece5db77b207f3615d3af213572e36a81bcb01544c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "03742eaf33444ebae0c89bf6456d226a79ec4db91067fbe68c5d8950f0715270", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "04f5129decc62e7b69ff090f3ff875626e97bc6d12fb619fe24f62ca03a8ca9a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "090346de163e1b7be03605c19395ac932576a35caac5b2bae0bedc4529df551a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "09971f411336c254bd7683f8f9a042ead9083c61d186fc2d8e205673ac10b3b0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "0b4de7760bfe7943cc1574fe29d3912d4f9645839bf566555fc771d5757290c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "0b8aaa22bbb64d34a4616768f9861cba543f24d9309d9131be24d3489027df7b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "0bd4e8d0f7981eabeaa3c1795861b266697aadc046f895814019de3b72f6fd8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "110398545208f878d3384418c6294fad3c25d8c66953a48df5a1122f8485e554", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "11d7f3390ffb4288bc2b1610d74075085de7c94bc3588b19c58ca06d4724b48e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "14182e06fb600beb24e3b9b78e39b7d2449a7f3b3c9c79699b96c8f4cda24ca6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "14e4d12c5b471f0832fe32c3d033fab548cb4fc330dc2fe2304046535426837c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "16f945eb039049f5e10de4feb005bca69cebeee7ebc7501e7c9363e9eebc9cb0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "187c6d6d7787861f88151156f2a237eff70c8dde7a851fa38257237b2cbb9c96", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "1bea0f42e2d595817a5b73d09efc741c16e23de486bfe6cc5ea222a61afcea8f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "1d83d87d1ff06facf13231a5956fdb4e17edd8ac19297417e8014d38755b2d90", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "1ec7a2d1050a7e99fb395bf096ea99eecc3ac2f9a47b0bbaa4b68341651bac7a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "200f75a507bf0c22ccd650060d5fd33e8a1505329e8efdaed3286e3d231aa251", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "204cc5f04285997ef88d3b25964d779347bbca10c5e4bd4db4ba2b6f6b2e844a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "20d286874e55cc3426a27d40d661cde0454bf3436b3fe68976f56d13e0bb469c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "2164acbc13acc692ee4f6ae8e609f34823609520369187968f4be34e975c3812", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "2ab120f0ca7d41c329cf0f6634749358af33443e704abbbc47cc68bb4894a381", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "2df4884a66b533c1f93c97c38894282e27b2a37fb977972a1ed59178d30bacb0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "2ec9d1eb8c0ec9b7b4c25e9073b1530a6a57f9c93d42f45f208ac81cc8450d6e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3035460405d98f9909cf75858342340768c9d6e395315efaac20a14c6eabe095", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3060e88f7e205cfcea5f61515986aaf566e137c2b829b688db99dbcb4f0d7410", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "32a05385ed66b33f47cb32c747f076d31ace92dec2f5ce6adef9ca87bcb83348", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3342c49129020d64bf79474ee2e03b042dc5c4296aba830ef3a670ad40bf9370", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "34e7dbcafb64021402669b39dc331cf4ba36e0bf25c50f915abbe8996794c7dd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "37c0c527be3287eaafb51036a6537c15610caa25d214087ad0a0055a2516540d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "381c04ba99739c50113b80068b1fcddc2a4343acf1e99928d8c333e47ecd6c42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3c428cd3c7096cf1bee9dc9419d3a80c9d9ca20cd42743a2aedc7ddadbabbeeb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "407851933dee55e651f375a11532ce3d67681fb0912995d6d8d863cad0ec5446", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "408e8b32faf85a13a15c667038cb977a3c0e0b91475066fa2098f8c3ffec89d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "40f22f048f07f3dd423cf76bcbb37d8b0da0bdce01f427780da2a822fef349e4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "42f7d53f6bbfde4920441389bd380bcbaad73f57184c83e7f6ea143de1dbf5f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "44e5c2a24733f519a38df65961fb70e31707f75a6b335d6a17fc00b7e475e0db", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "45cccd378449562d6f928b77a595a289ae20886eaf4208edf436266f9b8d44b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "4733da616b62d8a64a05f2e46fe30915e7fcbcbcc57222a66e422b43209b5ce5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "483df699c2baa7582eeed4f615e6ae79a0dd374cbd435cdceb8b70382335a58e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "4a5fc8300c72e01fdc1178bfac4d794fab2a52c5ab0d2173427287331be6f3b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4e755e4c07e4ba3aeb636f015a6add38b7cf1cc87775af92fd8df81b55cc94d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "4fec74b7322f4041928b7712b09d16c7a72dd77e1c3adb94f15721a390a73091", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "5055336e9f9aee09f33c04daedbd6b6f538f568400df25c135b430724015078b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "512dabd2a4dae59203ce44ff97409d5c3884d7d0b9892ffd78ae77d6853556e4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "5201522ace531c09009389fea1b5a146d5639c7c7b2b9c827da4817520a4197d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "521e54986db32a324236c640e892c45288d0977d96eff62a2d46e07198f93031", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "52bbca78c48b29bc7c51214ed88dec05b6012eba8c98334e989b7837b7c91af5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "54f8562e5912dbcc5abaf8336dfa86407a3be10bd3bb8e40bc5445309a003574", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "55ca7abb43b25f58a53a5a5266296b5723fba82a5f5cb205333bf9aff15a4656", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "580d83b3060a0bcb33f96b3e5d864647f50f6ca761bab8282417e992f5c28a3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "5b22eb768de1e061afb74ad33fdda6be8010decec4a612eb64fee07ef6240978", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "5d13ac3e6b7d697c4e949f464937c49ae32e9547590ab252080e7aeeb4b88fbc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "61a74bac821ab67b429c892a5eba65139b86899a750bc2e39d00c879376c1791", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "61e50b894f3d2f8f5cde197ed32c91717134ade29e2d8d37a88c14b4cb92d56f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "699de34736dd7b52baf35e1188216e4162b7a4e2e91f299f378bad4409cee271", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "6bab68bc2b7bd51801db5a6b05d6c5ad5ee58c68ba9bdeea349091e22e2181d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "6c2db06e14057e316c8ed84b503adc810a56032e0b46b29f4f07d87287636e63", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "6e17f1e7fd51b1037e136d23f790417879d3bab999fb18132a62c13cc3d24e79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6f55bea5fa8f4c84f1efc278cddbb9282149622cdf7ab1750dbd42d7e4ff0d3b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "72efda6e71f344c3cf92f7998209f4a6567a2ab17c4d54ed9700c0d8c1f9e66a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "7546c02b05a28d261284b0a429f2989bd21da016039110ffd478b91ab48c6b63", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "772ea9db36c4ba8a89dbf6de781c0b0277add163735def09e60165e683d2e460", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "776549c3fb68893aab9a79bae15b235bd69d8131a6660a478c8a24f897bae226", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "77cc3e7b632ceb27c448a6cf884ee0dfbda893dcec7eaadbe8e2b6965fc95abb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "77f2658e07676cf97b04dba3d5100c76e2e584278e96934310a462d60ed92faa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "7c695a331ba38127acd64981bdbf24868c37bbd115b29a5c72b09406b2cc8865", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "7ca6004e672aece716994f97d2ad227aec12047de69d8598524364d967f4f47d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "80f694b7277ff8aafde7c6c7028a38536f2c3c192c5bfcd32b6f904bdc83e7eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "8281c53a360b0aaf6a275ea7c4fd8a10410a57666cc951793fcfe19f64cfbcd2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "82da512f75e20bdf0093ef31adcd2a98a94788bdf6ba8710f3d04b0070b62660", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "859e4f49bf956f4fffd28496fac7ae90db7a8a8cbdf57c3d843c112ac63d2ead", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "8a59d81602720f28245110d05b30deda7e1666d647d8ba92c481e792cedd2a5f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "8bb9f5f41679d6f229954c2e3a47dd3ea7bb50b58f288dabf6c75e6bba2ef2ad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8dd7ef4c108f0ab1e2a35056550f6da807c9b18ab3c5e413114790969dc912c3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "8dee5f03b156350863d9a8e091d58d30b6bf15586c57e861242a60754c3f946a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "9156dd2f98f84d34ba32938a365b444c06d843cb3cf12abb09a45b098bee9632", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "9158bcc91b0722eed7d88e3bb52698aadecb65175d248c018a854e3a1fa709d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "9344dc965436f72fefee73b2e39ad9e163e9432b4f026428580e89f713a936d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "98e9cbf5861195e9f335b8aa8dd1a93a72dc91509c088d8b440224ff92c893cc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "9cee2b8444da66295110fd7b5d5fc64bffd45a1c3f40721020f95e815428da8d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a436b1f1729154c1acf18c5de30469a6b4314e5ce1540e67fcd341464dc01798", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "a49c4d234581f44bc72b6e4dffe268a7373d3156b39c19c949aa7098afb5de4f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "acef574cd3345d1aece2426c9db54b5a59e1151984db20500c3d3801e9a23b3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "ad53236cd1c3c68e6c9f35c7191065d110402dee90f973d1d82d90f09943e142", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "ad8cc7d22310dedefa10abd67da40f9a5d5452e4dfe5fc826f3041d82c8882d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "aeb519e15520d0c3daa33b9d635ff9bbff294b2b3d464c34a8c97ad564dd4e53", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0cd1553f72af01571da21aea59fdc2871e69e334f6bc71f8b7360472a2f38a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "b15c3dac3c4a42c14cdd73d0a92b9474fda31a86bd32c0b4c610f19daf0ef747", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "b472e7168c74ae0f20655c5768aaef51f721532e103d983eba7c5339f2ff2db4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "b86734920459c92f415498799106cb8870dbf6befa98646b6cc1aec984004016", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "b88276c24de393e4df505b74267b5d53b0ccb37cf0a17b9a87dc8ae5418df3ca", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "b9c20404b82d54f1961fcff6e66ce9a1285ceac9fe21c17d2e220c311d5a1b82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "babb79fcfd64e20ed98309ecbd41dfa3fb029f6f5baea94b8897e1e2b1a06812", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "bda6d888fdf08155165c7a9fa7481c6c9b9a39863dfe6799d8f7eed075b7a4e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "c391b7a5fadd1215cc88bbe10da92199e051bfa07f82888a4225173e65f752cf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "c59bc82ec3d562aed050936983074f2a44bfe0fb28f2ed0b75e9c0859a3642d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "c81244197a7f2d1cfef34aa362c94207640a5c286403caabdaec46c24cbedeb7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "c940ab1781b0b68197ab3633dc9bd99554babb3c133bc45bc2fca07a5cb8cd59", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "cd59da87f335999e2e76576730cd9f3ef536d2abac695b7e2c97faa17c1549cf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "cfb9d9b789bb381e5257a8b1e1f3baf9ebc8ca76b367d921ec20bdfc83c04110", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "d290ea3970c774d11956754276abd8d1198584ab277840d6404c83f2502811a1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "d4ecd7565d925eb9c40775ff523f0917aad36eebe37491b1cd0bdc9525082334", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "d80e26bbe638a36e268fb4a7857d9f9a2e82ed028be2a78c56f8d8d9877dfa80", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "d8f2b1f6584cdfe7d2cd462b84f0e9fa1b39bc5eb76f56ba0927d3504b76b4be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "da3d245814f9c21a6f3706e0796c9d205fd444648fb1579e0f6f46a2e19d4784", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "da5d9a967a135651a1cd20091c4d4a30fbfe854dd81ee12ff7960f1af50e9a5f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "dfd559a836986fee694fbdea677a98bb340a96ee5be68714fae392c39bb0eed4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e0979e0c2124881172f36512d47710b388410eff4663861bbb53594aa1fd121c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e120cb2de92886f15e75e4a9b805c723059c38ba7972250d3c2b76c0a7982839", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e2b91a25ec62ee575c004263a77db0bcf6a420e2960efac0ebe1bdb816246a51", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e4e8831f608bbf293112fe2363f63ae0c8007e356269b6f2f2515d23b7a248ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e80bb8d1bfd18060dab58aae409adfef09c3ff69c7da5b9a4336066d61d848f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e859efe6a062089c9751100d69fea99051424f6af1ad88ca3bd217f53b4e35a3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e8a428cd84868d39f3212aef502dfbcf175434bffcf3532de672d217382382ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "ee7d0afa8af2b589c61006b3008c7c7244c967a0358dc6d0e4dd3d52998d1e6a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ef7a0ad31da20801aefcd9ab74731eb5599a53c01d3084ab1f90b301e17c240c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "efeb8283d1915ada288fcf3a45665541bed0795e22e1d2b9d6751550690c4e5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eff0c764fe91ecbf54d68c1858b5de4a0b16f4f5f7442d65760b0e9f41c69b91", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "f1dc7c794213d96f4c3dce5fae9b8b91d2bad1167fef54f271965bdef7286214", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "f1e591047a53dc1dd611983b7512bff9027f4b4eb5a5f11ef196dd8581ce6b6c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f354bb734bb3f5952c608e80b28b22546cf3220e3cdd936973f78cd788cf8979", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "f41fe2bd66b26915915ec504daefe03df6077f4c9f4ae76f9bed468e0af6f21b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "f6b92b529864a4558a703e9901f3b5f471fe724585a09424ffbbef7eb7d88ce5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f8f5acad355e656daaffae72238f4633aa34126ccb98d106e788956b045e1bc2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "fa5d68a77d147bcd79d2ee331a0006a98e1b4ee84c7ca206fabc3ad6db95680e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "fb262b78be9c9e9f5427b1bc6a4b3196c96dfc0309610facf20afab9533496cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "fec4b7f364539a1feb818cc9947324a9215aac43c34ac6af67dc23a144f29316", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "ffb1b95b569b979dc87ee71a8e60a1746a89ecc2c068f0d91de96f579821bc32", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e4ha9junyjl6yfmasjp8q77luxdn83xk9ya8gr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "41bde0c975973315757e05ba0772febeeb75b6f41b9e296a36961544babeb1c393", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e4l6mxyzn39e684e5qjdhzgk0dw0z74d6vl84j", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3351fec707be2dcbdc35cb66c9820723151d25918b3d4f12b321f4a63ef53f62", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e4zj2xtxa9ltxk56e4nvqa3j68gsuhcu0plqsk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "19ffeaca66cea950b5dc423a59c94fd055a84611186e657cda0222a7080f22e729", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e55arqejj5m0ztnr6v3dtv494a89ncrg8d0rc2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d2abf3db3e1497297295556a67ef0d61decf53eb45d16c3ec03e156826f374f646", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "527b07a1b8c1d8fccbe8a453608397fcb53223ae1744014e13fce74af72e65b7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "55c8582f120a1ef24173b158b313c0066748db4b650315251155d69dda730fee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5ff10f41998b14fc3d0ba9ae475f1609e539d84b790a83ffae6156944584a34c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "ae11be9ffa8484baf42419ae4da58b456bb3bbdfb28859ca7a112c2d535d3f8e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "ea4c91e27ede2b0ebd04c73939489ac3cc220bb075cd11e3d71d1d7ea02c4330", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5n7gvsx6yhlkw4ya63lhhy7585c7m4xwajvse", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "50abb151a493da3722851abffc3831fd2744a2e94ea78a980cc23c532a04a011", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5n7gvsx6yhlkw4ya63lhhy7585c7m4xwajvse", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c21056f18b23bd0050cd0011b8a49622ba605ea9b64a43a2c47df7cb438538cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e5n7gvsx6yhlkw4ya63lhhy7585c7m4xwajvse", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "e935eb6ab849bb01f3eb8cb65377f0231baa8a261109762b1da4b831ab669b1d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e6chqq9fskw5qm6s0dt4rypa35ltn490z2zk65", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb4a8567c6d3f932fb4c354d4f2ebd79717c8b31f23e1f18d8d4386c8c099382", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e752nanwe9cl43ydd6he68cq8xv9f2wwgf0law", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "68a3a06b4d72ecdad465e95a6c88deaffc0bdf1fcaa435d82ef897d89980e5a3f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e7wdm9qp67sj77dfdh6z7fnjgf3nggeckx89az", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00a9eb1179324b3f97dba544f292bbee780cad25b08e886d7ec1a48f3fda2e43", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e862qw7jpcu2352q77jcz43uwvkn3nyqcumq96", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f86adfedfebf929371192f0c3e649b7a2d3747e8dda1a58e7f62f5cfe33ae88f30", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e8u34rnyzkhxgtqq8svntsrkt9zkd005kn47ag", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e690a1dd3f3e098019f848bcd9813830642da0523a7ca73b7e687a3189d3348d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1e9zl2prtfkjd96ll9xsk0mk7az296jlzpvpawp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fd663c4e4116cfe6132281e38bf9e9b497e8089806a98335620b8ad4aea370b0ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8635650658fa31b2a7bdfabf4b8a93103db4d7b4b8247f86180d237e3e34e51c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eap36qghw76uwslmek9m8k28r075we6ne9s3q0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "04a667d54a0974ae76aff260d059363961a69b56e498ca87ab8097faad630369", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eap36qghw76uwslmek9m8k28r075we6ne9s3q0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4e815c59d66b96e4226b5e816bce32c7323bf4c279bac5ab51e627517efc4bb8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eap36qghw76uwslmek9m8k28r075we6ne9s3q0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf091a633cb9a42985d10893f823571965a35c7751f0f53cc728438903ac3117", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1edvsfjt5myclmpakd3u0a3ajkk2e727hpyv8x3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "707051226b315641b75571f2d75495b043081e79722f3b6fab9ed3da0e5407df00", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eesatknptncztquwjmw2lppcmygc08m02z9huz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a9b5a5e75bff00653c1660c33dd6373b99c9936d411ccd3300dc359df45ba504", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1egc4gr384muz82rh8pste6tqtvcykqhrdajlpl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7a464dbe4fc94ee32e4fd1b7a0d53f2ffbd9f03ff03e83400811e8c942aae5ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eh3fwxyqgvjeuum85wue6qraylm6sj6pqwtakl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "28e1f497e71f43f10e58caaa94d7a25e1e772cfd17a498cbda5aeca4b731ffbf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eh3fwxyqgvjeuum85wue6qraylm6sj6pqwtakl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4928f550686a96707738cdce7f8cb031c76651a3f090f64168bd7fcda06f5250", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eh3fwxyqgvjeuum85wue6qraylm6sj6pqwtakl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c06da571dd76123ef70d78c2118cefbc0e6a992e7b53d8b5629f475ec411aa3f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eh3fwxyqgvjeuum85wue6qraylm6sj6pqwtakl", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "c708e1cff29c1a4f5955ee70e2d61c35b188c180e801fe5a22a34d6a7157c798", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eh799wrnwe6f53hgtq94lwhecf8kxumh8dgp6u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6fa8ede3c2087714188b5ac6e7dce1c5c987f0afadae7ace1adf381b03394acf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehs7a9mskfurtc4wyryzxgt48wxkl3ahg9a050", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7044a898940cb89e711c9779f2d2b009c1da3bebc6d40f899cf5b6f2dfd9731c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "00ae4668c07b388969c188a5453d55decfe25bae103941f1945861b2e9c891d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "3ddccc6b1649c4f4ffd70b8d00d3d010f80ffddad11cf5dd9c11dc160de411e6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "838a2f4c2e4d88728660188efb1c07f10eced987ced832d24d8831c33042f7ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "88570d1eb01fe90de704df4fb3647563e7f760d71bd974c2e039445e854261f9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "8995a27cae3189b960743fedf1cfb29fd70bb7cf5235d9a25b2d92a88acf0e8e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9a7dfda25415c337446f9739a03f34905221d11a4c2d70bfd407fb557c360316", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "a09fa578c2acf06465f53097f0424b07d6fb8899550a2a9464a19327b27cf237", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehzv7d5nw5rs5ndvs22j35jrl6ry67auknd7zn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "54382c3653205d356e30b0dbf80c454c26ddb8d8c325c80176ad9ee8daedd8f9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ehzv7d5nw5rs5ndvs22j35jrl6ry67auknd7zn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a998660005561112e1d9b3e9b64b258d0f0e2a464387895b148a63854a72ef6d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1elh6kj6ztsvqhv2mqu4mw73rh3xv6w08h9xcx5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1d4524084c0db9b1090203a6b989b73830ea52b2d61e8c2e753fba9c3666399a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "215e33e40ffdfbde02a92cb031058f3f536526e2561f04f1c8f4e60d182fec9b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "32210aa72ee3c808dd393be4db531f58b04c9fa9a1ebb47c85ecd14b356ba029", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "issuer": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "proof": "4ebc08ff5aef3d694dcb12e8f4113601e33865871fa18041a0c725c53a3b479e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "issuer": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "proof": "8524fa7238ef6c9ca866e93fb2c879bd9f309973c120d19b7ed0700664199bcf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "issuer": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "proof": "d3b684444793a2fb5c4b91e44e6d5462713a73b6911765203f78c2f926baf10f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "issuer": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "proof": "f59367c84945ffa028e0c4f498e5cd9b4ab0773003fd6e95102112621e4679a5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1enmk464hnqw7n75z7jx0r5lzdvrdt29ehr4ypl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e3d93a91fe146b2aaf893f1bd44822c9b53297f67cd520e5482afb7191c364335", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1enp68eyhxtgk4hfa4qeg2zlzv4ak4usqas7x8u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "afbaa2caf634c8068a8c35332145c581e8e404e7befaacc48690910d5ee578c143", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ep99t53asvqx7ycp8kex339q4drrrnw2n9zagn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9feb7069a782f28b9cf8d76e5fb305110073c73153e177fabba08489fce46a5d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1et4qv50qzw9lk8f0wd3sy0ly2fgr36hettnxmf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ebaa207326010d3ce6ecc926d32ca89bace3476d8a773474b7467b3b73e0d0d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1etcgtwvetqnwt702dza45lppnswpdc2eu8pz7z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b76ead0eb888d1906f1e0f50c0008d7b3ad4cf5cec2758dcd819ab99902f7134b4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1etd2vqvz7v8dhwr9kmansexeslqax7u9dylear", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49eac7d0bb3efd3b0eb947b2617bf68ac87968e0c7f49b885aa86fbf6c526fa8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "1854f6f466e7892adf389400d03d79a791f0e8d018dede74ff9e1d7246a48491", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "432c3e3519f8035508ffefa21a81ba00d1c8fd73d25b267dc9e87f473f628cfd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "4aaf9bc545158258de122a1ef7c2e5f8b1cc64916f68e6428fb66e5206529f33", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "61a4758dba4370eb3cf8e75d198607310f7858929a4cb84d880840a51b816739", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "6e630558edc7e1532d0d58c224c64c6d610a0ab8fd440828e6305664f8f4c8d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "88d74a2d32c88b4ed473692791792887a17e25c2d5445907d2cd527b1636d4a1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "9dad405d81c2b82cf72580de64fa1a3fe72867cac3a2f323cbfc0bc5295553a6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0ff300414cd5ab0e2bd86e1f8cd03d6d6c93701e90f086ec44f8d2d1eff4451", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dd5fc9faea79bf12ea593581b000c8d7f7c85f09471aeab305e134a5857a1d1f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1evltp0x2lp3h67wkt7lyzqgye62d5xlrenm8le", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e17a87250ba448f7103a6d6bbcc828f32ce3a763cd27a0b7d2a663357e75a71521", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1evvqh6v6928gjtuvm9mrd96cc52ftt6qsf9hlg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e7baf7c90c8ea60b7a947a6e4273347c4def7e0895dac5e1d7c9ea2ef21fd0a811", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1exup3zycyrc2r7v3uqet5dc4dmuhtcgjkpxwke", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4381eaa57e128392544523d3172aad1b243a17be9756415be60a98aabe1e0ae4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "64332293bf3c43847ec379ad4e8b7217e65161a728fc91dbf5b4f7bd514e501d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "687be6f119c1133f865fc83a99e61aadf7ef99e695c7d9e3dae9c75a9387ae15", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e0c6b72498426db06dc0edf3d73aaf67792a7312a629698d0befc60f08b45c42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ez4a6ugccj9gpvlcdrxmdlh55jsu9c9cz60va5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aae2bb8e379aa10c4b169aeeac15c72df6871f5fb72e5f55492bb4f3792475979d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ezz3gtut7hhrkdt9td32s5lmfmmxfjtgzn5ztt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6538c4286550bbda749ec78a62fb98d5f403b01d0fa7390e6ad24329387707fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f0n3h02pa73adrq6y6sx9dyrelfhv6l73jp979", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3d7be26e5daef4aa91a0cc7bb68658ff3cf21aaf149f72760cfbc4058b866d1599", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f2fmlwdj4wgew8znz8fyusyaym2hze2cstsgxp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1dbb59e553a15d185709cc328ecff3fa809749542acd21d739e2e09e8e44cb3a3d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f4vaa53esz880huj4hc8wgyxaun9jm0arxtxf0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e30af5f2f8fdeb896cb8e6e7269f7ff014d8694864294940b4441e2ca05c51cb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f6a55c8ut9uktnc3qzesqld6z3536q5w4degak", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f0c1345986bf8c66f1f686bfaa02cb80e78c774e169606eb369f1aa44a8bae92", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f6aj3qpmh392hd449acvkgfl2yh64hlxpjfphm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1e2dde0928b20deed320e10d7268b68c25e53dc7f377a31b4cf84ad4b15840139a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f6zq7txxsn3p35clyztwral4dvaujzy0xmntxx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77bbf52b622cdc286511831a316aedcb4e50e8302ec52515a9b0b1d61e390e2997", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f7cekkf93sc4wtv4ae8uhsmas2gq6c6jxfqfc8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b84f712e7d20730053e46589f1602bb7263237990bacbb7a6ea5466d1769604f97", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f8nl3hp7qmpsvycze2fhm2re2h7tm2w5jz37z4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "60010b57f6e735e2a4db0ca31db77a7a6725174d11f1fa69b25ddb0a95900335d4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f99nefjn8dmc69ypvr3usej6tjg5w790tj689z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0311a873ea80925af678f292f1d2cf3d2721d9307f7ed6e98ddcbd35f63201a3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f99nefjn8dmc69ypvr3usej6tjg5w790tj689z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b16153f4b9fbbbc03f0c327d357a24aca371301c1cef2a2ee64d4ced13f2713", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f99nefjn8dmc69ypvr3usej6tjg5w790tj689z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8f8c2b675b844955c87915c492c700892216898ea246213636c21ce8fe991a73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1f9kgzl2clf64rpvuru2jml2q62lcwjyrpjtm8r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7a5f9b98ca6860e5e871e742aaa9bb23bc16b69b3bfdb9dfcc1a533c637c5d702e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fa463af5l85pa5umlsm09hrm3e522n0r34dwv8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5f358806b10e104ed7d5f210b9f4c0803a74a921c8063da2350aa27c0450848ed7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fau02ddafxr6hqytrlaynzag76jdpchg90s4ku", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fe41e64eadfdcd5529f93e8190cc03574e1e23804edffa5a62ccea60a94b11a903", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1faze50asxnrn7mryxl3cgjnhrlw5kp9cd399sq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "04a6d4fcd4c0f77a550275908314042bc90e8a52dac0c8259b7bc535f2401d9489__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1faze50asxnrn7mryxl3cgjnhrlw5kp9cd399sq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ca4d470ab20d65b8e651bb59ba014a48327c4254a6ca841b3406d7002191f56bc__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fc8yc4uy78p8pwl8r4z5k09yrec4sqwwtectwm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "481ba358e1a3e38ecbcac438411b2a710bf4b98ba8d0305e0b67e7c5ba8f922739__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fc8yc4uy78p8pwl8r4z5k09yrec4sqwwtectwm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "58a74378c5c7d407192d0d9c2e393b01b8807b841f9ca334201b879e363a7b9688__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fc8yc4uy78p8pwl8r4z5k09yrec4sqwwtectwm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d77e85089fb10dfbc19247a2ace71d2e59577a18c4980edd4f4acc3044d2c8faa2__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fchtvze63eqddhuna5ggv7ajc3m3fysh025qfd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da7a510c3e59bf0ec6b81aa44de08050f8feef377ad5f09e8f4de6050a7b398eff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fd6vkych3ky3alykvvz7xh8hw4yvuaxppsdntj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e3db45f3ab2b8df5c20e8fef1228b81774a8b2df3d780515458ebe44ca2a0c8573", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fe5y0k0khy26ky3htce0q7eut0snglhkq527et", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "095c4c973902c7877ad40a1774f6f4d17f37d775b29e864244fd04e4cc4e244c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ff9msgzp8yra8973cux9kr764s6dx676edadk5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4a527fbcc1a255561a13696bdd6c5ecc4e400b25693e524401275561c5f03f90", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ffemhrlkvsvagcf3096l6w85uvdpgcpxmthxm0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bda40c0a9633f86c46a6cea4afa70e51a0c450014d00a0acc4b7344e893cb923", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ffp8puaqk2ejh7kmg8jhf65ygt0aepfg4s3l49", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5ee4c73515986ed7314789eb0ee64fc2a3a639d823a61a4734e2e6837280407d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fg8nt2el6vwwhflqxeq3hz9qn5k2etzed0jljl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7a18719dfd84a81fe25a3b1c2b3977166b2dd8ec67501640d432d3f9b980ee6f80", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fg9x3fp4g479fk00xs6g8lw6atdzc0y4auh7fk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5872c984bd2777fcf93f750f39ec66df06bb99d33bf5268861cf74e35c437dd16a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fgy7mjfvxjwrc938s3rjyd3mwakuz26lzqs627", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fac3bd693c40f00a22dddc24c0fd3163824b457111047d3218359ae0a89bce2b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "1a5d87906a9b43e17b60180e0c47b2dec9c3876b743ce855b4c237d574ba3fbc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "20f4908daf20f1f0e5b05ce5b3cc6e7c9d2806bd0b4daf9501e30633a7548127", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "24af3b9431b4ccce17f0b8c53594114ffda652df1f4e77a1375377914cc8f5be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "2d9c3f2bb87852fb288574bb6a11c354c0c061472978fd4e5cba6b3e37fae8d9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3a9b11b8d098ff41e263a26c8d24ae6d06ecda2a78e4a5e5636aff31b27c09ad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6026a6c84b47f2fddfead4add4fa1611c6b63002aae0f249a8b523209f48f8ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "6c8238d17aafdce8ddd7a24a5664483137d03ea39a6e6816573b24e1d1784f56", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "b1b388155f5eeae1b10928bf32bdb6780bbdff21884926bca9fa6d5b508eb4ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "bbff56e10ff1b57af7975f9e2f202e4367e798d093004d7d931581dd79344974", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "c339cc9a9be6cd531fc335836220e124bd67a9d51ec5f1969b81372c0f75e511", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "ebf173a407db100e164cd89ab2b4ed34696662c9c8cb78ad4eb278b82aa805f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "ef053be120bff6caadac5654a921fe8886da25f1e37b53b61f162484c5bb4d18", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "f07864b7165d6308ac5c96145d1a2341d40384bcb031b77b2aaac0ef2e56187d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "f3b39e25e64514c79913b333f842cbd5601da07f660a33617c792662a275cb41", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fk0urvk4ks9hz22cfplc0f9pse0elcacq3q264", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "02d1393fd3c37ab8acf60d1b2cb94187dfb0cc57faf8cbd25dd28cad608e4997", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "20b1f501d699fc9ea3cc322ae4fd3ef3d56157a6504c7c0be4d91dfac36b9122", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4fb390334908b2adc5181ab70f894b1491a34184ec54c5122ba98c70901318a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "793d9e5bb437f0a32b1c364e2ff8773211ce569634864b3883af2deb34cba075", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "84ce457e023bb3d7b3c87d0d97590fac06413f4a323dba50db8cd7b4a8d4ef01", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flezzaeu05yau2mz7k3t7qqepptut2vwn2s5lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "06fce5fa8d5a777fa8d26e49c8408ce8fdf36e5dce7b23074221e6a1e649ddad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flezzaeu05yau2mz7k3t7qqepptut2vwn2s5lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7de85cf56bd23d718dac1e60bbf3aeaaaee7b0369fa082c1b4f114fdbaa4c3ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flr0xczw2jkwsfevdnmtm6sq0p47j7d873j7e3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "233e4466e9e25cdf5d398e400db951d3f4ea3d12a732285acf013625934607e3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flr0xczw2jkwsfevdnmtm6sq0p47j7d873j7e3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3bc8b588fe30ac38ff96c1439fccd61ee68f92a68f38beb76c3c29992ae95d6d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1flr0xczw2jkwsfevdnmtm6sq0p47j7d873j7e3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a2827f18198779d49088b01b64be7b6f3918ca5b4d90d04208119324848f8cb5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fmwvlmdptp82yvr37thnuf3k8n4hwj356xtafs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5206133694f693065f0237337e0bee28822f71206d1f9cb7f261cdbd21f50943", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fmwvlmdptp82yvr37thnuf3k8n4hwj356xtafs", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "910654aabf5b3e2be295d33a822f35a2aa92d42aec4d3bb679a1a07da2790eb4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fmwvlmdptp82yvr37thnuf3k8n4hwj356xtafs", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "d81224208047641c71a1bdbd4ce61ca780ea0124d6f986823cb8112693733fc2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fpgfhrc4yfcrwq4263kvw6ed364wwlrfuxs28m", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "57e3caccb4cd7e91933bd7e3ee8d15d2be58c68cd9410eb9ddfbbbc508b6d992", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fpgfhrc4yfcrwq4263kvw6ed364wwlrfuxs28m", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "a56888a6a0154212d273c57ba6ff0619e60a4caf51de832608f075f51cac7f3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fpu34mtlnz7lyy2v5qus75z0saj0pvvual9l03", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e0fd1506e3de222b09fbb60aa1ee913db47db1348c73d8fce2202688bbb0f1e177", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fqapyng9u9h4czztc5qanmlcvctuw5v8393j5k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "03351a037a237157f9e80f348d642c345ce3e454c5c10e9e894f6bbb1605aa722b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fqsvyxpxtyyjfwuxzhzagxnj36em0x2tmgn7u7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "60f8139d514730ba33f30b49085075f1140fd018c703bcb355a664c331290d82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fqypgm3rl3f8fx5hjltvk47f8uxlf06q6vwt9g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d9f4b01b42b6e048fe0d03585e54ba8641ff23e845038619c25ea61febeefa9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frd765gkpc33rczsndzapg47dklfng6cchzu3c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "52793cad09d1d197e5ed984fb26f8b4e6f231d97c2b37f5d24a875d5ed270447", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frpvh5wwygr0jtk4c0qzz2r46tkgm38g95uf4d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "25a4376ff19a9be11ab7882c6f837994c2d7089d138b4642397d7975e1e71da5dd__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frpvh5wwygr0jtk4c0qzz2r46tkgm38g95uf4d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "31a77910f11a40445bac6bd914c9bae9836127d3c717fb3fcb93e030c7ab95b77b__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frq62pegvfq8zezqg8mmmmhytvtm4eycs6tesq", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "033fef8ea57ef7ecfe722f288a7d02f8009ead59a940d7a66214ac12123af51cc5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1182be64e40e072d18f9fece17d918864eb31563d5f5995ced2a8fb6fadffaef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b35a8979225fbc07e9ecd0e5ad6f42d78818c233d6af96c04795cd6cca82db1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "65106c386ab96d939baf734ffd56ce5272643e86b51540db2b223a987b194235", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "75af10fc64c08cc3fc3293caa9f9461273d96877a512a78a7a840467eb4f130c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c1982b2a7ea28a9f397a2e7dea3d59f0da144dc0a641fbb6dc608b4b5a3fca47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c9aed7111203cab16703faca2d82d154c2c1eac1eb432da49d9a2946828cef5d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "cca5b52fbb6c0711cf33cc0265bb2ca9233e90050937bca4e711c2448a78ce18", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "d69c183247b92c3bdf75351ee5c6ed387eda28a74d49b28ddf9451f4ab10f8f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "f9f3bdf5596cb213f21534b49fbd59a69421f6dcac829aa4f659d186c748058e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fs38mrjasjp4vshf6lmgjzk3myk3rpydwtv9rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a75463b16573b99bf884e1ca9a66b7917be0c8f27da595aeae5a023f0b355e1f48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fscvkazpkda9x4tnld2yg85jvgwdplcykvuqee", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e1e38302ec640506871bbecb02f159733306ea98a0a5797b0dd4a888be2489e3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ftxjrd4hhdrmf2nseatagm7f2sqcp032rwt8kx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1057ef4a482e3067fc78a7bc1343f2b65ad8ad06909bebf4b8e753dd21c6733406", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fuqqgvxyrgwn2epcvtv93vc2gmqjx8707td284", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f178d284a5753e605b9fca33a37f29c27df6c44982bee4e194fe428a9d360e7e5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1futfcfwqvn86sqgt267rls9m0rfgje9q8xqy8x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f7c5d39b9bb59fbf7d49f37611807559f28c8701e3c2119566724049a308cc551b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4eba1904be06e0314ebc746ee5da516cba3032ff65f47a89a6d9c79cb84efe78", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "700d95cd48a068302e5cb0f4ea7e86e326abf6a6f53a6118f3cc1478c2ab6ba3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fx9q4kjc3knh3mh33eae0rd5n6ejtuxmadwqc4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "76e6038de319da6a0add6f291d2ccfabbc9311d6b77567ca0d1f7bac88bd52ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fx9q4kjc3knh3mh33eae0rd5n6ejtuxmadwqc4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ae2f038e1377d977c7e57d4309e4d21001eb0a373d76ee299cfd111647dbf91b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fx9q4kjc3knh3mh33eae0rd5n6ejtuxmadwqc4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b9e537f36503850e86866c6c409917b11493691048934f7093993f1e0bd9b526", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fyft706egyy8kwyzq4xccasysty0v56vuu52sl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "06219c99b0518db514fe342202044b70a26f1d06bdb11d63498a89815eb173468e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1fygljsm5mh4rnvnx06d7st7cseeda05qyh6u6e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "65b6306acf7426ed3c402c1010a6b1b7e8c143937cc9d8f5374e0aa864071c6b58", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g03nwtvsc77qa5zd4zk90ukgxyrw6qkak3z22f", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "f0e0ff733236433973912a69758f224a381523bbc7647198b4c3b40330a02e3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g0k2ff8hte0e22ge8fre7tepsmcr3dwe5m4n2v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0177575bdfc2acdc5cfc6706480974fb36f236eac7029bbf374c66331f91d3e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g0k2ff8hte0e22ge8fre7tepsmcr3dwe5m4n2v", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "060f700ff8152e5d31ef4e9e093c4c0999f2ec2f6518a060cc7173ece4d3ab78", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g0k2ff8hte0e22ge8fre7tepsmcr3dwe5m4n2v", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "bc68733207ed05dc33ee8e39f81d6a2552e628de6af749bcd82e7c6b7ea17115", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g0rnxxr770emtw9mvmxmqde44ezh2cqdfzhkj7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c0f78c586d6e7cd45b577add441c1f4d4856f9bf9f7937d2286cb62e9603599261", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g0ry4jvga58m34ds8rthywdn0kr4pd44uar3ke", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f00c54366f4ac393f03da614b9a502c392e2f544eb19ee266ee86ddb20a2a543", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g0x3mam8mzq9xcyqpf6vd33jvs0m92n48a572t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6032ff22f505186b412020e98aa8a2e2da4352d7f52bebc186c13e8929cba187d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g287pu6034c0jcp9n2dvfu85w8fgjjdlvjywhh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "25287b499bbb45b78610a82042b308abd36b3784cb6f11743ce2fc6217cb3cbd81", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g2a7cdqa0kn87dygwm5wvmtyu3mtgw8dlfnnp9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d9416096b9c2a31d8d3cfd1c7f82721196d3edf5193a774da74bb95af0176b44", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g2aattwcw5dm8e5vlskxrtvyrfnzvdkptt6puk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "595e65e7b4899cbdf9076c2b666d72bb9791ee7c6e66790da370ba39bb3c2f5b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g3rzqc8rjjhq25r5fcyr4n3metm6czc6n48tw9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "613522fa71eb7a4fa7766eba9fa8f46050ebf6c25792c91dfb553c84a9323339", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g58f5ug0t75fm2fnc45ashnlmwfj8uwzh2hfry", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8e6703495320ea162c0b790ad9956984dfe6fc0ffcd18d752bea3a4e8e6e4465", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g69cmz3jqmwsqk8cc7pt0k4s3p8me9v9pxpgz2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "69394ba7187e001f8f490881cebf4094b2448a52e6bd87386734b78da1650ed369", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g8us0vgpgdzcg27lj26e3mvf0u62en8hjccqzs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b18d53720cb3fc25acdc876075fefe9b5ba96e511fa89687295e05781c9f4d881", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g9cl36hx2dg3mmlr2c00uuerlaaf0knq6x0fw8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "945c26d141c80a1589b1b558ace4690ba3f277c3719e1b97b8b066910f1134f4b1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1g9kd0n3etutd7hl20qmkce3hsyayz66wqpefu5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "35fb8bdd2b2db66257becefd92f9df9f615e27c81ed39d7d1cc6b9c1c4b053bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gaajp34vfp2tgk5s3z9rn0r2m46mpryryaq0ja", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0bfdbecdd7c784655550e891716f32cb7a7c0484e9e10f1353859d0e3fdd81a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gamwcft8j59qg5r8xjpe04gp9hgeppwpv8n9r4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c7a7d6e7ca49dbd077cf1ac9652f34c672fb340eedf73a1b41feb5eea764ba0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "209f36d7ab4d8468567e15a2c8021239fd5f37508aea396e9d0dcd4de36aa0dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "26d22e1026afd6ae26500929962f03ec0b86b8c9f2d91c035afcdd61d25801bd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "2ecb6416e551802ae532476ff62cfe4a392f92ec85e5e6e2bf1dc9016acbb389", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "4c347202556f0572388ee41a42b7482a07878d8d032071a419d9ecd87339f815", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "4fbb195bfbfec8b833cd43a498d7535a47b225b396b6b7cf89056743e814aca4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "620865e6aa25ae54b5031211d4741a6792cedf1db07463c2b219b6e5b1ca00cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7388966ae62f0fcdedca16c1e4bbdadac531d260c4ca0ef710f14f9091a1cc6e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "80c8d1215353e3a9d337c6a50216bf12a895aa27ef78a160e307764b40c523d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "903980fa6f71692d9576284ef834b978864351b83025685f0840a059bf540307", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a533d881cf96c83cf1366ff12818261d28c10985888f1ad123e7fa4cff45748f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "a5cbb1faa65964e97829e3659c4e07dc9199c60f2db344ddaa3c6342ef7617a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "ae548884ca84fa0231a79523381f87e19bdc25d79b93dfa0a466f00825c2fe0c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "d887ecace2ada9ee6991cfa7d9cdfe29fb71180f8b2f271481ddfd0e55bb019b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "ed6468b1148cf167f255345ec9ecfd8f4f390e63441c09903884ae4ab1cb48d9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "edf7dc3432c1b8258577a919e77dd3a90fdb13af0de5ce51a9d2a5000bebb269", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gdfn9dhnsw06xsyxr2p7k0fnk8qs0c3cgk6h3q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1439ea04b65cfbe491791aeb28f54910837bd27947006ae32da6c974d655b6bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gdfn9dhnsw06xsyxr2p7k0fnk8qs0c3cgk6h3q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "422ad1e0db3e39a472e2414304b82f43ef8d0c1dc95c1b01b179ff15e509bd0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gdfn9dhnsw06xsyxr2p7k0fnk8qs0c3cgk6h3q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "55f9da5e08ec39174a50be9907dd08c726043e154995303c0f8648d72592117d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gdpw7dgw8v78mlkutqwefsnyfjun89d5gxn02d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a2a0a6806a6e48ba4b481a880e3086fd0b5245c06ecd10769519bb4aead4338c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gfagajzkac06l9qzkeu76qx3y87at740czvjhd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "67e8b2e9f77ec27a1fddc1a23b3c643594e468cf270a68e7990828a752a8c404", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gfutwat9vt0cynepm0huus6vujysa8e07uz892", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8dd6e5354ee5d4e8a8382380671cac06a54dbf43070874076d96384cc295aeea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gh4ztnlulcfytlu9uv33a3vpkga2lrqe2ztv7w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "04d488565851d6fc0ac00aa7cdee8f140bf55d5aa6071e2cb085a8104f4ff1fc9d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ghu8p243thvw49e2m37ydmhl09ur3lmexj8uwv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27e4ee8c37720d35f9e4bfecfa3793b03cb26c1a240ad56ba11b0e1c8abcdc66", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gk8jn6n0u46zd943fpcu0uan2tfrr7uvxpru5e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4216383a16722efb48398753e511a59ef15a7bba24b99cd328af984050024f16", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gk8jn6n0u46zd943fpcu0uan2tfrr7uvxpru5e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94d94b276ca3aec03d598253fe8bf73940ee93d620cac3ee1d1db6f1e7fe23f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gk8jn6n0u46zd943fpcu0uan2tfrr7uvxpru5e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ea9ac31e592376ef1db6b7c22e775b6c325888686fe68d43223a4dcdbc1c158b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0854bc74f0d04b7fce2c50ae84e12672bce52a5ef0ae76a3c1e18c62fe0defd7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3d04e7ee8ef14d9a7a1e8b8d392c46ff264b0704099f590ec6474561a70cfaf0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cbb22547c766850da6421e079a55ade908342e6c6b2723961fb6e10245a26da0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1glfhct4xs07ajcmsljfmzvdp5vl7aq57lm4xh4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4b6fa77e5b96ce567455beab0658cdd91a469f441bcfa1a2cd85dcd6c2281ac0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1glhkmm6p68ep8reqj5z2jaslkku8t7zfqhjhnc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "37a96d6c77ab3e33354e3a4d13bafd1a637d69379c9ba1927c50caadb69114a6b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1glht5psdxacnvdl04g4unm0hkjwfqdx4nnczqr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e802ec0c237432a4bc00c25a1ba9cb648e115a5ed358e26df549e7aca5fd3c051e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gm0lwz34mgf3vgc24kzduea98fng3793zvjwm5", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "620b0df2cf686c60ba70a3ca302626000ce0d6b79b34d1f233ae291bcbf9a302", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gm0lwz34mgf3vgc24kzduea98fng3793zvjwm5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c988dddf95c2684b2be9ef5846bb8270d128e553e6a414d935ac6c3e324e13dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gm6yczatz04qf0hacryq6w2qzlsrs2ereqpftr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b32e720cce1639dc10f648ad1fcf9ae136642fd1b56d21a60749a01b4db79b31c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gn2p0dymxeuganqd3msfx6ggk5qtdjf3uu08qr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63f29702ce951d9887d138e97d7e54c7beca0332e2ceb47445abc293122f2c81", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gqfet5flp7lwjwmleca8khr6g9rtetm2r8krm3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "235a2dbac6ac347324287cfa410289a7e1fb8eee86b9091cdeae7cb83251cf2194", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1graql9c857sj0xg7gw260c440n0t4qfjvyndy2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d59361234cfb9c55b92ed0370b6accb377e9b3951ac0e46025e05bfab1dd53f3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1grp743gsjkgc283ch9c6s2qr2kevv3k79t3eu7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c6ea237c2e23cc64ddd774d0ac987242bc9dfe0803e0b030862c90c418cd800a8f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b5e6a7cd372e1b930d813948cddc8363a15806b4705269eb30f25d770f695fe2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ee2a5f0cab03a00c2d61fadad1b2b574b4ae88bbefd3cca0eab534bce9e160e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1979eb7cb8a993f481c7ae998e5b9b4712d4259dc9c675195a43764935212960", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "43c4d7ff80a8751364d77da4ee40dffd04df828a5e891c5adb42bfecd4bb95e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a17895bb042d31dc3f17e54be2835edfc40bc9afe414a3d2d01934c0c96f3b95", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f36f36fdadb307f265a582e94dcf9fc617ab07c120331d4df668c9432c8cb1d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f54acf6839eb4de745ec725d5dd5ad37f14d9bd3f0299f024963fea5e94235fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gtlr2za505w8rl3sc8ywfwj9qekkxzaw826ntg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "04eefe2b07f443693fdf33654478b5b7b118ca5d5c20c46668f442ddefa016f9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gtlr2za505w8rl3sc8ywfwj9qekkxzaw826ntg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "424bbc759b43c64e16387f517490a2532af66e010b9d4048b709f3f7979d9460", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gtlr2za505w8rl3sc8ywfwj9qekkxzaw826ntg", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "77248573636aed26e5accfcb0d41d7705a3261f3a178a363ed232eef269830c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gtlr2za505w8rl3sc8ywfwj9qekkxzaw826ntg", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "ab6846afc8ada0e083ad786baf5be26d7ad704d4fc0da947f9589bdf039dce2b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gumvhljecrgdl6vqz8d5w3wzskafjy7qx7n5ht", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "a91edb700a0ef4629ebfbab3002edb73b4821f4f8f28a3e426a0bc1c4b271c8a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gumvhljecrgdl6vqz8d5w3wzskafjy7qx7n5ht", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e81834af4e21218cf1d6f6a8ee695ab0c65b02f97fa9bfd2852da801534d204f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gwcwy2xgulqzr5xt0a82gzzk35mn2e8y5tjvmn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b9c9c44b54d6a4ff3fd37b59c62ed5e8ccab1d6543dd3bef50e2062676ec6e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gwcwy2xgulqzr5xt0a82gzzk35mn2e8y5tjvmn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c4b15e5ac2c17e9770ae0cdce010d5f8026c68b7f518b918a2c4822559af699e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gwwzgsyesqmt3z0y0aa0n4z0d54c3mtghs3hy8", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "538cfc91322b345711a1d02faf087e6f387bc34b49f2c7abffea0fb89a92964a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gx5j06u9zqczetkae0eh8j4x549fr9crcwg9dg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c90d653b93b813aed2afd5e82be0e09c6c5db5b623d2ccc428d7f851ff68e4e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "11e2fac03cbdd78457512f71798e17431e3942293e7bceb5cfe9f80999655cef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "17dec4c843c779ea79f134de0b3a45c2e54617f02018eeade4a7b114e2d7b2df", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "232fea7cab2f273964e3d12c3345660e7e1c6b305773f215153caee174de64d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "233a3a534701d26b4bccea71aa2acca92340e0e6d96ed4011051a4cd135674b4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "27a01a6932ba75ed29bd9704d8eaaf6b469a1dc33116dbb40369d72ac06c8530", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "76521db97466a9aaef870917443bc87ef94c9098fed844c6b0de6bcf96d4d480", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "7c0455c91a25d679d4c946961e9ae41c14a5e5d91084e4428f98681381033e7c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a3fbacbb0c8a639c5172e60d2049275f05999dd77c5c830e57664fa6c63943f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bbc9497f3d8f70468d5493514ee23035496b3ea142227bb94701fbf83ab88f7c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "f6da8201b33423601157d632008a3529298d79964fa6403121216664c268acd3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "16d77103c0a14ecf53fe5ff03be04e2649ee78772ed976a252351d500b578fa6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1943de2ca988c1d3c847e8ecff43fafd47b848a93d5e61deda1e79c46c10a849", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "22418c61bd5dffa8d34f934c889cc1cfdec90072fe6ff77bdb05dc9fc5ed802d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "425247888a99838c5663a793fa8040884490d88d3dbb049ab7d3063595a1a14d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "db0a8bdefcdf5f080015036d180dae51d756efe1008bd851d1617057300bc981", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gynugddmzln5yksjhf48d09698mgcjdl8jt6x2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b2baf4ea2367978d00d1c51fd2a285b5c27edd39fe47f6a60c598b3f8ccc74d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1gynugddmzln5yksjhf48d09698mgcjdl8jt6x2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d07a92782c872fb0151ea57109e1efc2f44accb73a8facd63f976aad5f3ae976", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h0cdz2q0fp8c5unsumv80ew84mw44k3htclxz3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "45b7002bd22607c3614bf0695264df72b999d0b2a2370fb880bc5346bb0211ae4b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h2g36smx7l24cphmc2dpu3edeqc4jwux2htp28", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "832ba0918039f3649feb25026d3e612c7e464200c1b2129893ab6bdf5a0fecd3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h2xeaqncks3uxcrs927awd5x7x53rj89l4wryv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7851e60836831f2f6e01d7d566907a09965e398e8ab7b3ac0218f288170c009103", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h3p0rwsgz9suru9lv0aveyzgcfnnglqeg7k6ag", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1fa3530b54233e1d35207bb255ab96637f17a7a1cad662f57a4a419714126cc570", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h3pl3lxqx7vv8ux6r4ddvyq9xpljfuvzt0gfx0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d04975ffcba05cd0f42b7f4ea985460cc17d1db4d68e4f850bd26fda0c55c924", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h42290afmvf5mhdy70hew8m3295qhdg2vw95eq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "53b9342630e571b04da395f6b2a12c8ec814ba46ca53d4f9131ebf9076513018", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h44ypkwa62fnkukjxqj9nzhk6m2p9mpzjn6t7w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9df78966eb66e17a46404615227cf2bf5597b8c0817b64b17a84a76d3b388f74", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h44ypkwa62fnkukjxqj9nzhk6m2p9mpzjn6t7w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b4087d549cbeaa71708809ca0ef87da5928af04ff3ca3a3ec7ccbd0c58bfbc93", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h452s6jlmmggxrmx8lc80xhykj4l2d4jqf3ka9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dd481f241af8bd653db4651e45de698b4268a8e855d12c1109b1c5ef1784cec9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h4gzceye6qz82q4dse0rzt23dtnew6nuu5l5jq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5d0fb24ea8d57ca94ff09453bb0e3df32225dc05f0ad0f1740e30e036a44cbf84b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h4m2mwdjlmjnuwalxj40ham7yfp5y4r0yhpcpd", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "2d84dccb87dffc55802cca915bcbdede2aefc09573740d3791381be0a5130a17", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h4m2mwdjlmjnuwalxj40ham7yfp5y4r0yhpcpd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aba2f264e67afa411e77e561db1df5ea6b95d554558b9f50e13c6dce4fec6be8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h5cu6yyd0pse6szd3vpjcmqmwdgzf8kf7mgksv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8e4a97cc8c56078319e799cb429aea2225f087bc437877f83abac78ce7f4e317aa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h6lzpt0rpgh2aae8sv7xmt664gwl89ap6ewhxu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "09411b813677b6d4a8b99bcae9f68ae280d141551846af98ba038a865f725ccd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h7j4cytmrqxvnhx8hnl0kx6tuwzqz73up2ld4v", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "70ceb9c8d66302bd645d2fb48c9b29c2adf2193e350c5b987f1797356f511713", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h88xf5kd40mffx7vnx3lzwqxc7xefecuvxsahz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6de598d4860f158685a68351891f728f4e4992d2b97127d8f7813f7618d7cedc42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h89u875swgudumyftaluttyh3c6a005a4r03l8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5b75a420380419589a88895238839c552c60cfd8e87ed1631b3d0cc7c78fbb1e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h89xskjzsqqsqdmywzxkdqp3gqjjjwzvh8y0mr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "711feaf00cb06da5d0ebce3c8b2adfec0e98f26f37fadc6ca26d2246c81f375bcc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1h9hxztp8khk5jyss0tg9zdsy8j2lsegmkf4cr0", + "issuer": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "proof": "7c49191a56eaaa8812a4942fc38a09d64e06ff817a26c8d085f7e3a6decdb235", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ha3xn2k4au75fx5zpf4j4rn5ljzt7wptz7f4e8", + "issuer": "shareledger1t6w63shshwhhgs4tn39evacahxjja9jck4lsmf", + "proof": "391caa766a7aed07d6c2b9630b6d707796044f1d5e0a4a78d98c4dd04f5314b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ha3xn2k4au75fx5zpf4j4rn5ljzt7wptz7f4e8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b3f68a9e1d754739d88ff1ac151f9cc3451e5b64fc00e0c376e84d1c86cef283", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hcmvhp0jrgh4yqj3ucwsu8ae5s0m2agsw3k9d6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9607105bca740e5d83649ef7ef8fde629e43aee68b1c0a1e77c379f4bc7aef07", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hcmvhp0jrgh4yqj3ucwsu8ae5s0m2agsw3k9d6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb57b106e7995d1836bcf3a65eee197e17c31581ed9b254c45ecbfe62b60e60f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hcmvhp0jrgh4yqj3ucwsu8ae5s0m2agsw3k9d6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d089cde15e0bdf87b4dcc9c4436f4f8c1e4b6de5906fc11870338fc7651b7efa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hcyj2z6ulcne9e9auddz3p8ptgg7qdz5kfkxlg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "18c59ea94086ad78ab2c2b0b8bac955144ea7683fab6b1871a89e7da128304e0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hd8nkskhn6kh5ellrjwed5q9qergry9h6pujqr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "06ff9bbdf09768590cea37927764c62c0d7dc2192ab36e5382c7e6dbb52c14a9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hd8nkskhn6kh5ellrjwed5q9qergry9h6pujqr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3babd07e99c9613fc848f65d7e2812acd4b47ce51356c970a635e1cc350d95f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hd8nkskhn6kh5ellrjwed5q9qergry9h6pujqr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "84605a1f56074f05e263fb41709bcd3e299f4eaabbeb0d33f7bdb2253b9c779d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hdw8cw253shp8rf4qa6s20jnt82lcknq5684fk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "44aee62cb2ecdf95643e16e4d191effc61d60ac190c204c768a75885dca36975", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1he95dga4ascs0n97zwq0dpq7de7h907p5sm7w2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c96a2c70cfa9bf008f560c332cfc15fdda17141f70b71cae686f38cc0b4d6132bc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hemwff2pxpj6q8xvcn4gn6m8v6ryxwnz45eave", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b357a7cea0259df605a9dcb7a1591a6c4f9e51fb35a9fe2a1c8432e848796e82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "2503c16db1f9ece06e55efb7861bfb94d4be6b9ad15135df03eee543183c7b48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "56de3cc6c21566a343f01fc95a5cdc9556f3033a59596b23b354cd2b79bd4099", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77bff5b347e08ac711499a87babf906964ceb2ba6e018d882a584894989a7085", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9af935b880c55ba870c6eeb3bcb2b118f56f8c8be8f67e61bbb230f0e438ed4a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b8c94ec99d25b44cd4502e33d59ffb5a2bb2f13b4ee9d8036243913218ab1c4c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "be44cab0d1d3bebcfc82857a3801a5097c07d471194cec51387ec23622139aec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hgxv2a4sqskmxu6ynh3prs6kynhzscly8nghxg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "46309517bcbeb0d4b65c7920df93e5c5512fee486df5cc50fe985d88ded6f919", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hhp3tm5cxhalqwtanh37v3dvyjmegwrer27a76", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6390608c01ae2ce2ac1f12aa834b8531d7371d642e1301ab9832e7e070587fdd5b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hjcp5u39mtx75m85slpk3rgplyt3wt5p5wl76c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ddba338198a3347f1879d332d4d483f29ed5003883a96453ff03fd1371ba0d89c8__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hjcp5u39mtx75m85slpk3rgplyt3wt5p5wl76c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e8f08f33085d6e91ed3865955d36910acc659289c45397d2ba937a02a3baf626ff__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hkvf0j6cqu4anec52et4rymys5yuf7lrlhznle", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "15ac88184294d4c3ecb81e62f3cc73c775dbbc211f232c5567a0daf53f762d75", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hkvqnzq5gghl4hzf09m797nk2gl9ft5ccl8h7k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "13244040d1e67b7d5b6bf1a1e81cc580ce30587d8f4e3c1b8cbfdd4add8c857f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hkvqnzq5gghl4hzf09m797nk2gl9ft5ccl8h7k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33ce3dff1386719d4d7fb3ae8f6bd7a88323d1fde4ec46e37fcad93ef285cf08", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3bbe5623f52e7fd6fab0f047c4ea7b5703062d557cc375fd73c6386555aa0eb7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0f620ed7ce4dc6ce74ffffeda9f980c64722061fdad44791a32a5d5d61fb830", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c087c068f4e38433876f7ebb526b9ae5a57b1e9fd64f498eae380903919fb917", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c55f38e16642d7868ddb1626a95d111d3d12d88a13711be2d24bde8242b6295a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d5cb331f58d3f65f5445441f50a9889d34e8e8df392429c250aec39829ef042c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "issuer": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "proof": "e5f5833646732d9bc43ff0ce8f6a36093fad466c824369f704df31f098c2d633", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hmh9y6echwdh9tn75yrheekfmzdh2vy4msdv0l", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "a242d09d79c531d1042cc46176854a4984151d5cd464662bd3e7b79c5d40fb8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hmpatlm9na5j6h3pxluv3ah4zd4fxhjpq9236u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9aba5ae84dd42847923e46da5f968465d52b34814bff0823456947cff7fb5d4f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hmpatlm9na5j6h3pxluv3ah4zd4fxhjpq9236u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ebab03fb0c6726b93f7ff5c5d4e12df0841e5a96c3c3ed57369411a28d222644", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hn6xepsvk4y3ajcwjljwzsjffgewy2p9amzm9z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1f39145b416705b01a7f962756b79039f03b72bfb3990992031b053cc4955735", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hnme7z4l9gkldvqqu4ntzn75rdz37w24azv94s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a945729078b8cb8883afbbd1dd1483b500dd9ea58b4c00842331d7d8827edf1d95", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hpsj0jezaf3j3cd0m8u6q2egusf2r9gqajv5sr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "de79ef50bc6ad58357824d14ac20c0bfd8e4a5ae9aaa3df89e525bddb39f663f60", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hq9hz2jqv0tf73lxkre867t8cn77t6h4wtvn52", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "efc7f809b780840d9b49c26fde33813393e555139a63cf9e3c37dd0261e1e5b1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hrfwm9qx0ga98xrjf6xenak8ey0jsam059ltyj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ae03f6dff5bfdc248a57cd925bf70f473365e81fc195d6146384de6871a8801", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hsj0688d7nsm6dnlcrtce8av277mdw5gcwcla2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2de7bb502e939fff15899fd239aec66e2a3fb474999d4779e5a137aeba81b897", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hspzxw3sam6hut0kn4fhkfn037te2c3hm2pdh5", + "issuer": "shareledger1y7a3knerah596djfa7m0jldv6k0nad5msrgk80", + "proof": "aa0055daa0670662f12703ac442932607847da4705c7c63687cb0cb5601c492a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "04b86491ee574e482e3d6ae6384930df903e8c5a4df3aeb40304760f9094c9a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "35d5a11899e05e849e2fc503d47692cb51be0749d16a12752f7f3a8f1be822b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "518f85cb75df6d78dda519bb1e47ea34bcd46795080f510845d2e40d4e8214a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5e8ef7145e6d0df8954943c132b63d0799eee6e8f511e8d5f0427bde50879e22", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8aab25d59713fbcdfcfb8d875860e41f85a3219386a6a56c1da471202e23a264", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0d9ff5282b5133c43bf3d72ea047799d65abe022ac5d4cc168aca3b2f9d095d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "b26aac7b60ef8f0b7ee6febfb63181c8e26191cb0df5abd9ade9b92c7737c009", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "bdfb6247c15210d06eb70b061aa97ca836d8a71d4dadf22839b0404cae4c7451", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hwqnl5l2gvel96cjwlccd9tqdle48mp5hffehp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "64b3e9534db0081badff8e35bb271d7e7139513706971a97a0a64573ff3abc89", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hwqnl5l2gvel96cjwlccd9tqdle48mp5hffehp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cf17f4a24a8718ca59f00961d509ff9f56c89ff86a44ba32c5ba7b64d673e1b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hwqnl5l2gvel96cjwlccd9tqdle48mp5hffehp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e2c6c074ad25483e4e72fbab83e2c9b3f5cf1f53492779e9b84e17fc4a31b45e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hx8lxgphyclaf885gxyuhvk56rjle3cyh0mv3h", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b9406b0a6c65d71984d82d1ebfec5c9f9adf51709765261e6abbc83be82e25f9cf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hx9pzwh77cw256xmn2tuhjzy8kppjf895c772c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "18c80f1f8745b92cb776ed77cb133b41373fe239b0b01909232dcdb6b6156495", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hx9pzwh77cw256xmn2tuhjzy8kppjf895c772c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "54e7a7347492c85d933c6f9f9f9a186308042cfdf9bc45ce893caa609dbb02ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hy4tlhzl9wcq2eyyu7z6nfwrd6wzrj8jlh689v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf277aa67a9038f400fb32d5b14ebc674fa9dc9d197bc71c29fba41588d154f9cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hy7mzlxj8y6p52zc2egsh38646g2p5cyevzaxk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9dd0ad7a6118b8026f369fbe12ee909dee9419bc3773d9323fd64ab5c88bda74", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hyauy9l5f5ekax5m6c5wts35skurywexg036z5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4ff3eeb0473016874ed170487b8b6a11e00881bc75c7c31b3821f6e9fd0d6b44f0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1hzqyf0n52z28a48ju0n0zxf84yf8ydu43c6czj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7275eaa363f65120f1657bdb7489ed23320ccc1454abc758dcfe0880014fcd2a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j049r07vnrydlsgv4f5lgv7ctg05cs0f2edsr7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b4895413652d2f14b9e7932f949fd20d6b50a3ae5ced6581ed0057b6ab15de48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j24quyytqvgs5zthcvx4chc582p5229uv06knv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4f4e94835812908a649c49333ef368c8c0268a04837725fc14fb999355f555d047", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j32eznvs2755dxut8vejpmnetdwyqzlg346hyk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63e32bc7238c1d08a7718564b59883c819406d375a8317a805ab910d528d074bac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j35u82clpsftpwkwx8skn9pm902n6fa29njs69", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b65cede04784abd2e8907dc9df80f32022f36b0a5b76da6636276bbfc417694c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j3jdray89zcng5ctnya7zwpcje0nsz530g4dtj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94ebc4f898678eb2a4c406ba69e93cac41065456c60bc008cfa36bd0b2845955ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j46u7h89jw75gzcvht5ltca3hupspfj95tz3w0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "add9d83623c6cdf029f3fccc4ae7bfbc3c3e14ac3e85487710b3b30ec08eef3f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j4ny6tqhnr69fwmjauk44majtc5r5nuvqu9ju9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7bb5636849a101de08e5b279c483bc9ec66719b4a59c00b25a969fb7457056abef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "149bb2e80ce7241fb988b866a64f65ad3cbe65c2e374f1e04fd7a5563c85e055", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6f445bfdc1963408c023810cbf203bce788d9292c5f0a66793ad98dfa5fa40ab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b9bcdc5172cccbf242f9346e49f8a525b830594fdd3a2d44114259abd8df8c36", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "issuer": "shareledger14lu2t8vqu2kgy9grvg44az4hekz3339s6xdzmr", + "proof": "c55f4a6d3b420d36d38fc698e7611d1b685767e93963e8e776e9f1c2dc5d1f09", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d8c331a57363d4a7a7a3d0f005da0eab245babe88aa977f39bfbd5fa6a38d457", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j7eh95a4n6pln9yph8r3vnj3ejtxm5eyzusckn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "46a625bc8ab497f8a6d057b9ea87562622281d6def8738cd27f4be90aa5c70e6c3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j83t0wy507q4gyg92z8pt594dp9jp75q8kk2na", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e2eec709f229e9e78c8f2d3e443cfafa68b8759deb53dfd468992278b900c4150d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j8d80c8tnypyzwhd9y34hx48svn7dlw0ek64c9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3ff9afbf5f2f15ebfab278011d87ea48b1cb786f04f0f8aca1381fd501c6852930", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j92ex0xwc52j7j5x5jglqzgqqrxewkqe7647l7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e9820c42afecf6278b9b41040fadca95ab8bef4f46c72f6d86aed599cb9b6a4f16", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "506ebe7664625dbb34c5b657784b091e8750dd8b04501fe8d093b17314e9aa10", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf0be31cd887fdb134fe531547f73df702464305e6fe1b1bc98f261c65daada2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1je6s207y386c8t65kkc4asmura76mgrn5ldkpl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c856b8e39e71ae1875da1714591a9b4fdffb09d31088fa0acd39ab5d55c438bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jfh9vfkmlk4wxr875z3yhsz0hyccqd9szmg6e0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "986d07011d5837ee84bdc7ea784cdbb877a972f0412cba38a39767dce8d00d3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jg4mzmxccmdaxk72kg7tme0zdvhngqqglvzjd6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8d4fbf4cb46aeeca5df041cec2a6c9a00c2dd90947a0504ebb320c13cec238a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jg9fqgt25flg0llevupwqvgwq2rthua6ml0hst", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "11c26976db544da66808b8c3a713c3ae2f63b53efe4b41fd9f0fad501ae06443", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jh3fxpg42yfkchlwpuxhndfeftqrtd6xtx4eds", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ad5c039dd8fd7c36d89374a3a06cd672645547e4b2a9ea0209f8af3b8335802c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jh8648vxe5k2acc5nrz5earufmcaxksdk8a9hc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0777ac008e57f3e06e1ed5da9f62210527cc1aa8c1d570ee78ddc08af9cf488f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jh8648vxe5k2acc5nrz5earufmcaxksdk8a9hc", + "issuer": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "proof": "a70bbe449c19ff70d4bb6190768f41878fb20ddd156c3345d4cdc6b0acd09536", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "015b5332c57825c1eb85b05de90a837ebb63bc70ace5f5463243398e340efe99", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "38ea1fc9cc8efac80e3a5c7859bdb2672bed48c17b4fec727be04cdb3e39f73c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "41c9100a1cbb7f6e446dbf890e071bf9d09e4e7fa37410776eae7100e7056dfe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "57ff74d45535c18de691c732c1583123b312217473965b19d13f6b1e0319a063", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "66c4cf102e49744c3ea35e86983c28bae9ccdce6a7103523a2b70e1cce11befa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d202e4a58cf08918aac1c6a0eb0eb3dc95403b04200da707b21924583e6157d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jk7rpjxax9v9sv4zhnpy3cqm3qtn4yscmuy52j", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "02bbdd4a02b1f22d934fbdbdd916691fc5a303317b6b863216d547593dff4b8efb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jkpze4etxvh7c8k8m00elzc7nktwdrt3cdteq3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0421d2bc2810ea82feff1b57e1ef83548712eaf843755c1904fcd618bf9dacc8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jld6f8rwvxlzw8q36f3r9g77tg88uzv6q87f9p", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d8ae2c04547264959694d74898e0b8a13e513092ff32c3596a8c7ef391674a71", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jlf4ngcegmmjdqer6yd6xxa0l0z6mxstnry5nv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a61deb5101371c94363bdd5f453bf29f308d7f031720231bf7b500595e4eefbbe1__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jlf4ngcegmmjdqer6yd6xxa0l0z6mxstnry5nv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "daeb4d1a88461154af3c286cea06ee10ec9c4c87551c243af7f1ede13f058b0678__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jn9ccxlguaeaulpzjem5tsn4y9fyfcjjwu6evq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5e06ff06bed4be6d01683493751f522d226d4066bd66dedfa54be47fe87d098b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jn9ccxlguaeaulpzjem5tsn4y9fyfcjjwu6evq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ab88909e3ca9796d77228b2de014d919a55a0aa95f04e1f68b251d735175fbeb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jndvtupapy5mk8yj6sn5ap55xrj7wtd53v0vuf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e3afd180e2daa2fa0a2783f6b8c8dedd2c0ce57b7dc2eacd7b002af741e4e2e495", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jqjm8panlfm9k0vndkjqj4ljneltcpjxerthkh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b0b8bae1a87f365454117daa4f4f3625470d090379751d256eb226605dd1593", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jsqk9fwyv7q6ggrxvvfe85fd5l73ct92gvw45h", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "56fe6083c9406256bff484a9a8c804d81ad408abde64baa0ec22ab514b3161fe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jsqk9fwyv7q6ggrxvvfe85fd5l73ct92gvw45h", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9a85ce5a5d535fcad398440bb6dbc6d010e5ab593b46484fc47e93a643acf5f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jsqk9fwyv7q6ggrxvvfe85fd5l73ct92gvw45h", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b419f44fca3de2932df06ff5761ba76a099d9776256dc12be5a1e306fd89b5ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jtz2qklzehsdl96z6cc4xxx367g0lh38yh4e3q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8bceff981adc24c1246977999f12aa3d23e828195a9ae31bb39103f187acb452", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jw0n87mvvshs3s04gty3d2sg33c66k6xnv78v5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bea2bce5bb01ce3bf9a6649045174a22d8adcc20dc5515e1317940245ee02b4c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1jyywy7qa3lvm3lkw4vjtnje8d8sgdsly75804m", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bce69c27a1fcc31ba7fd6539894cd003c8caf4f2237b8f2e28ec092646cde9477f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k0me8v64k74mns42hl8jncfn58g6uectd8hm32", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fee141d1c580dc0e40ff0f439ac9d14581e1d7cb01f6d3cb1c48c6adb860ad4125", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k369l3d0ncpgfxt0cwdf8p9lu5jt7u4k4mp9rv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6f42400dded95b1653249b451a1fd644a290974b6201f0e623828ce0fa628fec13", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "159bd462ca99cb41590623921d979e42ff8026834d56d01535982b40f24e549c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6bd7cb18e4b8098657cf1a61ee44892801f4c24971cc19e216fbefaa2100b5fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c6d0b1e4af188edbcc352c7a52c64318ebb034b2697fff7ec7d0e7fb4b6479a9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k5duk457jzqrftl98pjfhfqg99wtdvq7s02k7r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fe6b9300e81ae8c3860a880c737d5d0167237aa9d52008c2b14b60b0f823ab14", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k5e29cdv8v0cnc90hs4x4uwpfwjgpqdgcf94ae", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "783698817fa92d5cf4fe14f1257842f27c17d64645114387d55f9ec9368df3acf1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k67rv96hmkns94z8t2v6ycjw5eqrcdzglrelmm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3db17ce9e6a8149aa775a896da1761a2d7dc99c5a01453db2f38d59dadbbffcbb2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "049b3dd2de58639c823f14e66290aca639368e58c462881752552f1359dcb8fa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "15f28e7e191c774399847bd7fb794ef3c78121eef218a13db9da25dbb88a8fe3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c1df90af543a89b63fe30dd565dd3a75d4e0c6e73528598c6e722283de163783", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k6ujmay8dtu7luvfstnqx0f5pk54efy3tgywdd", + "issuer": "shareledger1xw6yscwhhtrn5yj5h5g3fe9yd62xgw5m3lj5pu", + "proof": "d593589b1822df784e5aaadcabd3e850cee8f4cc7b1eeb60c261e9e7f40a6171", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k88ysfs40qwtlg5a9hsdw0gpu6vfu8rdac8tqx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "55876dae9af7c945237f6d1e7286d654c4447a0428fc6441c95f9b126ff4fa929b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k8qlsycyf9wcdten7l85nhd0px6whr297v4m57", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5cd07a14f99534b8d269cc550a43a13040aa3c1feebefbdc386e9d76cf0d245292", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k8u5g6xsc96kauenn2gdacrcsdgy9x6sklmjej", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d91250937e60b67c6124a00b3eef6b31b11a4fde409875c54eee39470ec490b1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k93kpvs7jhv433g62htax0xdsc8jq848zww4l8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1453b6baa9bdaacfe80b3e1cb254c02313109b4090e24026c0363ec9510c7cfd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1k9fgwx5z3s62cykh0v6c9kddtzuz089uh94w2t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e3b67cee13b0cd0c5786111819245f2c8986e1cf028f69f796848ac25467fb9ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kahhs8clt5j8szpywgpkswnjal0fvgcd2frs37", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1d551262054f64df0fc86c98a93c745f12f483bd0f9dd40bbe8c58caff6dcdd0b1__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kahhs8clt5j8szpywgpkswnjal0fvgcd2frs37", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b09b418de0f2de44868b47e6c354abd79d96be4669cc1b35f8a4ee7df9eb57960__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kahhs8clt5j8szpywgpkswnjal0fvgcd2frs37", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33d33c0ce0a4c57a79ca961f92b8141b99c5446b156236a18b273f2d43ecf649ea__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "012047e2a16a68e5128017784b20f89ab5d61aab1619f7ce59c0c500ebbcf56a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "36a1120fe02aa45785a74e590cb8cecc149443eaf64c21aa7d662fcca7386d82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "604a1e9301a157127cd8501abf80ad3704e3fbf97cc8959f7c1a6cf55295e80c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7bfaa3963fb13c28d0600bc7f310dc02751571098cf6018aa63f7dee19c2b51c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "a1402824de315837c2068d23429ccf7e8d348e1c16e01e6ea04af6a0733b6b10", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "eb1a99d3d5b2d3862043ddd24df428b4b30fefb568fc3dd0524e96393b6c04d4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "fc62a8154137c82c2e8232713594909f5334a66149495600fe3cca7afb896122", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kd4yqtmykkl4ce6vfy57fslhd0qm7vd8s2jf27", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5eaafd7b56a5e06887eec29ba3f9aa1f179d96fef93c12430471761cd8698203", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kd4yqtmykkl4ce6vfy57fslhd0qm7vd8s2jf27", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bc0bd9a4941fe4585d50db3a1b6c37d57c806cd141046e469af9fa47e3aad411", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kelj4e9dwlwflhn97hmytffk6juu5gf0gwrrfw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2ca9a6d3cc8b03c33ffce5bc28668b4a390d9a845f56e16e16401c1b6398d4faf1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ket6385r7eqdqvsd33q86hzta2qer7rj8s6key", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "feac5dab2c84c923bb8d332ed2593f875c955c415c56933345521f3060c28e5f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "64f806da039371ea039f95a4adf2d323a45dc5eeb0ad8be9f5fbe6ce62666269", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "6d0c89ea411be027efd71dab2e7f47797ab79126cfa2ec2e4bad6a0b35a81dac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "a8976fe63b3fabc59749170d5e4aa7ffc66abc85b19a94f5ab8f602376ab783b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "b96bf4a3af413b209d15fb5e1e569faa57da794c482144518cf83b980ebab2f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "d9fd40b23588759e47487e4f8099cb6592eed27d1fe663dd2e22599d2ecdda47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "db8edb58c51fb64f4bd3d4f9f0e582523c19ad3bfcd86e3d218d60cb860e6e53", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "e10d7944962ab27cab8f4d7177049d4fad6ddaa8346062a0e78d6a19848353a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "e4da327089c19c459a9c7d3546d6398a91b32e0e7395a3626168a73b2bf3e913", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e51a3861365eb1d02328688fd1f2ba0f1b242f0b427c144b847d3bf042ae1aa4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f26dca90abb3f5ce8582e05e1c6588b62a62f9e30548b2bcaa172b99e2a08631", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "fc19b189a8d8336f8666644cbb1de8522bfd0e3bb5b7da8a841bde1add9ea1bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "fe82d4156c27b53c2945260711f67767e79d033410ed5ab57d30cf589c86ac9e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kl325943dmtwud3vfu4f24dzx6atts66ng4lfj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e3137944bdfae8e102100eb4319f2707967bde9baee52b5a0f601580e5b3de68", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0f360d576167ad09990041fd75d8b18d6ea61cdb9b6a2e30e8a52c68033e82d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "18167595798a8a4a8513d8330f8648d211847f8e4215e6607165696eeb1f6e83", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "19ac32d6eb1f31bc545dbcf476b5de74bd2ddbe5ab47b0fcd7447b41b2a65080", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1b49a40f757ae9b72f6c8c74d668bd289b190b34550f02e2db0259f5276b72f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c00f8af134bfadaabd30cd6867ce476aab702f5f822f65ffda64632117374685", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kly4hdknr0am6cznh476ut80va32trxqg6jeft", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "28194a2fe47f5b36bcb252d4bdf82093abd4930c983c81afd76825c5d46ca3ceb4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kmcwljqthxypzy7jx69yr56gq0a9p7vdxu6xvf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cd99aff0389d05d5c5b02003cb3a6f2865853b8437447b33e3fea83d6b87114f09", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kmzfhk9uvuvttswzuf6nh864udrfrhadny34lw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "53d488812c15f779cc1fc368b1313740696a8819a00847617613a51b615936ef58", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1knqh6v2pfwdur4087xhwfsta5d0u4lmg8ms7x2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9c9b79d128589318b28f4a7f93afbcf225ba85b09fb977f5a13814255bfa4d29", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1knqh6v2pfwdur4087xhwfsta5d0u4lmg8ms7x2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e16f8072f523912a6ad447527e1735af128c772a4fcdae63e874fe4f6b5f2fbb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kqdld07e96a40f4e53zpjygwsfz26xae8c7kex", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf1d0aaabbb27e0581fa06cc73b08d7630b427d0c8606456e811e0e0b568f07998__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kqdld07e96a40f4e53zpjygwsfz26xae8c7kex", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c20ef50596664c89c0c2bd46af45a149b4ad64edd3f94af1cd7b82f8e65cb7822b__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kruxqlecmllfym9f47cfn0dk7jyxgrclffzg34", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "0920e51aa701bbeb29bb24c94bb88e693c51d7f683398994fef6bacf82d07d6e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kruxqlecmllfym9f47cfn0dk7jyxgrclffzg34", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "50c40b1b55e76acc3956652dad05d660119b212fa817c575dd5b0ad9b94b40ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kruxqlecmllfym9f47cfn0dk7jyxgrclffzg34", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "f0618a675a506e9c4c143fa9cc06dbcca28b4dae6a59e312592859cbd3a92d6d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1krzg490cxflsu89phcqz5dvh78sjnrlduhsrtl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0c3d9f34275515f6ed4af5737badaf01d3ba385e703cac183e049ab1170c455e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1krzg490cxflsu89phcqz5dvh78sjnrlduhsrtl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "26f24204dbdd1c9d48c1dd68f395c5b6bc0366d6fd88c4c0582f0d6cbf484d79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1krzg490cxflsu89phcqz5dvh78sjnrlduhsrtl", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "77dcb923bab80f54e4230d0f8ce086afe4417311406a3eeaf0f1a7c2df074784", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kum3qqy8f4nx8mgyt45tsmu7c28we2grkdevkr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1d4853eaaa718e421311b3bada162695312550307881cf5fd6533902a6ef8294", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kum3qqy8f4nx8mgyt45tsmu7c28we2grkdevkr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "52165fdf38fec44a59dc793483d491ec1baa358a8c375ef6ebc0c5e1a98ddc38", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kusxd85wppp7sc6t00r43h4gs9aa6rjj3ftr2n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a031417989746c0d59c044333d4697a9d58a2116ddaf43db94f6dfa66508f6f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kuylm43gjc5d9vyrqhhx2ug8cvulh2smxxxm2j", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fa312d1adf67ad4004c56820d8ca0e00b72245967d98539ed01e27b81948e1a17e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kuylw2fzmmwardk5y95qr0m3vda8nhresce2pp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "54f2d853dad7487bbff7143d650bb3ded58e1586c96d0217a74fcec92a549fce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kvd9lesm8nkkvxf4lugnlrs28zc0qxv4je6y5f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a48546521c93689db3307fd41c390bfb6dc6f83803d01a0a6ad5a68df2a9320e9b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kwfdff5a0jhjfp7nfd03u6zlvcy4a7ktv0kqd9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0311859cb8d1f7a0b4ab79f722426b4c87868e85f35bd5c3d91b768e7e160f2d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kwfdff5a0jhjfp7nfd03u6zlvcy4a7ktv0kqd9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b143670e8aa5c1cb4c485adfb1a79e3d4d729f0868bdef87214704f429842058", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kwgwyqm9cezvc6rulhvw94ftx6vsddpu6rty0g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "534227aa90ac50fab163aa999fbaf405a38d57e1b7dabef9b01c8566176ee04332", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kwm0h6y3qjydh6wkmz4cggnqs6kgj7gjj2j629", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2936d56488cc715b3dbe71e919e0883847cbae077dc9232cd018bc7395967601", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4310ac43f92f5a5a292716f29214260157b3c891165f5d12b5cd1b6f9e457750", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "4f697ddaea2285c8b6600cfa1e788d85940a03890f5522522ba9b13c6011b687", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "6cf274aed6e7e26ed65d9601cd92d743a3c34b06d6f9703d922eba8e72b113e1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a02a349a61f09fa71dc29efbc3433c92d22eb1c65c11ec631b3faef6e6ef5231", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b91cec112c55e655cf02592720f6c9caa669a2391a2ad862e76a314126ec7934", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c7b72c3718085a11a9c80d2869f88a09d39f01585ae7ad579c967db19dc65141", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "dd96860982186955f73f7fd15ece013858710673007ecf5df381ccc6306ae541", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "proof": "e1bb0a77c53adea9f28030b3a74821e3bc2deafc71c39146b51699eca650ca66", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f38a9ddfcd566555c87d380fc8acb5b78dd3eea0a7856a455f6f9a4967022a5f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "fd4b82f17ff154158d7c24cbd9946bd5380d21cf580ebf0c5e831ce59b42b095", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kyv9t00uuka730zqwsngz3f69pss3r5su7p6fm", + "issuer": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "proof": "7fe5fbb3b9944e3fa5929640f115273680d7e688b38e324fca717a046b277065", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kyv9t00uuka730zqwsngz3f69pss3r5su7p6fm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aeb7f7567b7a7cdf7c7d461ceeaf1bcb12094d0608611a0d0a104f36bb92073b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1kz35w2mhnevned566h0w4dyygdhllvyx5zrjp7", + "issuer": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "proof": "b546f1f7774f3fd8d419c85a6d6521e7b2a3e5f2d5238d28ba8fec99c2bae62e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l025mxa89qtj3a77frwqkwkx9fjlgr6pkv5xyc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "95543a7e7a7dd4c9c2d7e19f5ce590736a42dcaac200f7878b6fd24361fbb1d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l025mxa89qtj3a77frwqkwkx9fjlgr6pkv5xyc", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "e66a67c26701a258019facc493fdc1857395e762240eb9f71d2eaa20d955d6b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l0mtd9n9rsq0yc9850eqdemdlpq94z73pkzf7u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9fe7526f3917344794961e2bbc83b2045ddb3eba9eb9335f1c72ef6b0474e141", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l0u5gx6456x6yehrqljmxskjjgynlk6w67hw23", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cf71ac13a75b4d874c978b551224ff7c1c88fee970666f7ee5aa3c7368245ea87e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l2pnttwrv8yt5hd44qnhvpxmvv7rh6pkqd4hp5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1ddd7b3721c75ca80b93aca9118274236508b8d1c4e163f726e7670152666d46", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l2pnttwrv8yt5hd44qnhvpxmvv7rh6pkqd4hp5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb1cd93621fa9b7378c20873709de9febf4170c3d0d26fbf25755c5c1342c91e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l2r2y4tuwjvu29zf9yhx86fzauecsekyprqsse", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ddb4fbe17cb26c198e015dd6a7266b3973f1b0dbf7ff11331f6f74cdb9c7887620", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l4m3w2qruq67scu0y3aqyjx2pq4zy7geyjs654", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fcadb18f33bfbca1e8cef93fae1da63b1a9156c349c66a46e2162f75ea8e6d55", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l4n8m6ajpk4vp0np53jzhsjxnpyywm9z6q0pqq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b7769fca074f6e853da2ccfa8c12cc742244eb2cb1b92cc7b9ca07413e1a1d9c62", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l5jr2hl5yt74y0klwl87g29gghqwyp8sjuxlql", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6078ab588db9ee5410ad5e12c320208669d9562d55aa16f6c00e45dfdfffa90258", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l5vcq2tzdzw78kuwdlze3xhwuecscqskagwm8g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3028af1a07f02fb1007b1725098975c00e3b8d2acd28666eafb7b688a51435df5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l67al5hkwxkt4fwh0krrkxqxxxxwvnqadng0k9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a3941b20f74d9692bd7452efa4bddae08cebda53943fd5eb27c7afe82b703f26d2__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l67al5hkwxkt4fwh0krrkxqxxxxwvnqadng0k9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b18be02017f353e19a58ea2a7498768b6e25e155195b72d7eeb2ba3848635cc350__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l7pn8yslht70aedlgtsnh5cx9a6c3zk2clhr7y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d4351f004a3cfe9c9fec3d96fe86c4f9fbef6b32c63028a7885dca3b167d27d5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "64558eac7e735c0ea0f475389bd09eacf0e33ead6f6dfaa5028a4538476bffa1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6e0fec7f8e5c3dc6cc65b388b4871fa4e5ad824306bd6caffc34a068328f082f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6e47e1c8f755f80445182932e10840557950c19928cacca7f12c539820c3659e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "76141faa7be66a7f3ffe62dd00de1f85603c41f5ce64875fd6d15b8ead9fac33", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8297dceab817251ce3ae40d7b01d210ef03ede59190872294e963ea393f22c6b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9fbc09b41dca0795071528c7e242c526fe45ceb373c9d331b2e860eee1cffa32", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba30b9d81f4fdabd45b2c10303c95e42f983d6d804fd16d10b0afa07cde20e54", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "eb4070921a97633a156e9e2fed3c34401b1b0777d30d1ad74c6a20d916c92ffb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eeac37ca7258aa974e21f58630e37463d524f6e908c64791ea3e321e66ecabfd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1l9mlwnlevz792vc8sf6td2004stpp5v0l0e93n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e3d1148959779ed2d486e6fb812dcfbfc03171addb6d07b536112ca19478920b51", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2de125243c35b9d01ad9947a5454621e1440a1f338ab3ca58fb723cfb034e53e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lc5tqqqygvttcgpn9ry2wjuntf7xddnuj2zf45", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c2e83520e80e495355b0c76d5190e031d13db648b1ee84b8b5a17301d47dff134a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lcd340z0kuqzzz8vfd0wpd90g42qmnlkuewypt", + "issuer": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "proof": "34b3f80108ed2c7c7685495ff6eb7cb731d8bc0785bda4eda3ca653d440e99be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lcd340z0kuqzzz8vfd0wpd90g42qmnlkuewypt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "54416f0be3e3b9a8f50ffe9478dac519354fa9f2cab7ff7b1c1352a94e180f4b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lcd340z0kuqzzz8vfd0wpd90g42qmnlkuewypt", + "issuer": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "proof": "56211835c4b6a60bd3c5a01c51b158b24cbc3eff52bb99fccc0133a1b63d018f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lcd340z0kuqzzz8vfd0wpd90g42qmnlkuewypt", + "issuer": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "proof": "abf33844fcfb16583ea92130ad2a26e845b9471d8a825063473aeaa701abde6c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lcr6n0n059q4et5q4t3wgu229w94utwmqzagr4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f5f5ac78e2f9e2978f897c0b9aa5cbab83f22d8081527beeb6ddcf14d536e9fa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lcssp9nw85xl49n9tgavgk3cf4ump7hsxchxuv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "08391c19fc58cd506e95c4c524b906caa49b56bfd52abdc9d28dd827c4a2ff718e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1legze0xkv764j0xr7hu9pv0n66y02702jmcyf8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "871abe64029fd1632d3d19de805c89ada51b5cca0507159e207f392531c77ac6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lf6xj94867vpvn0v20yavn55syphy73vfstn0q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb3464c47cf5fcf100388aa6411f17bd486763d59243e66fa81359b00b4cf07b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "09b1bfc3d609253fe8f1bad2a314a491b18ea9b9b7934786cf1576d4763b50d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "1d09ca9e83145e19368e9e67eb872b6eff026671b258a6f3fe13adb60229248d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "20c60d8e8b0b3948baff1abe1a5253a00d9c733f342dbf32a21abceb4ee171b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "283f6bab0604057c754b1a51bce3b41d26d3852e470ad534f7a3f6232c5df559", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "294bed77e154878d9e66b9bd430883422c8a2f3ac5b76e4261e5d2fd89e7cc0f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "proof": "55bd3bd219d25b3705366c586657946ce5a481c2def8e9527aaf64ef980f771b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "85675e0a73df8cc105d34d23e4bdcaf41c9e6c794ae6884248b9b23365d0a3f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "proof": "8d3a2f35ff139f7c0645e052f5ae3f011c369d1f71f6d1b6e560fed3af3f5390", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "99274d716ccb43de0cf98a62e3170c7549a4eb4a47f3b7ff3ebd93b5f55d39bf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "a4fd8492693c25c94e1c54d418c3f6b402c279068ec104931785de4fb1466a19", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "b85d8b56e0a2570ce04245fd3aaa238f40309d9c722d21694c3b494e21e21706", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "be3d962a034467bd3d0aba0d3f1ae64bd1cb59234fa1e3dbb24868757973ca07", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "c1353711c697be544fa3c225ee7b521106d483ab97a9257ad271b2574c5e16c6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "ea1ea1bca7a04dc3a3eb44300537790ab60569a898db58cd26961b7cbd9ea497", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "proof": "ec615fc8a6966299ec1ef9ca9e6a814db181054a2e323cbdee167d7c3f7039d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "issuer": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "proof": "ee9b2edca8b3afbc5da42fb0c6371c06238a7390a9ff6785cb996e46ca2483c4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lgd98sqn0vxz0t7vkzz38g3lkggnmdpl0lkwea", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bd0201088cc4b08b048bdc798cfe490394811a35c8e17d4e0d1c46ceaa62d2d27e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lgf2f62wpwrc5a7wuauemmx6398kgqc3xq6ddl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f524a5973cc1b4d20e07b59e15496bb2c10d5364a13e917536b533db173bfda631", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ljrelfvtyvpn2zmqlw2z6fmhhspd7gjs47wsrz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ddb3cd1208aa50fd34faca84a6093edd996ecce2c1ec64a256b8aaa97f3b685c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1e65e1b1af0a739b2b32b0491cac28d45445c69f1eda480876e7b8311c9e4795", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "2a939fb106cce28db47647ef62015f9698024947cf8b6718bbb72dbc54f69a3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "55a27a0c150338daae206c20a5006e4917a077169baa47680f7d048a1bd9fd37", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5acd17ca1b25c6ac6bd9772decf699cfda8d786bdc71f713e14b06b242948a7d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5c438028d46f6d6f978438540d195a1372a5f671683fa8ddfb662f2487dc716a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ce5b11fc17785ef321ae6d0c7fb057acb6ee23fb45a16fdddd05169e338e4f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6f9df8d443656222c74831b6b20dd3ea9570f8915e0904500a0c63876d9e692a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7ab60922b101efa2bd2ae842ad717b8cf7094f5b8b8a77434f76dfa6109479f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8064e4f0dcf2c12d717a8f7aa49d6a4eb884810dcc77466483d727b76552920f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "80cf6a62c6eeabcf9f1bb44e96cf7dfedf50b2fefdd260121a37cf25896f2cd8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8faaea89414c92d0eb8b8aef7a7ee5a179cb053736be98ae75c132203cf74d87", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94bbe95723fa55e069103a43aa2a81a1e6b6363297f718c4eb997bdce446fe65", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "990686b09cda902d0bf5e678dade3b127f3befad93afadca120fe4110ad506e0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9a8c4dbd727267268bbf6f002163a5c16b63c48711a062d40b6465d3d24bc105", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a35710fd187d28d0ef2a95830a207bcc639fc65e2354045b30f7ff39d0daaf47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b402a86df92785815d4693efd118edfcd3b85ae4a58c8597d11d5ddea363f1dd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b79ad2f624956456b69e6096b2fa3de0080b6fe51baa79d67e16b43150468b67", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "baa87100a0722504db8ddc90dff4e6308400c7225ed321ca351e3ba2f42e71a4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bab6574732a5af8e2d130cdac490bbb2a68b74d929d38214b114e3a10ab790c7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cf01992755e804a62c83b1eb597a3044fc94cbf7557ed11f40a36976c0ce8748", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d0bd8b2bc7705853f9153d079a1952dbc4f0d4b6178968abf2f0014909fd964b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d3b84a575493bb2a7eda1c919b95db517334d2d5b20759f05e930b8541e33554", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d66e52254a59c359cfcc0207a8695a299feeb573660187b1c6381aa6063af4aa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d74059368aceea6b44440f8e235dd78cf08f6d6f51f6bcd096a5bc906cef9249", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e701e33112ceaf523d23e0eed9ee62bbf628df4a6f14805808e3d960c0aac12f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e81d77fe9e225e08e0ee328e1857690611659f1ee88daf76373cc427070fc35e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e82ac585b58c0958b65f3c90172c6c1201f3622bf92c0975f71367932580ce02", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eeb64836d6a08eaa7f952eec92dd8fb2ab3e2c086c151e1e1f0c7b4b3ddf75d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lle5hyt29yz5jr95naw2ganlklhnp8azu0x9w6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c9c2c29ffde48345bbfbfb84b394d09ca97ea1c49ee3d40f2251e75852d46698", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lmtqr3t29cpua2pn5cndpjn8zj3pcsy6n04f86", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0b2196b0b080493b33c6f2afd7f4a135ead021a978132b65d4b7df7573245738", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lmtqr3t29cpua2pn5cndpjn8zj3pcsy6n04f86", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5b696e9021ed3b162161c5667a3214783c342090de1a08de8f88969e86b9ac5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ln8zztanadaw0286q4kdzd4dvpcgjt5e3j96f0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b7f281c31e62dc15a32c1e9b8ef5f5d2c7bb9bb94f5f5c0c5c4e7628cac518bb89", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lp5j7c96cydqv4xyg6vsyglxad0kuxmsux5xdc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "75f63855add7d4d28f526674413dee6cee71af334635103641abccc8b2dcc5994a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lq2a70gffuc5e89rfyj8dwe4z44tp5f7eeynz9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e573f4f7989917e91dec3a9c25aa161ff8d8fd54a09a46faa462487b9ce47cd1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ltxqxcvmhhenherecpclxxa9kmjrcxln6k8ljp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "263ffcb33b6a3ad79aa0aa6eda386f5142591cd62de514dfcef4a2ed36cc54bbf7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lvd0jgc63hkpy64t6navhhtuulzkw6t5ze0p4e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e5013711a9f4bf581f9b8f2efd15069df708460aa05582633f2a36b5c07fc115f1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lvh2q3076926ynfjgm587kzgm2ujmhnnfydpt6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d3744032f9b0e3ac0646c8815422bcbc21ebb11231bf645fb1c4f509ac6c586c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lvqrk3f5g5k9qgcucd2cepu075sdu0v2ayykmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1e79d23fdffa3bded17ec89ba725ebed17144c11950f60eecdb2ba3b8f44da9b1a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lwy88a82r48ng9xcl4egv332vygr2ud3352324", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0fa48148fd44cc1a7fd1993e9dac32b9f6a014ffaf5719aafb032e4f5b8f9b54", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lwy88a82r48ng9xcl4egv332vygr2ud3352324", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fb7a6d69610ccee6d09ed9f0a96972654809b739f76da229af7b5bfe9ad79f5a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3df0ce90bd95923ab6ffec582de454b66c247abaa3831104c222804253b5f467", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "48440039a5ed188c7175f30b85110f80dae8dd65a74585a14416d814974a7927", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8137bfa32c0d52a0707962b02507b37864918022f789532980dc82788cc1c9dd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b39a478203e8306e0577fac05cc71b7c28524698f6b90782214ca2e69a2fd72", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "f32da9bedf765825e3b13925f262feeb2282dba7f372188d3ee338226ea773b1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "f5ba6266e00d5bd7871962446819ab749abca4c451f0932a2ca1814bbbc3e6a5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ly36znl080k99nu9fxr4e7e6quydacny8janhu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cc189265952e2144596b2fca251b7b0330c416e9393a72324dcfdac73174cf4a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lyakjyspua462llzpuh9npram5tdhwnse7plv3", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "test", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1lyakjyspua462llzpuh9npram5tdhwnse7plv3", + "issuer": "shareledger1jy4jl0j3v3w70pceunlghykj8jc470pufn7sem", + "proof": "test", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m20rggnhphm8rcg8r9g8ttzav9ea9la6psgrp3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a0686e1f843cc7a6a3dfc394ea04d58783ddecb92b9942e9a91e8320e0df495ad0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m3ffzh2vennqytvjyvpl3te5gwjksj4ujycv8q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1512c0913d66008be0671ffc155e722656952155e1781f9782581e8c70a79bd3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m3ffzh2vennqytvjyvpl3te5gwjksj4ujycv8q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "47fad7ccbefe110391e25e0cc0be82c265dee7a99c8d7639960c08cb83c7e44c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m3uuxcggc4rcqgwraa45l3amucnmle6jus746h", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4e9e683395973decd5f06f4d9156215dc6952fe8cc2095477df527035dfc7829", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m47hkfq3rc50autfc46z7rkzujq2pll0u5km6k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7025e65ea2cfa9043b99800dd768d6aea5d8eeafa149075b657656524e6c305c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m4fjdqne23muwz3ss9anj8vxj2px22rp2mtr2x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "747dccedfecae4365c3b23d8f356d29482251ed3a9187d0797216575afa5e835f0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m4fk2gxcuht44q6nqs9wwaaaudr74u8tluzxwe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "448e067dd6b561e4f556c7700832bc1f849ef0ea95ccbfd725617fbe8b9ddf4523", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m4mtg4r4y65jhv0f8m859stqsgrs9r766k6ups", + "issuer": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "proof": "proof-data", + "data": "payload-data", + "version": 0 + }, + { + "holder": "shareledger1m58s0flvwsavfcz7ewuljqak89renutk269rpz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da1548646c7f75f9277708d87469d67f8ec8104f494a90404d867c0b09175290d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m687vpmu8exp4das43pak6uzrewu0ppkyhl5wx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "913199d9bdccfce24702028f3e2a9ef54fcee869c6a52ef01eea6a6aad19adf8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m68qjzcu77d263gxv7eyd7dnz9fyndpxdhjay4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f5403425ad4a4f98ee9d2a08397c4dcbcf944b1ed40c3ee6d053f4de8755675e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m68qjzcu77d263gxv7eyd7dnz9fyndpxdhjay4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fef63c593a24d4f50fd3d5f94e91822ee9b3edd01b3a6499f5bdb04ce5795b60", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m6sddwhtcnlc3l0dk3yhdm8xmk9p3l065enmgj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63f21de33c6af88fa38887787f16aa99338a22e5362030fbe46344a2523ebf41", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m6sddwhtcnlc3l0dk3yhdm8xmk9p3l065enmgj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7d3b501f12769f366439816865acee0c1640173de4366d948e9c029efcb872d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m6sddwhtcnlc3l0dk3yhdm8xmk9p3l065enmgj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dbb0af555c1a0cef32f4f26b73d01c28bcf032e4ec3484dc760f2de2d17d0a64", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m6wp2l84kw9n3jcl45w3ajc8jdmrvlnnqfsz8j", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a05dc9b73dccb9f95df5f305a0534ab4a9df83525d106b1d5ab23e5c8957ecd6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m745kgsyrhe0xqsmrgajy0ujyr3gg8rg6s0qh9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5d0d3da439cea606ceb553836f3fb5613d79e83a7402c039b40f6574812808f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m76mm673g447nhfku0w0trez4g8hnzw6nr4u4f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c31ae1509bd308278f2d98076fec0ced096df38d66b1f2b5f534a184e2013719ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m784p0rqsdkqcuzaqwa9wk2gc5v74gk2s6gnal", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cbe3c8fc5d4eaef32d6915c41c407f3dd8640095a83cdc57f1e4e8c4bee956cb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m79j8p4grpd5770fx26y20qv998lrp298xkgtn", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "023a28f2dd3a91b0238171a46462efe435221462a7d7af7c13000e334f10a8be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m79j8p4grpd5770fx26y20qv998lrp298xkgtn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1a7a795d38a814edbae51f6abc78c6333c5e5ab0abff3f31f739be482470026a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m79j8p4grpd5770fx26y20qv998lrp298xkgtn", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "2ecd16232ae14e3f5485a3cccad65c056423b34c8b289e778f7404f79acfd06c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m7adr22paz0rmycjwjasmeyqaqel3spsqs70tl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b14f3a57f0bbf387833dfc16aa22fe7f70085d8cf5bb7fba1ffd8b69c91f49937", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m7qzhky3n9vwu5efdy2a9tu60fx9ds603qhm37", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f9d70cdc80dcce30f13c21568980eda6fc4cfa96e68523f775b9bb0d18fb65cbbf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1m8wjjyn6k4pgpy6vk94l64rdxf3rnddrj5nklp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a80437592b473324914f6cb995b531345855ef7af14efb98983b68fa1438437d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mcfgvghmekvh3e3dhkvygfhauly5yd5fsrfawy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "71c5722cb75397a82b6b1d1ebe6c7b8a3a3b68735dea593cad7e819412854f23", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mcfgvghmekvh3e3dhkvygfhauly5yd5fsrfawy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8fe21f79ad69b1f06fa401b9187f002045b33c28f58f8e26ec9c72cc44a4ca21", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mdrp0czr2wdmayf00rg565mtgqul7300cf0ll7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2a05c56150c8a4b0cfa665d7978744d0330452448a0b773c55edadc2f2424629", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1me8lytjruynrm0t4fqmcyyd74anj5a430kyp3r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "229394adb1bf56f297fac0482733f87499d68e805619495ca6cfb9eec78591d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1me8lytjruynrm0t4fqmcyyd74anj5a430kyp3r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "348a160643c7447982fc235a10435a0b00f562d0405b68a0ca7dfe4b9217d13b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1me8lytjruynrm0t4fqmcyyd74anj5a430kyp3r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "630e0ceb4ecaaf68c47278ba79bc1a5e6eaca7a963b6f2e045ca22fba9537ecf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1me8lytjruynrm0t4fqmcyyd74anj5a430kyp3r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6b42b3c0c6371f75de9a6c111a4488f97d89786b26ff528da623b855e818771b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mfeynlgs62dh856zdk82s9e8549kf7rqhhlm37", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b78bafb7826765dac1791226caa9d5abcfcd2b4352e893901d5dfd95684a48c493__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mfeynlgs62dh856zdk82s9e8549kf7rqhhlm37", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "db188f986a170200942bbe68edca0fe3aa10c1b9de1d57175d261ad43c5b04af46__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mh0cn2apfz444gkw03cjcjgfm7n8wu9mnydkw7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "50bd2ed512b3a1fe4305207a4e0768cd990f0c85db757259a862356903aa2ae9fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mhvp5epwgk2fdzpmpn6pkfcy66z4532ugr938u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "421aeffd9662a8db9d861a1c3f5dadbaac137019030ccfe9c9045179bb200672", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mj358d5q6s585ea54u87jkly4dp9c3f452d0fm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0df2673a4945067055c0ea790bd9eb330c0e8603be6ae2472f5d70a70b80d53b96", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5f0eb9fc9d6327f03453b85573e34145ed2a04bc03b484a9e9b561cc05f043d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "816de6188fd4502fdebcc01ae626fee8fb4a4aeaa3ef483e6df5f5b6a17f91b4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97766cd2b6b4f561a287dce12902a192acb26eaeea695941755b771636914cea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9945b9e5c1048d9e5a9954899b2d1d226774fbae3cded57cdf430ad4e116a7a1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cd2c5ee1e482210c1726ea711786b4db24969f5e7b19d8a7ac1610a5f720b2e6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mkp96pljc4yysnggecmgdtlv2l3u5w0nuvjwej", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9e0c90560baea370fb4e813a7e3eef041661a5b23307973404642828202a2e38d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mlpj7munraczqzqcpxhm87scv4drexnhvdeztr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8925ac21512123917d4c86ab8c5cbef5a98e780cbc860a3f76795305a82fde2cc6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mn5vp36p28pyl2d6sv2t8qlrpt8022f0gl8acx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27d80263b87a1d7ee0816192746663155e424fcfe2eab6f66f3957a70e6b18c5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mn5vp36p28pyl2d6sv2t8qlrpt8022f0gl8acx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5dbde885d11f4707a28c5c60688465e344d41ca0dba9b049ac508bef0184f648", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mn5vp36p28pyl2d6sv2t8qlrpt8022f0gl8acx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bb5b96986825fc0ad7ea50d520270f6185f62df6b7a36a79bf803d5caa90695f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mn5vp36p28pyl2d6sv2t8qlrpt8022f0gl8acx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d0837e661d6ff1f4c68584be725ed0a173246fb47ebf225e7e2d154e43b14e30", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mnpcwaj83sx2j3a0dn3jhw0e6czxxfyy2ys78f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "71f23b2786db9c36fe6692979aa562fdbcefd2c4e1d77e17e7446a7c90fb8fd2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mnrmrrtlm97xmk5xpl0ev8ked4mvakr3ncla5y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8d93587db00b6fc5be719c35c5a9435847358a5e1eca75f6b3095cbf9c98c89765", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mnzwsuqkn7fgtwav4c57t6x2xp6u90xtfesy62", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "60655d6a3de6708fcf809757b267b08db8324003aa760c6b98e08013bab76b3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mpmgpk8mwe3llng5v2j37r9wulx4x4r0mre2zq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "021fb489b3baf3d238170872082604938a0f7da1fe3688b1e13068d2b22b120b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mpznt8r7csgej7f2987c2wjxjqr3l2zf4tfxzs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "702bad8c49ebfa7ae5bc7103ae68532aa3fe11c351c82de5bea045ec2e986e0a84", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mq2z4k3n8k22t9lrlfzrqvans6qp7y62wfsg2k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d3cc41ee22e3450aa9b430b839ff6dde3d49928a14f7b0f71df41da1ac38b8a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mrzhzf0v9cz00rwgyxcdwrl6s7n7plgdur4z74", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2a60637c35db849b10c79696c1500d10a9e7de513253a7a8ab921e625a1c2039", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "135a1d4ae8be6d4cc08b57246cafca1c7d391cbead3f65a6127f1047ab14c174", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1fce2d84ee15a1b4da229647a0253f9188cca71b00783c0b043fd0638eda2656", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "79f544b861c6ed7f117c30ddebb9eedffdcb40b47a139665db6ad2a8c794cbec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "892d2282609c13efee3277bde4e5874e5af3b6c70521d42a01a28f6e9070bf12", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9ebd1670e64451aef5bd1f4a83a143ef3d47c723e67ff7ea17c4cf243b237779", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ms8x0xx6ggzx4tys5l0t6pqfg7ksasgjp4hnxq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "41bad369174e7ecd694b5265b2e2872a731315c16c387dfd3680a9dc384d1113", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mtne6hfpyfnkljs5qtws5g83qfds0fr4ats48c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "28fd6588865a15e8012a4dcd4d18bdd3f5c1d456a26349424a1cb9164a610bad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mu4s5vy7wnh7f7f8jzwz4emvz0sqgy6tsf9zjr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "253025eecd7282bba7bdc26bf6d3ac01d62e515d556c606eeeaa155495a7abc6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mu4s5vy7wnh7f7f8jzwz4emvz0sqgy6tsf9zjr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "91aa72d2671ec33f923f4ec40c7e04d319814f0c774a043e45d5c284cad931f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mxu02qcp30n3mftfce2e3vgpkzmzkc9aeucn9y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6e3fd50e1192c2fc2d61bccd0f603eb86f0f8b184c7339d35a03dd032c3b129bb0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mzsxz8qd38e8trxcxuck5xfldkv2ahnk9uw9xy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "217d9dcdc8d9616dc1394e1f7f8789a4def6c6d7e20f96625f019ea410a8f91b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mzsxz8qd38e8trxcxuck5xfldkv2ahnk9uw9xy", + "issuer": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "proof": "2ae3a71249f346f73648987da130f357197cc107ce84ffad6c3e87436b963da3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1mzsxz8qd38e8trxcxuck5xfldkv2ahnk9uw9xy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "78cc660b64a5efe210e371285601de5716d20577fddeb417c5816ec108b329f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n03aytwmermfljsp0g37kqha3w0w9ga4wsmptm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f6b373fddfd9223005b147402fe20249c25347f7e79932390d2153f39cc10d3f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n0amfc54q0vdfwzue3gyxlcveneguceu5hc77w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f36ba9d47d614dcec191ddb3cf8d235ee564547870f86843e1424d29eb2075d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n3ge7ckq8nzq0jk6j7tgayusg5aelrutr83f2y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "71b6b7ad5bc910f9694f56ec5df260c28d98933bcd84109e5dcffa9742b82969db", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n3jvwqpagenl36pzampulpfvtc0kts85u83hq5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6b91ea6f9095c68ef05c84259bb9825cb3dfe77d9c8c7589c269474b254e9f55", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n422k6rm0q4t0jg93pcs33q2u3mjxvqlj57q8d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6fa823c1bc71ba003afe75358aa2f15109310150d438a04b718f105769545c56", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f7e3f99cee4835045b170962b1b6cef624cf3601ab5bbf01f3a41832300cb5e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n73lm8gcgq2s98vpcr48kjaerh3hrgk6agmw3m", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "241b6610ef64a3b7649d223b9ea097c236c5081ba534ba03e3b47ffaa84540ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n73lm8gcgq2s98vpcr48kjaerh3hrgk6agmw3m", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6b4a0d352125e0ca4e49a3631d63aa5d718b3ec3acbcfb6cd500c9af5ab2c73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n7pmad708ayaem789zxz7j4vhzukqpfmyt2vl7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dfb99869b258cab342c021bc7d50ad319c646f4948836bb1d86f1fb2dcf11e29", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n80mzqcxter7yvdltzkjwwkmc4t9ppjzjcuye9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "efd21ce3a509b423f32dc14d6531216952e912fd146106ad13b96dcd62b951ccde", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1n90pkmj7htp7q04hyzqgjp7yh3sfplrk0jsnaq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "82fbb1cd999af38b4515f79afbfff30518fc16349c2512d6c8b774d700af1c23", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ncq3gc6fdcaj3k27v5v8kqjsqz9tyqqfp6ede6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c97b4fe584f6b2cd1315eedb4223e828f0e6f0f1152b4762f5ee9b63d090a817", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nd0hrs2g50je27jr4z269u6c8a73kmv7ylhn72", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e0f611e9dbb89a4489bb50f63231e3afe7c542f6fbd0beda368d286652ea1fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ndrxdpv24xukwz92rrey3dfvzf5ruxpdfct7s6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5674cac169fea05ae5bf38a8be52d24d24326ce0598a8b5c79ed362bdd61494dd7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ndtr4re05htpkmuvlamtdygvxtvjd59hrjly7v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "780eeed2f5a81638a0a1f160d98766031c3d1e495e46d607a5295f7d973205cae0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ne8uxjs55jzj8x075nq9gta66kserj9mqtzdfl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ae80e2cacdd9c99616408a66632d85dc7b88f5e7ce18e46a5745dfe2b72a6abb8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nejcdy3zhe78vhf5yzaer96s8jpjjhnxghuwmw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b2e42d64977d14db9bdcbe10d37011018cded1b8a40dd1bcfeb23d6fe77d1006", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nfmxf7qn8vz0gsw9q34f35tyhumrfcllwkz8j2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5132bd956b90e2c11abbcfe0f90b7735f918d38d3276415606b623d45de7d850", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nftmmftwzts7a5q4jqwl5x2ad9n6rtxs7ulke8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7331f0fd5b7c70480724384c72de0160e1a7c290f365577fdf1abdb1e63e0e2e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "08b857a4fca4d6e5362f8f76af8468f8039b982f01b7d76729072af29996934c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e4346f49d9cfd2bebd1c601076d7d304e555ff62fdf39441e8f421e36df05e0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "issuer": "shareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "proof": "38c66494019a16216038dc83e3ae59324efc509220cd43ffba9c2d4e1ea010eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "4a518e551064427882f16441924215fa6b65592c67d59d8f15a5f36924f71315", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "800cbfdd104c4b8012b5f6b92b311085c61dcdb1d4681fb16e085ae311ecad17", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c9822de21615ff4082f9feb96c7e0f0653cd9e89888a573e49d5a1c14e3542c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f5d5995f4fee276cb84088f0d0ac6e1b9df771286b4fe51ae61557d480af4421", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ngsmjza402wc9k2fdw28gfjkvwulcuu6kker79", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c0dfafb15b9eefb3d10053fa3778881e8aec5169c4367eed7d86a348f44fdd0a60", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nguxcj9pdprv2yal0j4yfhk8z7f40fe4ntkdyt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6e405232d6bb87f82f28c711036fe55d4277aae15fde9f6119d43ec3a43d9ecd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nhemsrd58yezmhn2y3q40tsalvzs9tc5epqcaq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fd4fdf4f76a7dd1f4410d33ebf4e858b038adc38e882dff285f6fcd8678d0270", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1njxa9vm2z8clhhv8qknky907k34mdzv06z23fl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "15077d046f6a553adcb0e59d323535e2c96606f093f7b49ae70ef46200df4c6194", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nkg0dfrvsm2w3nd8wrf3d5umsnexae0cyp33zg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ddc7b315da26fc6dc971ba4f6d121b995e5b69eb23d7b5120c28e738f951bfa8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nkrayqlaphxad4c8rs3a7e9h0kjywqrkvgkmek", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b791b796d18b1c8addf43ee10ec4f018fedb68a2b5b7e2f87f2d67d02b6e802e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nlmnlmh0lj4fywkgepxga5vck5a4hq5cu5jfn4", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627978384016", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nndpq4lv73gjjnzxadlxp56ggjgds2rkajsxu4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "782b959a6fea01e33f65a7aa829401b98103c4bfb98f61854eba9544781f1b0581", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nplvvcu9w5x9zj50yj3lp3c80mvqkpm0r9kjp5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3d023510d3a3a38fb0f9b4b14b2d62f4c2c53bc6db0bd5ffcda12cb6367151fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nr47asurn276egqeuaknagesr7e8ur3a9tzea7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba1477a98f43ce1415a7205eb8509881e9c0a2195ea42e71477fc611aa8691f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nry9gzmaqmryqtjrlalevx967eyng6y7kkevha", + "issuer": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "proof": "proof-data", + "data": "payload-data", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "21dd7944c133e6fcd300824130b5849ed2a818d2d653e3a14ada0712272fb2dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "30fa881aeca4c8fede98caa38f485eb14444cbefbe7221f06674acd60717cc70", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "3447adc41e34efe0f59695f357b9c6d5d1931fd94014844486306029f163e0ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "44ade4d9480cf4693243a0669b519c8271b3d3d60d6a51f9f328915a63d8ada0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "4c808df8227c0fe5d67d2352ccff659c6abf58af601e03b529bd0b2407fd2f04", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "74153234f5ab570eafacde92aaaba502a8d0232e7a354c2b6dabbfbe4658c83a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9aa53bcac5ae6b61b14139619816f106bdaaa9a06ad9f78313689a932073b4e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "9da7c744b950622b704c2b96f35a6a7b607cef04869a78ec0a8942512d5121ad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c4b1011b49b3d40bf0c658797a214c0e2b1f4c3de8dc22077ad343c1715dd315", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "cdd82df7c5f663f7fa5d9b995ebc846433bdb7a056bea4cfaa16211b6e1b325b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nty769f0ulywtyqs02rgc3pc88nkhxdmemd50a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1573ce930921ef87046edf3d96242ab51c09fad329b49d7d3a6454c7cd21dbd39d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nus2r7z5qj56u2lyg69fczsmmwg447u9rym392", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "021d13c0638733a6005210ed0e1128d9abbe7a346dca665a138a3998bf8778b613", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nuzask250g0t2a0yh6kcmx5cjvzrhc587gk4q3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "28dc20e9ee0b60537a4ea3d32f65f064d28d5452f00aa4f7c29b766cd0b6a6ebc6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nvm8ujz75pxwtml3wr73l3zhc6nxvzlvw82ufz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b30ab32853b67e503b0903d9ee572ccd9fd8c749a07b5805e4f1313783dcecf5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nvx4n625djwdmznrgv33nt2g3mugadw622kptt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e3e688ad2c68c9105a3bc55cc0f62e9abb9e9fa7772f5b036db75266f2bf1c46", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ny2s070zhrjxkuul7htr86clv94km06nccmkzg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9376b9311159ce627300c3daecc9d2bdce204fff7d1a5b53d962a3cdf92715f034", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ny2z2vjn6sk5czj6p7zsdq3u7vf0n25eqtv4pv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8db31a63e659c2ae26d7005bad1649556489c09013f2da2d0323d004b9265bbdc2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nys7v2dhp5xspvakyhuuesqtgdl6plw6dmndtt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d914aeb25767188758a684f911a4f207625d27addc5e6548a2f35121d4cce0a9dd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nyvuwwgpumqhm6pgy2ufya33zuy6g3yapqalrw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ddc54798b4ab49a446498c0b950ef71437d5915955025c1b70705e7b79dee0caf4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1nze9y6jgd8ngcdvz0rgeq0974ed43shvgg0cjg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4fe66dac5348e62c6db33666f9fe1877b6ab4c462444cd5894b9ba0fad779b87", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1533bf503d31d464324155feff61b889b7e8e3c59c4df09f4738876c1d2e5a35", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "23b9e1a3e8ea98f86aaf8aaa8f0b754ded42edea81933c1e040cd526f1b24412", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "5bc78fa4634a61e4ff91a5c815e351b3d134c131da1641a0585bf30b3343e420", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "7e0b919f9c8f30b27cdf071ae38a654601960ad6a7a022a66adc3e9712f266e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "e7a55258a97f92859386a864cc259f05f889ff2183b0b7eb516241bd7c8a8f2f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p0wk3ay9sc2lceh07jrcc93zdavmtx77sqj346", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "280070cf6c330f3cc211be8d7f23215fb89a49587eebd7ecba390f5848783ed1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p0wk3ay9sc2lceh07jrcc93zdavmtx77sqj346", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "be820d64b8b9bedaa03f44d62f01d88d37116c94bdf0498500c1d050aec133a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p4lqkrtu8uuqx8qydqfpttzcxc9xjsf6ey94f3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3884d36c5f6c180508cbbe2fea45e2307e786b1287669459f80d7251295f4507", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p689am0wz56etqukz98c8t58wraz5ug53tngh8", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "0ce58798d674fea2d086aaa5aa0e7e8791f365a2daa4b1a4fa4bcac6c3daf776", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p7l679g5xf2p65zacw4g5dkyc2heg05f5ur55t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c8fd2c18bd252ba9b487105b12f022bbd9636fab8ae172c82d1beca4428835ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p7umhuwtt2m9xanj698kvcey4a5j3yq9w5vxt3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1facc2a923b29f06ece2d41a4d0949ad7ccb2d31de8de09453ca3427724ce4dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p7umhuwtt2m9xanj698kvcey4a5j3yq9w5vxt3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e685528794536691b4bf229edab4880a542f94c8271c0cd88b10fae11e531f22", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8actw8de6nyhegkcymrmrrg0ypu6ylmummphg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "69cba74eecaf6ecb54121a1baf1d647ee79edd5e421ba31def70345e55545d2d98", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "041a9e89f335e7a6fcdc02e063c1af004ca96f4bfb2e2de5a73be2dab6b42243", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "047d3901db39874ccaf9cb18e759f7c36759fe064d4ac682118e862e92cabe9b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0950e2e9c73168437d3aaf15626d04a7cd172ac808e62af4e87f1f3e246c475a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0c391f7b89eac09e285eb623b0f89d671730a4de7ddb5ddcf554e11533602344", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d1428bd2159b1f125d077afebe9e8297cd35805d0ce33c40de230510e03f869", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "10900337786e7077add009617402ee34f3990a9ba659e0dcda93dd4a5613fc22", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "109ca431840b04a42258508369b28a7cb1cc97121494ee306b8e6a2ac44fb422", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "113da624afac9dfefe3e59118fbf5edbbb3f985e9ac68f03cafec5391cfe696b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "11a8eff5c8273720fc87d6b62792602bd0929d215668135d3e31ef2078e7f66a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "133e5a01eb3e6f1cc2dee864821527c4b8c12c1572eddc5e94fc51799f1abd7b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "1456852e1bd99e4fc9082f1ef61baf1ef2aaf27e319ea2b2def54a9cfba7783d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1a447eb0c2ea4e2dc4eebc2321d732ffffd66585ef8e93a682a39dd735be424b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1f075a6aed707c5d42d36e480d804993981609e8eede32e7125c9c11e601ebf7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "21c81c1e1f165875fdb1a0a6115633fae00a1984bdcae8fe4fae0979de9b8dd8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "22c97fe4c4e996a011a1c4e8abaa801a9014ea9749fe8f9f446707f92e996020", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2686803f420d5c5ed32e0e5f0cb67f98ba954780063cbeffa387cdea87ffad35", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "2a5b169d61c76ca88e33ad7207f0e85703b100c853dc3549be5319ab8fe4eb49", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "2ebd8f414a19f352c84dc10501a04ced754cc90f38481b3036c23c3fe01b6563", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2faa810e263d34be5f3f2ced4bf9afc61f85fb6a195a4c93edef3afdfe33b772", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "307b8ba30bc21bd223c9859132d9477eaa5bc9e5593a6de480797d9ca0addef0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33facf2445100fb4ab224156b7a13c7217ff01e1f9b2b9e4d62188a0c2f48845", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "340b870bc8ef69c689b3ac1e675c5cf355d354189c93818380e59650b07ff2a5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "377e5f845611e7ceab1240e1fd2d57de29fc34f626aac76483c3642de1c3f03f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "396beff49bb2b0e5e9d80d299cb9cf2267da45ea44e4c121757dc665a9e0b57b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "3a0b689ddf596b4c97b6b3397268312407c4f2b919d539f22651727ce78b6715", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b035a2f5e2faf7931392d11e48a2f4aa9af4af14dbb2e002cf903c251d2b754", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "3bc4393a70b449fe036a5933babd5d435b6955c35d6f24d2b161a29e493b2b9b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "43422b58553a39542e0edaa964ff57d66da849739e14cd6b03ea7d8b46eed198", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "43df2a97a694ab4868f43580e1c3b466028e90b99d2c1308dd847ccdf6c66f35", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "453ed1d28e8b0b55f642379e49db09e391c40a937db3a2cd30dd1af1dbf38779", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "48d3bc99d59913d0349fa9b4cdabcf681fff4921ddcdae06685ca98c8bcfe531", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "49428a168edbabf87ec3afb3c877b78e4cb7a5acf6cbfc90d12430e256155357", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4c3d6a474fef8fa443d911d93e02038788a99299c2724ca1e9a5d76c4bb61903", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4c4a35d146196f81af15ee54083b19f4102ba0c1d6aa021704608d59c17865c4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "4e418b32340e00e4fa22016e6a1fd8c5ba495644a4d030afec09a235004a95da", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "50ac387c35ef918b15d244b420bc984f54c1c943a048dd351556ee98ef3473b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5309ca9d12c93e18acbe8270023f3b478ad03af6090f6bd5cff33751bba814c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "53d3ad3e649914d0ba64f4c9ded40d188c0a7739af0b3dfb6793674a71570627", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "55ccdea0241b5a05850241c54abdfa7f31a6bc062607c0050cbac446fddffecd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "5706e8fc4f0e43b2f66e9583c9cc7b2e2a19c8a70869513ad55ca136313657f7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "579577056286de6f433f20d7fa86ae90b18abca02d7ac3b7e4c77d60a8798d80", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "57f0fc6018ffdf4bf4358f1d62e9b5ebd0bdd78086d217f6488800913c83373e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5bf5c039cf42f9c0254c9b82613d1f649f556a91d11e6d42d98957109f0c6b84", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "5d4671c620e1c1d7345fbeab59e4f329d95a0b2c4e942cc70abf22052a107de7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "5d533a87b55328685a377cb88dc99a240248daccd724c3a93cfa3d3fb41d1d53", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5e287ec6e1177dec15d7640f144027554c4418b45887770498a14e6444789aeb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "69afd7f478d7859635472313e3b53cd8af3b3f7fae17804b707695e66801916a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "6e19e8dc3bcccfaea5d3583be2ba30737dde7a1f4f64c5f88f242b85fe106c67", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "71e2fa78ad0b696277ef48adf9d2b0254fb1295c8436958d3f5e2749e94acbdb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "75625d989f62175d819b452945d83180b493046fd4d2514d7634d55561cc9c47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "7608d86dc0ac8afb7144cc610482e47f4e4592ce7e990e789c35687a54d0deaf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7820b2b7f7cfa760f3c572630b7084dab111c6dcfb75b6c798a11f69fd74f803", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "78a5610c850c34a0b4e8c55b3b7161a272bc8dd17b9348e9345b403df49fbb07", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "7b6f5bb9794e7c9aec8d7a61329e66cabe501036514c58d585c20419d1eb59a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7bc47e5217fb3cc954b286eb03c5d1de3c70fd28b45d752f6d4711d259cf9ed0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7be70aa0499239fbb564ae78c5d9b9dd954d5e395f75df7acf5f0c52c8111034", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7c9864f332c0f998be3f123f1bbeaac2dec5d50a12fa18abe6116290973b4ecc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "870b6195ba8bdbd981f5563eff0e64ca208014e4c6d4a7f9aeff0439248be269", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "87e734a3a84918ab43e03508211b05b2053bc2076f35d6dbdba5380e8665e3b4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "881f56e5ccbf9ab67aa4b40a25cbec0660a4628260887a907ee5d9d419fbc872", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c71ef541d64bbfc263c0bd6798875faed3f2790461253ae02dfb063b88a089a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "8e056d1d395a22188cd11d729d24ccb2628863040c5878e246712c4be21e24c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "911809da17df059b2daac90674c95382540dfbaa98df3746230bae3d9f460126", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94dfae2b6ffedef5c09c37b60bff6f0d088fa47754ef2126ff9943b06dd76606", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "98c4d23265eaf845fdc243bc3b703ea05c9cebf87108f348edb3d8d6cddec6fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9c9208bc3b347a3289ba94c9503c48e228bc4bc880e3abfc8e0838f6dc16e2ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "a31c9152fd4cb817a19f2dba56442ec2b5fc5bf47459fef5f190d6ef1eda605e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "a3840a5e1518870a82644cb84a766329e631555f49211265e8f9c140932b90c5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "a4530102778c646581d50e1e1e1d19ad367e13c837347a94e7a207f878a28ac6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a5426d3d400ed31553428810dda487caec7f9014847affc11bc61715b7b0d742", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a5fb92a17327c93b5b6043620721fdb1e7d854e97389a1b8db130dc657381bbf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a65e100843b38f3d1544c4d93f04098c956e77c3dc151a8a83b43b3dcfa8112b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a9d6f075b7987ea621dfc81539404dfc3987a414d584c297e4282133063b5415", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aaa039610dc143bf773736d999c1da8b973ef36100eb05814f0fc2a5afe1e6b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ab6abab9e68c2d0527a3e05449692a4e1b27091ec98d8efc505c86af9bcaaeb8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "adf73fd5b20883ea12639f3ed447555161fb576f43a91c10f09ad8a7ebed153b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "ae689bd5658b30af2d192e3a7dde05ac1446cf77558529e45deb816ac4bfb214", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b13a50c7531114d1242cf8f2d74f85546dc5a85e56373cee37bab39093b2a45d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b3143096c9864f270de3ca917398ac5ba7dea6bc61e54ecc1bfcdb51e301f0d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b3d41dc560c8292df6b5ed471ef0c3ccd20f745eb7c6b2477b17dac2fb3c8475", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b6397261da328379ebc37ebf9bbc0246f12f9e73907f34cf43fd8d9405bbb5cd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "b87689227c59ff37fc2d1da2dacf81378509bc2aa34942a2148346291ed875ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "ba4aa781e645cd2d90fd2f5d7f17315e1969b454d22423fc1e813aeb21047ea1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "bb0dec69bd33e0b27d8d02a778e83cdc6788a2de1102e0c6db7c3132172ab3d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "bb31db9177aba76704df4e982bd578a2130ae4e8f3cae9ab204a835263bcfb65", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "bbf4ad5e1b40c9b017a43ca5afa31e87806a25683cd267a4e27497c9945b55b7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "c17ba8e54b1e4e92095d6f3e632730040551c61022d123cd0dd65447d97c4d6d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "c2d77969653c4392dfec1ebb6d102f77058795c084bc58d55386f2b058014264", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c54dd3197adb61e8ef4fce6574ea47b3debd6e785e4d94acaec717b924702cb1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "ca68e9d48c15b59701deefa73895e27ac9defcea35c2bcdbe8b1130af8d7101a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "cfe117efcf1679bf073c69c3fc2e550e4454e6a8bc2bb16afe70eefc7722461c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d13ff30645f8eef50865504fde2dc9dfeca505a71e22755eaaaf804fe309616e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d23efd43ecd1e922910848ca2e9a6f449404d81ee2ca2d61799cd67f21006f40", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "da276d950503038ff5fb5b9dbf413560c483af4066d6fdb1232c840d520fb583", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "daf78316844630c7565d5a9fd57ca770b9253d8e15c22cd2b32df9d2447a9586", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ddbdd0d710bdbac323fb98444c79056c485d0ded4e9ec54521e519a6bdb9c72d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "e2c3aef5f36d630c4724ad40dae8a7717ddc627c8a2de1828f5fd7bf30014654", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "e72e1d15bf5e407c42dc100528b5d3550f10cdd474fbc1ed135859ccac4214d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e7c28313b0d95c4398746d00a0dedca9f8c5e114c215e53aceda12bd477b01a9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "e8f43a24464d0b288de44ed436f06c166931b6ad0f33d16a847bf79d27a9f11a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ef37a81b8da80060c7247034ec791c259427d894a01f3eefbc197ed03ad4dabc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f1e0f77feaabdae6f327bcfd47403aa589d75660b963e683ddcfe4575987eda8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f506d09c038503dfa99a65e6967251b6f1730f7377e13227f9d7fcf761048ac7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "proof": "f5437214b06998e455daa36ff422e4099789f7e4f99bdf36782ad87c8124db73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f587e334a5d67d6490af05b4a525b14288c48221009a5190e1a169eec0140b3c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fa1d5b1239d20498d8e488f4e724374957ce048dc78bc594903c94b2874243d5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "fc09ae74f2e8743b8d4d7dcabd852e268303b919aac47755072cb7252ac6e4e9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "fc3c711d2db188d7771a5b0486d1a6ad653099d7024f27e0d3a8a0ea2b2db58e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fe7e9c89ad528c0f6f041a32bd9435b5763d4f943e6a3ad20469f00cd5ab0085", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "feb171be3839ec6daf3d5867d7b1edeceaad46877b559049a9a804b766af1a8e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "10226cb977065ea080fdab828aa40e7098e036609389e58db2cee7cb6d1e09b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27e35ab1d158c1f226c23a27fc409e6762259101165cda298249c4198d12bc08", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "568d51f07e21a15fab70e69faef3b8b304faea1f99a1c51f746cc61706761ec4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5a90f5cb63aeb7f8218eed40c9ce1f44e3ddcac27edf16b83a235a6b127de68b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "726d0963cc8c792840b6e95d3aae434a1bf6fc58717d0bb4258b4893e56432db", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9133fb07198eb538687aa035136066ee2da9d6f137b2ae4d2f37163ae7dc6a73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ef8ef216d2972f696c80554b57f10c581e7efbd74d3fd5fb913a003c2910e585", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "5eb527e792d4465f8e9d1446ba84c732d49d9b6756bf9e4ac236dfde176b323c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "671e859c4ab3cfe122ff1adfecb70bb7a88a8649e8eeb46bdac4a5fca80e9028", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6b036f2df42599dd6b9053b2e616a6ca3140501c170a7d522b0cf8e7cf070b25", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eb9e76b6e5157e927e574bf9984b8694fcd0f50b4356420f90d04b12e807ccc6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1padl2xj53ac3s4c29667yjxj0ajcpf5lc7f9z6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33453be2538f91be542bc118e26026951e081709c509e6514f667e8b7fe358d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1patnsq9puuv8zfz5l3q2ygytdm9r2u6dfed9ug", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "12bb9f9f0d33718dd092fc809a65a58a6d99f5162df834fe0bd91b52e987108a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1patnsq9puuv8zfz5l3q2ygytdm9r2u6dfed9ug", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b3ea51f68d35cb5c1af6f2e3c4e4272183841cee8c5b7a28eea4056e6b17ad9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pazv6jptllrrntlkyerpazjqgtml9nfm7whc5j", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1f59b82ac5640addafda80bca651e727d9cf7240b8bf7bfe8d24751135e6cb4b8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pcap9llfuw0lmrjux98lz0nrp0tfa20zl8pwf9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a1d47538bb84081b44743a0bd4dd39e97fbfcb1d3bc1e6f90529bc6ebeee9c5e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pd227ffm3fza8y44pvw684jsvsuscdcq58y8px", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "afc96736f8395231398d3547c3d6b60ebc00e00b9a0ac72f76401fbf12b9a102c2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pekxavzl8c2ucxe3l6vnsxnnpew4l8cc3jjh62", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4826e54c605dda81f388581e0e67b672d515d45b92375f51e5ed65b352fb8aa94c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1peyuhx4r23gsuewp5u866scytq28y7mnuymlkt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a13be9f5ef7b0f4a65860110e528fb43e135dc4f3c1a75a41f03a3fed14ba5a6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "2b1af09eb8c0da71f48838fed7ce598fd745724bf3348279280777277b4d73c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "39bcbba3f392f493831ac8db7b41b7aad03209754331e37a9ef9274f7f65f533", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "44a5d698c64a0fc05545ae55e23b2842b856b3dc8e530a54b837015802aad647", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "562dd5d33700b276a483997c56c75a034b02e07693b3ab80f019be85f65467bd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "76c7c57e7b76d0ebfd8733c35301406080f53c5247288ba6f02aee3f30d40a4b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "f97d22c75749c8e8834e2440199926bce578e122782bfa924ea8c90ef7e96a38", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pgskzrhtcny5ns67pamk3e63s588uxgjpvuefj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "12e153c521a1ca794aa635687bc5fe73356102aa8089c4643104483891d0dfa9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pgskzrhtcny5ns67pamk3e63s588uxgjpvuefj", + "issuer": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "proof": "35c782897fc47213adb763290d4a84cd253d5b6b0a906c9069ab99b3b9aeb70f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pgskzrhtcny5ns67pamk3e63s588uxgjpvuefj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4877fa8643286623467202e671b6888c7e16606c5a6e8c739b261aa25172ba49", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pgskzrhtcny5ns67pamk3e63s588uxgjpvuefj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "990cae4b430267b3e2857d419bbba435a7f0e126c90fd5e66baf6b12aa98e156", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1phj3crvy8c8ztgn2zj2xd466s6xn5sawfnh6ql", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3bae7d5b941e039f5077ed5daa1b95eeb9c00f8aeabb28477ab666bf0ecc9a47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1phj3crvy8c8ztgn2zj2xd466s6xn5sawfnh6ql", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49dd367df6763844c7c9f22438197df4ad109ac858c1bafa15f1ee2967376ae3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1phj3crvy8c8ztgn2zj2xd466s6xn5sawfnh6ql", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c73872c28abbd227b7cd884c10f3c25817ec2a0a8646fb44101f0ed9b0743e32", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1phj3crvy8c8ztgn2zj2xd466s6xn5sawfnh6ql", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d1d219267fc2e76c60ad88ece29ee51f89e30edbdf99fef39e31cbb6223914cc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pj528s0ucczd08qr5l4m3c69d9zfh7jhnfdynp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f0991ac5bda7dba5c3cb48086ec334e037736869d21db8526c1fbd8ae54a2f3d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "09aedf33e73717f38efbb0b83dd9db01c50699cdd3b4930654eaa153353bbf43", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "357f85e6138b2298834388923a0978a97ea185bcaaa44ba63a35392af7b41b1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "785113c1477e18d44a4cc37c17829a4b096420e8e2cabc51ec7d3ce2fc475c5f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b17eec38ad35e6c4cb79160612ec309b6068c0719e96b9ce9d81a05acd3113de", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b9fc6904035124ef052709792124c64d03963dfbac4859002f82db9978f58f0d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pjegegy0h9htuv5fx6dygajhlm7vnqfcjr7ucv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "695aea27140198b14ced35129d69847190a315909a5ebcc71626c339f26cb9f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pjllxlnudvg8kryu4ph0lkm4qpfkyrj52kmsax", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fced96c5ce896a7a88c509505f9503f02649f8a4f5a0aa88007b208ea709780e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pkfe2cz9euuqycesxdtzzx9eg9y3g9rdm95np5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3a3788821d793074470c65aacd330f9272320e021a5943260bc67a249fe70df7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pkyqpn89rya9v3wvx5stghjph92fqk626ldczd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5a350ca0e302f9a8aa0c44bdfd628bcfa5f22e715369fa4903ab6bacf25e1bd7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1plufz9g6dxzfke49qpv5l9t7q0x6ewfuf90shr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "335948ccf87bed338fdcc86f2750cc44127ef4960a5984eecc16343be9a2deff7f__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1plufz9g6dxzfke49qpv5l9t7q0x6ewfuf90shr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5d8ab473ff8eb81d4b1ea35081a4891493f17aa9382cbe3aafba21a678f00ad6ca__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pma6v6mp0ju0l7s7lcud92lt4ayatw9z5arpk4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0823f83c5cc8a1b2a3507fd56c623672c86dd9793f8a3bf463ca7b4e8cc49a546e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pmw5s648tu5wlnenn2l0plfvj9hjkj3kv6dtn7", + "issuer": "shareledger1y7a3knerah596djfa7m0jldv6k0nad5msrgk80", + "proof": "cb1fdc36365306a0a4952159895cd32dd95126f664094a5a8a310c32194b6ee4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pmw5s648tu5wlnenn2l0plfvj9hjkj3kv6dtn7", + "issuer": "shareledger1uty2sj65rdj88gzheq0jufg0dww96elf0ph25k", + "proof": "d85fe7a375b382ffa5239f2cdd1ac9690811a0150419fb5a36bd6feb1aa0ac88", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pplyjeqq7hfg8a2snyw85ydsph5svu2vq45tkq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f95d7f42a6d5f3313797367c607485d6baa01a100cdfa427b1b97f7c6c3c10c8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppp9ntsvj3kzpqmmgrtnjgndtgmgjkmt0ffxdt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ddc4e23daab7a8fa7a4c00fe8b6e099b79729802281264960ec9e548e260782b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1426d8ca5628d88839ca7c055b5203c9b1114d629abf60934595567e5ee48df9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "57c055232151a40e7dd0c98e9929c9bd25aaaf94dc18da4be2d2ac2bbb78dcb5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6de09d78c56b651a3c01d10ef0499e1ff6ec427d6934167e7e255a9bcb4e8974", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8217473e46539c3203688fcc1a934dd7dd72bab50c170bdef1e58f4399ff0783", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e9468ea752d80556740fb3d8cbec3cff0d59f81ed0a8618b6a8a4defc438ed5b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f466db5ae6ef4f44e10c4eecf22547cb26f4978ca0311af379af69803d44c44d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ppxztswwvt5k2am7zkxfv8dccztwm4nrmx7mkw", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "95053cc9e2dd13c90c5e917d0401d8f637aeaf3fa9454db8a4fced3d56fe70ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pq27vlk2h750k2k4xzn4wzmqwwgua47lt4j77f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f22385571bb96265cb488adf83dc8c29faa5bcbed08a2e161076afa61bdd8f169b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1prltyzgdfn4vnk5cmtx723ndll98eu3z9u2uf6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6083a0ac54994db1c03304ff1886af5ce7e3289ec027c638dd52c40daaeaf035", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pscpyetxzlr65gppku5ujg73tnmxz25kwd6mhq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "29022eaea40d585a28ed5b30806900959808e852ecf1d0d838a170321ae598b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pscpyetxzlr65gppku5ujg73tnmxz25kwd6mhq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "949d88b8cf61816da0a4e5c828a9d93d613667da8453a7c150f9d4eb1e574f87", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1psqd84xatqzd6uu3e4jwh02hqtyg63hjdtg4q3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "387fff2990edfac9f2553b4e4163c077025173b290e6d9e3bf61ae13b75465e892__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1psqd84xatqzd6uu3e4jwh02hqtyg63hjdtg4q3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8e20c2b538b4c0aa4c9736620b629a06feda4ced9701f50ef7d897e3cc8f06249c__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1psseh32jxj3l0na9pytxs8kult05sw9qpsr38t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "60fb6a06bb54e3127b514aa8234fc1d5e5b7327058286ce6629c80c3bfb573af", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1psseh32jxj3l0na9pytxs8kult05sw9qpsr38t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d7774dc9d617802a01dd94c0ca923333a7d76a11fc16dd5afa536262aa19f85d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1psu84nvkqtrcpgee584s2mmn0aswrxnpja0jv8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eeb91c9556e67460b7436451bdcb8c54ce136acf0a65dd741e34d5a0cebe53a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ptm0hw2v6wkqwkxfaqt6gquxs8d6vhltxmhe66", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "32efef4eddcb1e353eee930923f26e624ae157a395f7e1e44472b274c8de057d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ptm0hw2v6wkqwkxfaqt6gquxs8d6vhltxmhe66", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4c6841c5de95cfec02062f4949aad1cb745a4fa85acd7bd5405e1bd2873f0bf4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "04bf4e0523fdaae79b42312643a2668461d74b2adb88bce6ce6792feeffe8802", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8ab39cba98b25a4a5626df4fa670200ef2a27e33af5dc273620990a28870f1f3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c0bf836a0716cd45e6b2ad77ed9ad0677e377adcbb91c8948fe0e666e5cef18b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fc47037de4fd3d4f44bea1007ccaa0c3f648c44868bed4bec8ed3cc3dabb9137", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pvmxa90lgdjz2zqj8ggxwqq2arvqew2rnujd89", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "134690c284085a80df70fc4cf1c78f05a5dcc5a2856b10a5e49c655d61581cd0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pwxrlgelux2q6kyj05hry6h36waeqdstq47g0w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "962eb0f5d8721d2077d9786f9bf7fc150efd029bd17dc29559f2ed3a2659a476", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pxvdw9yz76zup5p49k6wgw8uvg9zj6t04k4zpq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6b0d4f8b8cca1afc7d92b3a301ea20b3545148e3895dad0ba56b7e30800e0a0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1py2fy972f2jc3q8l6388473qcl4fv8k5nt2vep", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3c26e61402be27161fd1c92f13f53b4b7efc55c569ec628dda39b7f3b4aa618695", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pyqjzcaf667yj3j7mkzew53xkhsvl2ra6cgmmq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b6fcfcc61db0173c3eb1349f15e74f5abc07f65d4fdb61cca01f9fed4d72a21", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pyqjzcaf667yj3j7mkzew53xkhsvl2ra6cgmmq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c7b1507bb5b47b53845da569166046704db6fc882a46bc76851589d62eeb3745", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pyqjzcaf667yj3j7mkzew53xkhsvl2ra6cgmmq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f2d6f71a7b10fa530e1174ca1607539304d40bd48b87d8891da5c5b2e56bc031", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1pyqjzcaf667yj3j7mkzew53xkhsvl2ra6cgmmq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fea1d449cddca7066ade62d28aa11dc1d9f7e3f10430e8ac116974566ff13436", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q2nanj736taryf9u5056wsstv6ys3s9gym2hrj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "25e7b86878ce2ee2c8f1af84fb37ebdd7451cdbb056a766a2df9f9c18d13a06312", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q3gdav3y9s83wdgwra4862tjqgryjnl0rcjxuq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "265ffb5718d28b705cea295c8332f8f7ee2d5fb4852a05fcc0bac8fc2c03f525ab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q7da6cfx69wgp867ucd49drp3qr2p3hjetyesa", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "df99e2ef70fb8503be3c372c06807c28b07e11d18c96f8abfd8001d7aadf6381d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "17d1444323d53160322be4380172f067726d77f978d08a405a327d1097635611", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "1e3ffb04d69385836a62fca091d40d0cf63839bec1f8b7e7be28109a40a7ed59", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4bde1c9d315c8b16a9fd1f1a663ad661c3dd9016d47c3acfe74a23e1bb132485", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "issuer": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "proof": "7f3773294c7f347932bbfdaf33d1c2cb41f64d053eb70dd9ada3a5c43094a6f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "844aac381310633c0b4895891d73ad040574bbc944d3f015eba6d92113de782e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "issuer": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "proof": "879e02035354d1d6cc479154957ef71d7019d9e465e74fd9e3de524a53743dfe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "issuer": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "proof": "fd6c65e325f002a4a79f25fd82bdcf70cc4dfc030c3d8de027c28e36eb6f9d3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "006b6221f94627c43abac79ca80cc45f15135539f988a917e80abdf9dbe14bc0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0c633b17273ba0dcc04ecca13060422393e0f9c9373f27bb6de283fd17e45445", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "13ac2ce2207a786859613546db0463706414180816b6b3d64adfc07f47f08746", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1b2edb83288f4b185587346b0f30bf42b9149e2ca8a40371516c44b96dfe2a2b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "269b39f2b011573f009721a82af888689d52ab39c3b87bed1d8276eb4a149afd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "31c5a4a611241c39c6f60e72be118bf6ee146d17b6cb65eac548d8f99f5cf0a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "42a44c67aea3c8c4e8c962d0b005ff9b6445b3629537ee5851e217c1d0287d7c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "proof": "445a1832e7d8ec638b8c48b15b14cdd0e5f673d27fea53ae04b6beaab5cd53a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "47f19a67e9523821ee4efaeff4bf1bddc1389782d288f7225a9b5a7d58ca0182", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "56652aca5273e6ca4c3e761e3372ac7d796d9b72a6b500a18a788b5805af052e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "64b37e3dd8a38bfb48fe7e44b979987553884f3527cb8baa69b6afc8cd1e08f3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "66fc7cc9122429fb352ce65e6b30f06415fb1ec49221559873956b8239198c2e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "proof": "6f16700d3a95027af55149b43dd926c3a4859516c85230dfb14222f703e20226", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7c71319526012c51584762a8908e3f8a9b5b15da1e65f7e4f7924dccc3797a0e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "93c2add58af7f382239679bad7dfe17527193ead6e6d4fad46a0cbda45017eae", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a1721167b4c53e8ec57f482b7ca4c81b9e3d3122157102cfa8ac48ff9e2f8120", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "af2a87d33a2350222e7b6e6456d97ce6d4cdab40c0e0fd5bcf9eac4527238b14", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "proof": "ebea6b123c0cda75fc1311ef16bb033aaa49d1607af55ffbbdfc86cdc86d653d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "ed9f92c326d88efd34e7ab9159b3c21fe9bd9472e9aa3f8554fd915e5d6c8765", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ee760143c081ce44bacc223a73fb10b561929cf92c924a3b42eed85447cbf74f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "issuer": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "proof": "f84085b64a1807dcaae37900952aca4beebf9396dbf6ffc30ae45de4894a4188", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q8lk37fhkctclqukzgfqymnst5s2slgd9c8zm5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "076cc96eddfb2bb3b7a318177e65defa9bf39a0afc3a3b90b5ac21c3b734e089", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q9pdnl67an4uly80gg0r6khj5feem8vvps5zgx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "699b9378d5ae1453dd6738ab6075c372b161459dbf18fae6cea9b91409737505", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1q9rnn9eegnvvkrjkgk5swftmexr4950pjhlu20", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e63bb294b9848dec0fcd8692116fad5b882795dd704453980eff1e9696cc80af92", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qa754x52l7zdgau9whfxly2x7nx5ppeua9438t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0e290cee9144b2852ac478c6e333b6ebc700421417494175adc9ec9a64a606c8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qa754x52l7zdgau9whfxly2x7nx5ppeua9438t", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "82394e73f4d81d9d300035cd9ee30963965c04f7403cb367733337b7da61fd06", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qalqm8ma5sn5yhe3uejdzlll2ysu4sevx905pu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "113c729f181af84dc08e9821099b4ce405ba25841aad9240198bfd1ba04deb10f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qasa3dkejam68v4ptyhvps4turynyp8nvm4rtu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bcfa4d60fed62869a0ef5da1707af6eeccf766aa68254c8e0c0aa691df37ec780f__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qasa3dkejam68v4ptyhvps4turynyp8nvm4rtu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c3a525b344fc204c86920ac2b51b526c866a203bc60aabfd2cb2dfb37b18aa0928__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qc7y3q7qv4pfra3p6rygkuau7ska8ncgcdac27", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e405d8ca6b3f2f015156fae40c2e18819d1fa649a980ec2edfddb1cc8f342e07c7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qdvlktaax8y3svm895hq9mjz8udnc6yghz36ph", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "09c505db6f2a2cf6cbb145dcc875a25af61ca48ae60f241ad19c0205e908eba2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qdvlktaax8y3svm895hq9mjz8udnc6yghz36ph", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0df7fb16d94f733cab43c1d26f53565c876f43319b05487721f4c2fe5890e8d4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qdvlktaax8y3svm895hq9mjz8udnc6yghz36ph", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e9ae0d334c390554cab1660d0474ff60752653e83b4350c34c09b88df8a9b49e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qetmjxrxn6yg9k7tgzmzug9tgkyu5274kxver2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27de89b85871410bf7bd43cdcf101d78ff9471a1ed119161a6e46b678fbe8bf5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qetmjxrxn6yg9k7tgzmzug9tgkyu5274kxver2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "df0dc19050a854a0067e9fd45188ad778474f3e65a293c7401dba5f6691c1225", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qetmjxrxn6yg9k7tgzmzug9tgkyu5274kxver2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f78448e1b14683c0e80bca20c15b2c545ebb37d90b005c78bf383bb9563cd0d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qks6p2z7p4vx5h04qkuffk0l8ryqtdx7vz0v7y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ceca141cd91a128c0399576382d6696a4762963258c683ed68296f1e40babc9a5d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0ee269ee16cf395114b862b179aad15bcf4e48eda7ffe1cf8470a2a1ef126cbf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1df3a58c7e99d9efd0b52107c969f7424e4a865be29a639750cb5dcd06058708", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "22ea51bbc2ac6dd5e22294790ac1bc9eca734ab85a94c29b6636b497c13441ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "59d3a8e5637679493b75530d5003afefb332015208b3d7c856744151679e2836", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77f76983491ecb0318dc5347dc14cb6270094d4aa4fef2ac935bb633fb00ab2f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b95ec16a817ddfb6b3496456faa2dbbe48d0a1162225f6cfe5024db8e6ff93c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8d92b2dae856dea65300ee86e7e3e862a5aeca03a34828420c12995d99583d54", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a30747b9a62530351504af9b380372ef08d63953d72a9d11145dac4e7ad9ca47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a30747b9a62530351504af9b380372ef08d63953d72a9d11145dac4e7ad9ca48", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a7978fb71992e36034dd55be3b404eb98e39801fc3a3a3b5639b28f2ca57c7e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a83bd2b61d1853d09c509758994d456e3b26713c4dd918bc9759f9475ddaa101", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ad3d9a8435f47270d40c4922167adfd93070877aacfb69cabd8dc377ba95df8d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "af3d14161adc7df3cb3d5a437d31cf01432ddbdd31a21a0e61c108810ad459d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cced305009b4f304e67e947cdf032b2f4530606b60e80b9263bde5629520478c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da592ff1e3aabe34e92223ce2ac3d53784c9d7dfbd062a57b46a30b5876e05d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fd5b4b89cf8cdfd54d05d97108d3c81963ad522aa8d8ec3ef68652b2277cdb35", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qlpxqwkxsaanevqfljygayqm5p2qhpvmn5y6x0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "82dae05e907a769ffda4de15a27065004c64b41b8a2d2ea1055310293183533d74", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qndcq95yrqdszmzux2anlsy33hv7e6w5ldx9k4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bda0174000bd3fff6dc3e20b5e762c5bf27a9f9f193e52ab0c0492f810ed46e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qpmyaqczlk4adw5lk0spjxd746mda3vxukyhht", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8afb767ee0fc0cdbca2b0bf5fa2bb38704f0f265331317d89a04b1c9cd21311c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qpmyaqczlk4adw5lk0spjxd746mda3vxukyhht", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e2283716786086a8f6998189910fd036e8d12edbc45ad61d38ad9488a5c46842", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qpmyaqczlk4adw5lk0spjxd746mda3vxukyhht", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ebea2f4595051aa38d061745b9aecbf80c0ed185cc8a9759c9d32e1b94df0326", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qpmyaqczlk4adw5lk0spjxd746mda3vxukyhht", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fc2941cb827eee343b6cca816d41ec692e4c353c5f9a10194ef052e249b51f77", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qpxff0ghp26k3tqh6p6mrax5vpnp6534taq47e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4fff252d2dc7af8044102cf6f649ca2373181418fc6f244f5c3eb961aa22d826", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qq5d78wkt2m0wv0jgy26e3y6cvvdmlng6ys0sk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "94864b7498a09594690b6fde9f33e65079e33ce57bed60b344500c4ad353848a73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qrl03degf5ccprgnvsy58swhxrv36du5794gsr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a33e87fe1834e40ed840c3298fcd98c4088651f17464603ce13d7712d3c4559577", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qrssj96ysxtysqsftysey8jddpy5vrr3a32x3t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7f9d2cb69d3345caaab92d3e68c4ca42b0fc3300324e6867342cf18ef662588c0a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qseg0xrvk6ksc8dvafwt3y88eznasy8ewlpmun", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c00dfa7847b112b3007725e685506a211b58bbfdacdd4ecce49103d81c1ab358ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qsfhza2zy0m72w9xfjpxmc0hney0sd24n2s7k7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1355a946f4cefa314888666ca319ca2fa5723c3493a1be5dd16ff92a27181ba1d8__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qsfhza2zy0m72w9xfjpxmc0hney0sd24n2s7k7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "85f878ed02ee08020d8105fe0dde504f9de3e593c8ef16c9ecb37dc4722b0b3f10__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qssnku7hxynytg44uvk645qmeq2677e22gllcs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "15bb139287693a5019d2e3cba1c3d33357f8bc00e77b58a85c0b8655528d1b4d28", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qv02zf25yclmfkgcwcmr5sgptekhyt025zxxw4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cfaa9e46d3b5ee5e885f4635555c709e9c0fb0a2446ec415409ce90244653df7e3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qwk8h6g3tj45re2xk3n39mdrfwnjjjkah03pf8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3a689fa82aa7e66ac6984b04aa6fede38718fe5601510092e3643e38219442bf0d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qwncgugt7tzak9a4shkqqt8tsrdzfmtjurc0fw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4dfcc97c58b2a9d0a2adc80cfba72cb85809d2dfc548c41ddabe01cd46682420", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qwncgugt7tzak9a4shkqqt8tsrdzfmtjurc0fw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba7ac89244698669f8d57485d19220fe7e9408b21ac217bb65b5089d6f567454", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qwncgugt7tzak9a4shkqqt8tsrdzfmtjurc0fw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c24d814470f5d39848b225bb1aea0aa31d908b649a82d97f974d2debccc8f60c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qycnthw9n2gm5235l0qup7v9fqqeatwwpcpyar", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f305091d7861c61b1557d7a02705ad6f62ad985084b5be22c9261af788ab91d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qycnthw9n2gm5235l0qup7v9fqqeatwwpcpyar", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "53f5735511e277120cee45e572cb1f9bd5f53d917dda13184c480f660add1454", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qycnthw9n2gm5235l0qup7v9fqqeatwwpcpyar", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77e19bb720317626ac3d6c70b32789baecd4c537bb1a5850ac2b01a079bd5138", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qycnthw9n2gm5235l0qup7v9fqqeatwwpcpyar", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "966457bde5034f8fb46d9cac8d5ca05051c88b1973fedf48e0d6285797cf59f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qyf64hl6rwwsgxq5t9dd63qjf7lucrvfkl5k2k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "695a7d052a5cdb2d9cae9d0272753a39775ece47f171f3fefc2b5d53804b89cf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qyf64hl6rwwsgxq5t9dd63qjf7lucrvfkl5k2k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6edf903507f857c8fdc51a0ac6890d4f342ed4c1a87d473adf12942641b7d8a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1qzef39kyf8ryplrz4nj7qcst796jyw820ru9ur", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e90156c0bf963285c52e35903b08fe3383731cdbcad655927db191999e644bee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r0h6qfpzn9h5s3dkc6tnhuhm2dyq0u8xs957xk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "369871446e9ba69bea4b158cd9dc264e36d3fea58b6372ad672225836a511ed4e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r2aj9duxyk2wk9jfl9udeaefek0rx62zywklcp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0fcd99c360a03f1367df3bfa76bb6690fa5d9360b34250e3ee7df9a38d87aaef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r2jshx5jmr8n6wcyqmudvxunll0hmxzy6hu0nj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "58c9d1f0fd35c993e9ee8fbc6ba824f2559663da2a73c0b6ff6a956f2674fc0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r2m67xzwrcyzgsadnl52zw4sr7xpdtey33xpwd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ca234f1e1cfd119e3e73f19d501868f4daa1caf100d7727659c12f8a95e5594c61", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r3svuenugg8ffeh6q4flwe7l4tvumc93k7sr8f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9dac148969beb4aa3d004412b221c1eb77fb74760c3d0199fff5b41a1ef0fb46", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r4sm5saexpjhs9d7wutuql956yknlznr6fcau9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d58bcb5f5209b814e4fd2dbd99d4928d295588c38fcea736c971e55a8c376169", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r624talz0q6jn70xw5hen8zlk8tfn86hnge7z5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d986966cd534e3e7f53da4f974c3becc99f31bc69189f2cc8fff7da60c8a66a0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6tx8h7ng84qqejujppm7pay8tsgz6sfjvdk09", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7a331f8055719e9e22eb70a27a36e38452eefac08fa6d0d9202caa2a603c79c4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6uk06hqmqv82xa0xy2k4mrm09nynxfhvzjhvz", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "28cdf9c8630df24272ed7b51f5d72804580f5af300650423c4cc543d420372cb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6uk06hqmqv82xa0xy2k4mrm09nynxfhvzjhvz", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "6d39543c9c27855fa530954a32c24282f45ec8e93ee1c2e17636cfaf0e23d392", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6uk06hqmqv82xa0xy2k4mrm09nynxfhvzjhvz", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "6ed562dd2b23f6c1ba2a45ed40abf521fe883419de0350e02a0270b999350552", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6uk06hqmqv82xa0xy2k4mrm09nynxfhvzjhvz", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "76ce9b116b824bc779ad0da1e49ceda16c8b2d0302081e6806576b6dfce7f540", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6uk06hqmqv82xa0xy2k4mrm09nynxfhvzjhvz", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "ce74173742109438500b433b6d229b6347e7c8af8eef245257b7a92d556e10e0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6uk06hqmqv82xa0xy2k4mrm09nynxfhvzjhvz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d2dbae2773eb3f80c4170ec1a75f04ffeb67c1e6eebfad452aa3aba2d5537e33", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6uk06hqmqv82xa0xy2k4mrm09nynxfhvzjhvz", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "d51d3c01fe30af7e4237bfc2e2bc518889df4ad571ed6798aafe7defc6e6bb77", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r6yszfhg45lyv59ma3krdpzkwdhhd55ehc7dqd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aec3dff30cb5ccbb29d4dedd81e86bb64b214c213e4093e5f24ec1b55708c44d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7erv25vz24385r0k74234u287rggxc9y5p4td", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "acd2addf881246d00b64bd258f035e5ba0a4b16aae89bd486e82e3d0db0f323c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7hscd3mcp0c85fzgnaw45pjrcg0wvpezdaz0x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e6f47cb1fd47a7c028bbd93b113ba029773e5bdbfe0805bff4e887c42473f85c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "01b9a416b6bd744f056f588316b2253619c245c272c516fd332aa999124b0493", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "43d74e2a359337bffd0aed43743b18bf85755841cd396b8737f6c42b5073c7f4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5e65045d9ff0dd31603681b615939b1766873bb76012cdd573cdc6f161732801", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "61e0169069c771ce76f797bd704e87b156306b5ba0e5571e64e310093f15706c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b0f112744699fdbd398d2a0391c67baa7b4943d5ea474071704e4a2a3303a60", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b2f019e03e0304bfe9fdf2e9401490aee8046db53d2c4ff2dc565293257c41e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "caa494366089ee9f7ccaaa761efdf2816856483b3ef74f19bfeae3568bf2aa61", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f7337141f2ecd1a2a24b5311bab448773376e6f34c610460e98ba6bd37ac7aa5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1r7xw223puylc4vs3qsq0jedxvwyu4m6pz9le28", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ccec0fa7a124276b76b470bcd249912a8f3265b6f51a6ab5afdc331d735554ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8a987c250e6606f2e32b9ffe0987bddcd60d14fb13095d469ed7f3124cbace00", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ra4jk45v4z3dsx460jl7l79crn55kw3qlefhv6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8990f62bf062049764d6136615dd9a5040f57312f0c0aa3275384adbb92e6b3eab__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ra4jk45v4z3dsx460jl7l79crn55kw3qlefhv6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9338f898e8571d0fd515e2bfd4d7279a0ee380f638f6c4e862a8c4e14f3e823c81__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ra6q395l923p8x4gq8zyfm6c4efzwqwvzd8sqs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ea5d647876c0fa3025a08549c041e4a3a1a6bbd1d47aec5c0857550324d233493f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ratwur8tzrvnyscll960ja0rv83vj79v09fc56", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6da3c3d3ca6c0c89178b3066bb026a4b8a79cddbc82b45dca895bd19a7992f7d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rcyfrd0m2p42rqatfnw8zrvpnj8075vahuwhmv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "782cd136a002f21dcb4a971cd945e5dc5237e23206b04bab2300ea7042e645d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rcyfrd0m2p42rqatfnw8zrvpnj8075vahuwhmv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "971a941ed3310b743328031ddd2293bed4fc2d3cbbe3caf3708522340f493de8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rcyfrd0m2p42rqatfnw8zrvpnj8075vahuwhmv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "be6f1051b2ffff2298ce8b9f5f7028b0a678fa358741cb50c08b4f026c4d0b9d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rcyfrd0m2p42rqatfnw8zrvpnj8075vahuwhmv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c163bee412ac5d70387fdc528689130e9078663d61433b87975591b0a964856c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rf3jt9qekpkwansun6lg86fmesadqy6282ctx0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d00e642ac42d2032db278719b60570064e4e2e88b7d166f318b7bdc86021fb05", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "069b2e054b0ef5aaded7353654bee051af06d663444b428fdd6006f251258504", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "516ef3c588e96c4bf7757c887b95a1d5276b546ded4eb619778d823f51fe2ecb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "589c38e7cf6ea4521e9a5848d80884428164b463daf670eec5d972225bc6fcdf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "72e196e7a62fc9d1f74ae4b65a3d2abd4d38e058ce050139f4727e5b61b844e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "807f8d6ea0d57952905b6512a1d773c226dfb2c765ee9dbbfd0b4295e949787b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bc5563881c8d5abf07f822ba94861cbb94104cf88ffc988d5fb4ad0c8b198d79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rgrqxg5ptrq03fwktska8gmsz967mkp5v7mqjl", + "issuer": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "proof": "proof-data", + "data": "payload-data", + "version": 0 + }, + { + "holder": "shareledger1rhn5ccc3y52yjghpk7478m2rtva8kwhkktc8dc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f7ba8c8308305226e3786959bab7d68cb50c65bf45da3e78441ea0bd160d5b68", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rhvj9w3zkens5gjxplvnqfk05xntknajskmlna", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b766aa68da09cebb37ce5ff7114ab81966fdf78bed3aef6c4039d6a77e51c12ac6__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rkq3au886gmmga6j8vcqy4zzndclhl8en2v0xr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5c73ad17478557e011d217fb26c58a1403de56d6f49c5b547dce0060214fc4b4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rm9u0dutjsv06z2h96ypv8as2gglywqkr2w4eq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "73c7592f09f7593a2e01b66f6430c5796f778115962b207d09b463c1c1b66c37", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rnuvruk75xpxyzkgu8h9y9fwzkxfz53mg2hvzv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4146b0d4b01d14f450d7542a1f20060e7b6c1eddceef81e868f5ee35ca90f22c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5a7dbfb59c5fccad4f7141ed6c139ccd9cdc676656ad25dfc59ff15a96b2987a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "21fe818854394f1a54bda298d093e9ac5a5633eceb22816d9a671c5b45bce7ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3bd9a41894edceb6f7f6903e8033f7c116bc03e7263b8084603b08b9cb75c265", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6f0112f3abe84db072aac62a4fffa0828ebf7dec7f073d8b329b7d16658edaac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b09e0a6ae0e10723e028374d29bbb56bc516f20958ed67cba791a90c51bb17f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b4abcc6d77ba76080db366b5275b5332fe5f213f7f96f392df564de136e40646", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rslyr42eaxj4y8dvs52dfm6zfqxlxykc7vwr3x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7518380503968f541ed0c5a4c524366d4fe7b6260defadb1823735cceb5c4411ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rv6zpjng8757ldchfgq7h49s6hnh4c5vtze0tt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6d20e12d0f5d45b5128276fb86019d0558a813c085653e6b2d637ae84a4068d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4143e49d027f46e213d48f3190edd703a2b9ed38af8f4a6354ed52cca2789062", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rvz09e728ap8x99qg626qsjyfakpjhfpnck553", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e696b0eb0f9fe08bb48093e21c91978e644b8d5d8bf3a54717469c00606d0fc4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rwz8ckv6w9t3nx4xsm2l50j75fcxau0jrujc3g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b3899adafd5db7e8a70e6477b3f763b1dc01486cdd36baf2187621ecb055b67", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rwz8ckv6w9t3nx4xsm2l50j75fcxau0jrujc3g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d8c97f456d7507b40263103baf2a1c7e67485dfc541dca214216e7ed0f9efaa8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1rxkyzehpmnlqhekh8j95eysyl8zxey2pndurgd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "59a3eb32498cac5660243a8db55bd85fbe3e173960ed18dd7bb6da31438268578a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ry8et7d6rwwqde2q2vlwmaxxy5fqpkgrx8p290", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d82b7b1c9168db1fd576f12ee1397a4b517fa02d9ef4cf07eea163c26948dbb6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s262j0n8s9m87tt55yz0g2ygnanll7gd8rd3qk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "00d1a8ed3e136a8b0831800c9fb660308e10c971c0808c9758d1d0a0fe6d006631", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "07718c5239fcf85dab95c817c970584ad525785563975f3adca35c705f29e65a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "954a267589017763c9f3c3da5330523781149d3619a76c135a9504a6869c4fa0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9997e0db77794d0e1fd82ade87af3da30fabe085a3650f049986efcaabb95433", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a119aff646990f1c832ea02e183baa01bd7d70d03b765c9b947cf0a696028b2d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba20456ca533782c20e2a8c138c058213ef74684cd3cb67b0a15263caccfeba5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s2lvymedu24pd4zlzpfz25pnz3ggfunhajtq3z", + "issuer": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "proof": "5596ec928c9bc0eaf1646fc4b35b933eb3926c184a26ad594139dd3445740186", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s2lvymedu24pd4zlzpfz25pnz3ggfunhajtq3z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "96fdce957369d2c1f8677e6f71e7a27b0e59fe003d92307fa5b090aed2407538", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "31816f9e912c4da233240575da24530988c671c3741ad9569209f31c2a109ff3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "341c89edafbd2dfbb454564b84b8fc9735d9b58f4765dad85065b9218486f282", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5d8dc8715fcff96ff9ecc0cc1d794c623ad1ebd5b64b1bd1ec0815c3e0598435", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "afbac8ad17b51c453f8636d94756762860f1a1e3b84a168f392da289151aab9a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s4wjr2m8zfg4r767uzaadgt3ylsgj8vh0dlwgh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "50d90c06fad6e61dd705fd1eba46a19cf4e8be98dbfbbc61e9a829a0ba090086", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s4zwxc5aqdrmtudsdjtn94hzwyjknvv8g7u7c7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8187888e1751d7718becf93be4f8496dc0660b8b2d9ff69728d99777ae4c6c42fe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s6kkgauyegs9dd0mcgn8r6kmkw4p7gj0tyy2jd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a890a5ef22f871031bbcd63f1c9561a6dcea8d0b76e4d8ebb58eca9d1abcccf4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s6lq4z8vptvx6cx4vdc5qly309hp4fqvpv8p4g", + "issuer": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "proof": "3231269aeb71d162e18f446653579719c98af88695d0fc72d853713e233d1eb1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s72dfzv9wawrq8g8m5pr02hlzpkvefnf07exrt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "37ad87ffd99241908d0e00febc0ffb0c41278879dd91444fa0fc1678dc4b235a37", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s73ll85mrr2crs86lqnvfdcjx8pahs9d7ug04d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8fa1a3b7e1b13c3763848026293e0734f52d9cd6a5d598c2b142eec9cfaf4b17", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s8g354sjvw4dkx0rxfjqvqf64hqyc2t3vxwudm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "572cc47eb233e1473b499f70121f99be6344c12904f769ce27aeaada9e1283647a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1s9mpccn9wadexsg3wwrcz3s0xactgq9h9dxrjy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1011ee334c8a33e21c01e1e677bc23b6f2c059055936ee818c3a4e8092f2a785", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1schfvptznfv4lnure99q2xtj9kp5lyfcxsgss8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "95237dffff960a87e01a73c2b943e18d4f9ea08de87876ecc762bf3b5b9742cc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1schfvptznfv4lnure99q2xtj9kp5lyfcxsgss8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bf3f926f3ac7b9ece60f90fd31d2d6e2b6f6bd205478ab0409dd6098a9a04104", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1schfvptznfv4lnure99q2xtj9kp5lyfcxsgss8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fc5700a7a1c7828f685b5a78c54aa2e3a4f281e02843e37d9f09f8819bca35a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sdqn4r68y68n45835rzvxezanq2ztl5p69hw6z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a350e59dd30355bd98643c3fd685737f4cf1864ec7cd834fdc27750e7afec26362", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sea8u4qzq4h67hnu42wpple8xt0y038p6n42dv", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "392a247b97c313afa874009b65bf45fc6fc687684239ec432a78d492f74d9963", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sea8u4qzq4h67hnu42wpple8xt0y038p6n42dv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ad31c7ccad817e51e0c04124803583dea437eb5bbc22596bdea03532055a6905", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sea8u4qzq4h67hnu42wpple8xt0y038p6n42dv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bae72435f374c7a7564affd8be4b546c82221579483c540ff37b5ccdf04791d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sf9x7pd6h8eewyakr8vn7rv6vf8sdt5euz7a05", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "173267acec198423bf8742b50c963024c0193ee6407939e54c0e1d964a0f1a37f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sg20cvsd09suwlamkkxgsupj9czq7c628wu89w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "04df45ed799792a59e51c27724608dafdf4b964faaa532105f0ef8b2d4ca74ccf3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "328bc6f81dfd011758dc20a5ffe736f1198644563d5a67b42eda1f25ef429fe7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "457e0f9151d14465ded2ac1044cd6d44d0ddb2009828cae197ae99d33ce7779b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "632b55148e528da4b699da1075e6c94bb8d2e85d6133a5dd2a40b516cae1bb87", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6522986c984f34992425979e0fb1b53551c6bd8906fe1e0ce908a67837df200c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sh7gpgjr4mfc2h0d03lueqps563hdfc076n6fe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "78122639b59436ffffea2d92ceab36c2b881e15c46ce57a066d09ef3273889b8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sh7gpgjr4mfc2h0d03lueqps563hdfc076n6fe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c58aec7f826d3c622852259a8bd1c6a895d13daa6e313c4701eddc2ce612b59b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1shgyerx6lpj7nyyehj8tvt8js2ra8vdvd8lw98", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "578c72fbf955b837fc024fbfcee67be88daa7a84359335ba6f3ffde7e88bd7e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sj5sc72wpfesum50nhyddlyq8rnu3vdh3uqr6z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d6f7abff62cb18a3748dcad5564fa4df1fd84d3d1a9b6127e26ba486e7e57987", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sjrxdw0xnth0vwevnykdtdnxy7hxlnn3a3cnx8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "355b34022ecf7c52e67dcf56477618af6f3c9a3e62c2714774e50c8c41c6843757", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1slumxqyuswkryklfcvn0veaf3eymwwzwlgy5lm", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "5ead642afe24407fb85a3b08a536aa1605396fbe56d281caf015af7669360b3a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1slumxqyuswkryklfcvn0veaf3eymwwzwlgy5lm", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "f45f77e2a042d30368592b02a31c847b8b12b89549a083d60e703221566aa97b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1snw5x6mz4jr58k4009hfz0wygx94amnzsg834l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3c8bf267ae3ac1efb2673435d18fab71e6f6e5af99130ff5b544ec899581a81969", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1snyu6mrnd2q3wwtvm33cedc289scy3cwzy0nsh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "05b5d69da404118bfda121b3017cbf41e9fade14f0b076f3dede932fd60fa6aa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1snyu6mrnd2q3wwtvm33cedc289scy3cwzy0nsh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "131c1b44625dfeb0d4673a3fe16b70a34bab120fee62f1f13dcf0dce283eb23a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1snyu6mrnd2q3wwtvm33cedc289scy3cwzy0nsh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b1d4753465da7fdc3734e4826c6fc00965ae21995afeaf622906b43202825d29", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sp3tnsuc4qf38al7qp0azpx467qyjvjn797zsj", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "dcfccaeaf25c1f55cf2dfb23263d5d19ad62453a14b62accff98b3e41b6f8f6d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sqppesngelc93s4f2dm56cpxyk26tq6he6huht", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f553fb0e6e18482c0901d16052100f05c3c38d26a8d6ae7fe351bca3c26977af", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1stv6tthrhyy8jplmxalh5v9kng8w6wtqgy85fe", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "540199af84d3ee29b7ef6d0d484c3f757717cde5fd6b44faf9e017f770ed7924", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1suth3fx3dyg6tlj2s23rmwrht3s6eh3twsxdny", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "064d6e3907efdbedfdbf1b0ad7fb04cfb37b6a7a0d110ce07f29105eb7d35536", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1suth3fx3dyg6tlj2s23rmwrht3s6eh3twsxdny", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "99cf22d41d79748b69cbd18f4ea2b0402b3bd612016e318764025128f2871075", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1suth3fx3dyg6tlj2s23rmwrht3s6eh3twsxdny", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dd6106a862e60e9f432e2209295edcfde8e1df8d08bfd38ec719b0825d4e26c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1svhvgrnvghx6f4tqnx275y6du0wflfmzv9t9uz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9f0a0a7d44ebcebb2fe0865e0c1d66f74b87375c8875533d6e41943e70dc38d3ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1swfatwevcwxwq8zzgzzes92tk0mp5mpdyu35eg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ae94a8dfb108c0b23a3639348f787b9ebdc96735e28d450de73bb04ce37f5fb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1swnvj9gyh60rnjv7nqz6z60u873jgaf2c2yw3f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f8ed3b73298a73aa3387948a85762865222d4f877529b6d4befe2d12300bfa5a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1swz5xflff69n0cf6svy2ztk99jltn8tg58swzt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ecbdfcad885b2725ba3ff37591d847ee8dc6f6c06c8446ee72034b8e2e3e28d0d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b7e5a6fe6d1f67a45fec2686da96741e1b86bbf7739ac2aa1e31095183841188", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sxe8c3q20gvgu4le2ffrknzlk47x3xz3z9f5nk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8bcfcf6a6cce565d20803ef10dae5f87b8e59891d809df8b41e151c46ae6192c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sxe8c3q20gvgu4le2ffrknzlk47x3xz3z9f5nk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9633ea68f95cc48d23b8c5b3f95f3d6f9e1818ae3bde1427662f9c4c88326394", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sxe8c3q20gvgu4le2ffrknzlk47x3xz3z9f5nk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e79c8387312d7769ab32eccaa727f72129477f9658a5852a0ff8e889d69b1fd6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1sxq2pe3ua7dl5k7qwpfwecczk0ppxscn3nj33e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f3c4aa55052d4ae2731e7c9f27f8952f8678a0171897a0a215d4ee76ede87008e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7efddb64b8786822aea7632db761ca7ae93ac836795c7ec445892b8059214417", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1szpuh85zmh5rtnflz8f6krsjcdnjlc5yw7rd5h", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d74c702e7012e871d62a33ba90f73bd5fc9041056b81c96b3711191a364897ded2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1szqqc7t2y5mn0xtjhq7xqx4kamd6mmnwe2ugw7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "68da250ac753ae96fa0f7c8d02c1bfe223b969617f1964a4854ec36ce0442939", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1szqqc7t2y5mn0xtjhq7xqx4kamd6mmnwe2ugw7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6993f151026c4f95b5cf197a2cb853c0131d152ef6b99e22cc5fee871c455feb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1szqqc7t2y5mn0xtjhq7xqx4kamd6mmnwe2ugw7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83710bc46140566aed61e74b0ab6ccb129564ae23d8d6f04fe2ba552e21144e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1szqqc7t2y5mn0xtjhq7xqx4kamd6mmnwe2ugw7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a5fdaa4a77d688b22f2111eccbe7d6b298118838d0129e0d2a63261437e0185d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t0sd6dvpjp4k3ewknx0m0e3jg63cn36un4gfk2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "61cc485610bb613c399412872b808de8d50e0e94ee1e83b94cff0d44b75338ab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t0sd6dvpjp4k3ewknx0m0e3jg63cn36un4gfk2", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "fc5609046cdd91936810cd76e162669ea8f5efbb66e092e479b71dac7cd585da", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t48a7rvv6ksmawwjc9afjdgzk24cnpqjjme0v4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fa0f101d414fd63d4b4264ba7cdadb0f499defe741f54adb982148e68ef84f09", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t4kvqqk3ewextvhn4meldz6qsaqf4tzvj5p3p5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9624968a5be02851385ef192add3899efcfcd15890a6aea551043f919637daaa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t4v9xq5guu4c0nj5cqcjem85ztn9wygfc2gen7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ee667d94ef41256d65523cd95af39b2e4aa2f1265fdea32b7a0d0404c82b2cd1ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t556lgfcfy7v2agquzktthr4ydlnctj29eahzq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e7d7b912f84f8d47305ec13f9ba695206aea40c4657ed8b6fcaf601f3275ef1feb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t6mah3y05ehapgxdesptvr7zgmfdgefwkkvrz3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1fedd7b2c93604ec356082410f0b288251a1e2177c768f20668ce1e77df06e26", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t6mah3y05ehapgxdesptvr7zgmfdgefwkkvrz3", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "fb80d7640835a27ff0c2d1799467adbc874b9247b869928467ddf973b608b968", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t8nsq5n7swleszjhe6fx4x2qkwahf9j6v8lfu7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "408b2b1472883e065b33849ddd8ce47d9e8ef1172c82dec300453aa4c32e006d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t8xw80cvsnfnrhhkaj3hct6k359rtznqs222yy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "966dac653d66d1f20488992df5805b5fcf9099c65cbdea12a180efcbecd65fb7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1t9pycpay6dj5m4mh3d9avral38aewpjxl3ssfm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f7588abccad8279e12cc7d678e82c0e96bc4f3d240ed12cd166b75d5ef3b6ea9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4eba1904be06e0314ebc746ee5da516cba3032ff65f47a89a6d9c79cb84efe76", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tcnta40gq8w07yryxquwkvhrclk54x352lg57w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8494dce9950bad1dd28827a26970dd9e4485864924ce712ff29b5d129ca4e45b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1td2g4dm9mj8cmrer8h39j5z65pu5t3ez550843", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1ab43af6ae7d26fe889419877b47399515b751f40d39144ec5043c07c26e997a82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1td72hlwksuxp3ckq7p04vlqtsl8cxjywfprkrj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "080d5544a6f842028adabfcbcf71e086ef3ce6955060314b255219ddc9eb0e5a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tdd2pdj2e4wmev3c4zh9z8tvereh4qzscdjpku", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "44a189916b5b43095ae8d39556bceda31b3e9a6b7f0ebefb590431219dbeee93", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tdd2pdj2e4wmev3c4zh9z8tvereh4qzscdjpku", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "88e543f41fe60bf0ede695c6058e48bae628d7558e2bd3837027801492f9f45c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tdd2pdj2e4wmev3c4zh9z8tvereh4qzscdjpku", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "920ddd0c9f7df5cf8b57a2e5a56b37374f4e162296bc88473b5eef7ef5db230a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tdd2pdj2e4wmev3c4zh9z8tvereh4qzscdjpku", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "c5c99f93a2d58876425ffc29598518a18e7cfe9cf37da22a41721816c88827b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tfapyqpea7yq34m0sfusazzkltrgmxxmkczfzh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5584ec812f9b20c4cfc9b27611bdf8b258bd23b2833ee5aecfa6167a63d49fc4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tfapyqpea7yq34m0sfusazzkltrgmxxmkczfzh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a048d2bbc1b51975d1a864cd5d388ef03e97feae42b03bdcf939d21d80c2a3ef", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tfapyqpea7yq34m0sfusazzkltrgmxxmkczfzh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aa7b74c389f3a268303777d54f27733dc5820fba0d603ceb8fea8cf77b321c2a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tfapyqpea7yq34m0sfusazzkltrgmxxmkczfzh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "afc3349d7f556c88f105d5802b56cb4c7c2092258c08197f62604d24c60f6414", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tfg4e2ycwjrstdvefu4l7wjrzvsh3tcp3nyzeh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "108edfaa6537c196a63a71733a3315d411f2a2e55ad17348fdee250ad48040a3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tgjjeh29yzj750s9lxv28ne8c8h9cu756hn2m5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "38962eebc99c8c675d5e7ba5b4669964872cb4c403a1e8f7b62e44cd70409e57", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1th0wdefvlyprm9mmyn43jvxcgrfak525ltyvef", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5e3022995c415db0662cb125f1a8f7936e4ec22951617b999e787156c2ae6b28", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1th0wdefvlyprm9mmyn43jvxcgrfak525ltyvef", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f6222f88502da14ff657aaf27a25007c8dbe5b11ae3358d41962ad2e493cbfa1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1thc87zvjezpy50tfahywrlj8q22zngjyl0qg6a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "34b9a063184dbbe925277c2e9e691180e82b19beaf2635f32f02f9f118fd3c09", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1thc87zvjezpy50tfahywrlj8q22zngjyl0qg6a", + "issuer": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "proof": "61bb5e83bf58fca40010c52127b9b5cf3c0a8081006df00c3c5e1262e6d1b36b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1thlrv6ydfkv544a38p4yny73pa9c4u94dsv5ur", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eeff77504011a58918aac9f2fde9fd6431ce0d76c5f96676a351aadfc27c97ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "4e1bd40d34354a5b2f8e62324111d9b422d6917a830a57436fccf8c6b420a8f7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7f894dc2c3c596167d91c0816bfaa749aa6f98b315e7a5d4585fb7566818a0eb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b196b8e6140a436033f10a7d7bfbc6d504fdb1b206b3261d45719109f82cac9a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ff65438a3b3896a1fe83bb2fc875c3b4eb260a138eaa6cf2dea2464847d26b37", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tpql5qtqxmz4z885dak472wpgl0u4rgethcacf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0dde9bcfc095a506d708049d5f150ad487e8d25c098c2662abd5b8f3ace5725b4e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tpuef47t09slyc834nex5uvgxjpfsw90gg5wup", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "20ae4c9a2dc6ab2e885e13b09efb51c65c3d61c180c2606262f50e52b207a3b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tpuef47t09slyc834nex5uvgxjpfsw90gg5wup", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "24244601d10267560789368252810368f1fb7f6ede5184accb76e6d12112a552", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tpuef47t09slyc834nex5uvgxjpfsw90gg5wup", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eb47c4603b00e6af435a129ea9a5fc988c3f2b94af03fa58be52cccbbfe7ace9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tqtlnhwf8j7xlxj8zxce0u5rnkjsteu4tga5r2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a81a00401ad1c67fe3274b30b6f649513f5d2f0cb8bf32f5740e37b61e7a1dba36", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1d64808ec8ef5a197a369ee77528d43481ec14829a2fb606c915c7adac558e01", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "98deb9a417312d4b395df24f0fdd6f45d5d3e119755e5a97cc64ac4b119e1375", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "aa5a511564dcffcb97b49b66bb8c7e0ac46c22f46c4c80ab12620228dffa79b8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ebde2870edfc8db427614d65bea53c1b99553137c99b469b76a2709150b5b340", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f7dfe0539b0f3f2870c31ffd743166a6bc5e6c3151646dddc321b59df8db290d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tte9qm89ys3e5gztyv4zclkckk5v8x8mhlp58r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d611b2b60e21cf7d12dee6a03dd587550ccb6d291dd6e9a739164307873c5a5d47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "24d37dc2293af72742b01f663975a0897df2f21e14dc8f7647702bd6a0df31d9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "2eb5b9bdcf5b42df229b93a6980421865f002153a5509c764cbdb02c542bc211", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33628bde3f6d0489e77c7cbc563fe9709eb169aec84b06db87d261dd089b6cd4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "7e4cffcf71056dc4922612bc22781a12fc3af58b6599e6e981e90d47cc81e54c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d2fc5d874cf970004d23ba731a8dbd9f2a76bd334cf4c826bbbfaf411ffa1f22", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tupgnsqjdsgmm5y53l4zr4vp3s0qzg0v5p0kly", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e3fb7e5483b3cb0b5b83ddb33e82d39d32478b2c4ec44860212b740169c5a6b907", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1turnr48cfjgxs9r0aem5jju6mdwm3d32q3ywg5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f4adbb53d47174f3e70dfec359e7473369545b8ed6683c4212416e3f735a020c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "024a4d8ff9dc4adb1afdab67b5c1e829920e8e4257fd16a5f2492f9d48a995ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "109dea7b9b84b735f4ca4fddd8e6de6e56d3e9d9556c0252967184edc5bf79d6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "19e1d9c75ef2acd6c1cbd95018e62b16003cfbddc19ec985626e6de44b9191a4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1c8a668c85536d44d834e5667f07870d39292c65588e4ffa445567ffda034acb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "25e4dc5ae74b1be99ec7b6655643659d3685982ea92018dd6ee71099d27474de", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e6b9f318af6098c3cfcd77e46672c76251b19048402774626b7a587b0254ddc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "353e69e258614a79e27e5853416aab98d10cfcbfceeb020dd2eb9c5ac5955908", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "37714bd82436b42472ec496d70f3a00dcc5da8d5295ad74c927cb1ad1e5fc8be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "74c35edfa59060a03ef2f658399b87752617f45f2829c3d24b60362c51671769", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7637e4eeecdd59dfb9ef6539edc6c5c0c549d7c18a7025024886b6ffbb414614", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "79fdd0ef321189f29869013cdc7865dd6e8c7857fa219c8615ebcd2311c4888f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8b4f94ad73b14cdddfb54af77e500c0b7d2e8de75cd275ff5a39c1df0de165de", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c037a665b6d97a382e4f33fff38a56cec241bd52003a4b3f3e260c8c502162b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c4df87fb6ea15e470838e9cdfc74d9568adf9c017ddfdd25d4471313861fe15", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "974072957886103d61fa4041aab33b77c79aa1b2c0ebed1bce1c10d7143dbc1f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9fd744a72ded3461e33a58f75b6092cf0c3a24d47a28faa8dc78a7448b520491", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a63db1247820e207c3b8897771387b62ace22622dbed152b6dd9c78cd61eeb06", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ade97e5fbf82354b6e07702743b72034f1cc81aadb4e9025396a237661283ee1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b1f3eddf02c4fab1406387fc89eefc61d06338cffa5ab7569eb1f5c4c19cdd33", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c0bfdaedc4deb16bedf467127e130028bb634af841aca0c1e5064cec257ee1bc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c451cac0b95009d9870ff03ac0c33c090fed0b8dab95e9b095783b75cf2a556d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c983938d062de636e59824db45d2449eccf0badad08b147cb7ae86e94d62431f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cd7acc099d4845ef4f3cc96bea78fb94f3734ed6df514946ba7e9c116c4e7853", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cdc9bc0793bedf9d2d277c8d3eecc0edb3992477d41090f2ae7d264764900029", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dc37ca04940fbbf05c80c91774d451a6a8c871df06b3e526392f409a584f88da", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dcdd5b3978a1921ca9bad38643861711d4c906d7075a03dabe5b050d929a8f0e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e4e8225d9480c58a94107db51308b96023e78b64a7fcf3bce2957caa78d2b929", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e8d16fff381b1d89f44a6788f54e39ec95ccfb5fb968aed52761c6de915d4b23", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e9c756d664d9821214a078fa06310d61ea8d644bc574e2c0f909e624817a9a7d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ed0245622a9839e17f516c59091b3f4b365030a605c95ceea91efa4d670ad3f0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tuwt9069es6n27vf8l7wwe2u096l087ytkjn7q", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c495aa0c60fa89926f6fc85dea33465ca2b67e7cfac3eca42578f26557132191", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tvxdr4jla4ezxq6m0769pawhlqtjdpeaygynqq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "26b6db861324b257a91422d1c474edc7f852deb85d4e5fe050ebd8b5122e912a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tyhvf09yyezplp8fqz06pd0w57e79v8nkn7tam", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "43a3c468d07c99b1bd666747e9d6d2db90e5f2819b489ff8498a4ea38217f396", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tyhvf09yyezplp8fqz06pd0w57e79v8nkn7tam", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "5b1480b683f78240fb067ce787a9ec916596253c3e970bbc43f29a232681d204", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tz4hgpcf2nxxea05tjmtptw3da3a0yy0g2hfgz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7a1248251edd6347cc4b064ae92ad6b421b78716b4b2a4ba0776ad9eba3fafa171", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tzja67cdg77fcawam4jjwe3wrudlm08khw5ssq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cfc70ce644836240aed05f4f00a7dfe1327d6a40bcefc3df3ec99ba429f504ff", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1tzja67cdg77fcawam4jjwe3wrudlm08khw5ssq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f1e979db1e9435cdd6f8798609e8cab1cb1639b1217eb4435b51701781f41caf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u27rf2qpev0zsvawu8q8heqvrahfkttmlca6h4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "85fe21fb83c7b0cd846e5f9b0775bc0847929e38dfbc4f1ed40d4afe57ef2630ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u2xq64xh045vj59r235tzpz2pzsrnfetnl5sec", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ae02a5fcd704b03a5fa4b88865e5498c69713da8fcdb7249b5d08e742eef731b3e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u2zqsvulc2sf9jgekm0zpjt2c7vy3g09lnueg6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "be540b067829f734e22fee774e71bab6d14acc57cf9d6807dd10bd9e100f86f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u3jsr9y6ek9jllqgzf8ywm6hzzxhxkjlphrzz3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "25c818eafa9c9b0ed368e2c8d882072547f6a66554b53970c1bb833b86b7a3d8ad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u4g2pvuq569gtcclvnmrwxek9hcpzfyscm3qqy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "042b4752b12e48efc0acda9b578d9894985a9d076f3bafceb34870a39d84fa9ecc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u5eampxppthysjunvcqlxhmd7d0la62e99manv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2eeace1dc287898ac5a4725682887d56157a15d2a2a321560ea5d54164b1e0c2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u5erkaezvsmdk5rccjuxrleh23v9qmu0k7r2r0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "db868a60f0273a7e3aca709ed263e7585ad9ab2d98d1095c1827888fd546effdbb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u5zcr3jx75pz2gnajhlrh0v8vf4k0zx637vr6l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1c545ff87c7c6fe40451a279b4fdb976171f0cbf3973ae3d46404cbc3e2a418f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u846hgac04v95xltz6mauy4p02f6wmj9e6q8c7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5b7bb3d5e95df6f2e44b26189ead459253dbff86bdbf3212946fd68f936711de", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u846hgac04v95xltz6mauy4p02f6wmj9e6q8c7", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "8ca0e2d848fd5363cf5c26caf238149e187e6987fa853b161b6d65171f44d956", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u88djd7v2gekzk7cmqyvmvwf02224fcr92as0x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c9a136d0b9375da2df06ac1da0ec59d2a93c96ccda7585cef15eb17fc746510c25", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1u932vplea0ks396czse7xsvexejqdakryy9xzt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "75e3bda8c178f2bb314e17a6ed9130bc647b16ba19c58cc465689368941cfa2686", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "031127f833f24427c904daff7670d0bdc0941bfc03e58762f1ba938cc0820031", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "463d29c46b69db22fdf9ca29ebcd0daf290752f1e43487f3c3a594fb458dd02e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "52ad54c003e820c157cb4a0ff14ad1329224f9d5614ff5f28c4f12411f7ff7d8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "85233e1df9118ade0657edcdd37aa1832e2f16e97f861dc412a4309632b7ace7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "issuer": "shareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "proof": "bb851412b85f10c98a61bb337786d32f1e7abb00c506c08f02df702fbefe7756", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d8a5e17214421b1cc96807edcf7cdf435758be71ceeb2d945e6767280a2fa5ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dacf26f3af697869106c66d111e1c4b4d602f7aac3a1da6652bf8d6e49652c88", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uc5v4h2nlwyf43jj40743xf9wgchrqr76tk3lz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9fb81034303beddabdf4893f70bbe957981c65f3120f2febc75f2c0f33eaff93", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ucqn8eyskcr60wdqcwzvzk0h5rmqg9w0z8u6sv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "493c24629b836dfd3d445bc8f750741bc86efae160f3bd60d6ba4cc3a16748cf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ucw4fvxdzasgayct0yxgjgz3r74uzz3ryz54xv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "469d8588269bd4cf74445de981fc6473966553c0dfb174ce574a40092313d94d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ucw4fvxdzasgayct0yxgjgz3r74uzz3ryz54xv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "91e7d3406ed2894c96f18a817f89cab0e49bac8e6f3f5b3119e3d2963d231244", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ucz4mwqcqwmfqnz3ex3hz69p6ufu7u5hcymynq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "68d583e0029dd870a207abb3752f053442ed5d81df2a78b62b17ccadf20d665aba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uehnymt9u8svvarzpf722e9t9t7p3f0dugl85f", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "6070a0060e2562185a43f94ac2ef270279884408807cc5d4273029dc1fee814d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uerqa59yqy9dckqppqvaqh7mfj2rf276zcxaww", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "47db16cc9d12d500a49ac47bf5a3fa9c6d75aaa24ca5ea6175d336147e292844", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ufdrlsrt4cpzvht8gmcfqwefxa0q2ea654w853", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "14945b2b7cb9a1f97795b30a0341524e69d7a14a0fe2ceebed1f2b69e17b2240", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ufdrlsrt4cpzvht8gmcfqwefxa0q2ea654w853", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97849bf50a03069681db6266be9831795c34817f9a388cb53b6973ba4d7dfb2f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ufdrlsrt4cpzvht8gmcfqwefxa0q2ea654w853", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ec8829bb6dc19962d160fd0955e5a6ab4a8f162c4696f3e53a772270af84a66e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uffha0dmt2vmzhw6ukd96qu4zxsqs0rdpw6ugg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c4635361a89bacd0128f97c109bf1303dad03881e4c63815fc8e8612c20518f1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uffha0dmt2vmzhw6ukd96qu4zxsqs0rdpw6ugg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f5efbf769791f9e830cfc958e85558c467d422428f0f12cc84eb63899d0f5e58", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ufmt79d7vh9qa35tlwwmlzdl4ps5ne7wcr7cas", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8858f4ac59834fdc7cc46cbaf9fd425c0d4f010cce4495d2a9eda829d0d5a2b2be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ugd4p2pyhrf8ve6v9l4cxs6n5qrfrxcpthmkep", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4d9ad8f0c7aa14f7cb4e873879e5e311fdef50bfc12bf3b0528f6c3786b09993f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uh2thqt6xgwkw879kh0l76eee9lg59243qaz4w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8e19ee645e5077f06ca84794a500b1a178111443a4049916deb0a9a7f1fa49d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uh8fvnnv5c43z4d7k2h7rpcunuhhlnq57f2s26", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "99f8b53d9c2f6a6c2f8f304b49de9df45b87bb03f038ad786fad6d6fad4d8a9c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uk8750mlsn0fg5xtzcq9ulkvhhrj78e2ze67nl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "184b90c954f43832ab0d9866af52174ce6198b95959b31a9022399ed2a1e4dd3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ukyw0n8gqxf7dt7eafgrvyrn53p7xqjs3akt08", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a911e4e6e80e9e941dd274d96fb7216d76355caca967d68885922c05d83fee2e5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ulehyj94ngp36w687gyj8hswpfcrtr7mawsmtk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "270a7c4e0adf4ffeeab273533287e2a49f4b01d0113777add7653ec2ca9a1e35", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ulmfvmxqu3wwnpw4vv7fndlpn926evzg64crp9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6a976f70e9d0c4509410087900e2509c25a3a63278c4b240d2ba69da65341148", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ulte47sran58maath572qcdqkln9w0f36kwrpk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b9b1737c9553f3613a17e5a91602e1792cc05e6c539dbbd52d869ad9ee52058", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uly0tnm0vqp7ny2zdvuphgchrdrxmnejehxjv8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a01c98287f882197622ac4658e62421e5a3e58befb3b42f7208229353dac51f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uly0tnm0vqp7ny2zdvuphgchrdrxmnejehxjv8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6ec2eccd7c6d3d1ede198734db07585569766de6f86d1ff2692b4f97ccbf1d81", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3d990f3628db5c7ec6bd7969535cd732576c5994cb0924c56df55012bf09816d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d1fc21314b911728cf066b1bce4a204a9d931e12a0fa8647070ef1545fa9a539", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1unumxvyvsgkxn3s9c0fj3f7thpv2j0v5z0d48x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "09f61cd435bb6e5a9f5b02b169dadcbe6c4e912eef2349528a3e00f4650d5e782e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1upd2dv2c7t83tzcqky78ntsas73luvn47q2el8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "327b204c3285c0c1372dd363c910f2a152d56a34c2ca794f7662a59d72497142", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1upd2dv2c7t83tzcqky78ntsas73luvn47q2el8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "607a19f5cf85197e5a7c2e101a95e1475438c2ff3977c4d8bac2a0f5e259fdea", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1upepyk2nvuzm93jtdhdjpg33qqxxnjsckgpp38", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a181b0ab5631e4893923441b83bedcbe6d3ff2538d77191a9c714175f3b3f2db", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1upzf0vswhnzscdhll26uf97zx0tnrchsmvs9gn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d86767363a00e96d65bcdf48c16421710e8203651c6344babf1560be545a07ac82", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uqlue2e7lrr8j4dyxkcrf6nuq684utlgrv5ehm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dd6dbda45120eb03105136f27b92c972134f2f8736414866020359b5a27dd4e0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uqlue2e7lrr8j4dyxkcrf6nuq684utlgrv5ehm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f5b72b0e00288731d0694648b9a7178ec76355a5424d432f0422dc7c89972350", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ur3nrdz37j63zkkvyvf56d9nt8cmsfvtu42lq0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8c1d51b4b6caef9e3ac94a04eb18bc0dcb0be35c417595d43c6e824cb18eeb05", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1urn6au0uf0ewx7sa78h5necraqlzdqa0te4dtd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f6f5633218116015b9805819babcad213cf933c286ca794655a8affe4652ae3e3b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1us8f8pyewmdfgrqjwda7g04jzck8gjsc48z56y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "be894a0fb2e422800e45527787f4405829683bca445cdf5c3ec49bc34182110084", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1usxpd8zwrcw6snhmmjkth9rt7p4z7wcm2yqzcz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c6dd319ebb7533ac273afd19ee697faf33696186b92291fb647a51d1490c4efd99", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uszpjyzvzwjm6zxuchgeh978j36sc86yvxak6u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "41d6a99caa0599ea7599d237412a3d36e78c307bc55536302f903f63713c2e10", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ut84h7depx02ytkv6vtttpf3m8qt4dtmefejk7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "70034c05c98574f2b3025e31b66efa9e96e0d34be91eec97fa4c7c962eae2f0a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ut8vugvkyry98ka0ezdgn8yamaztrayu4j2ec3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2934350030c5b1fa3813bdb4f8934fa7a3afd1ecc17a9a14094194a471e80930", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ut8vugvkyry98ka0ezdgn8yamaztrayu4j2ec3", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "4243a9b91d60de7ad7f870891a39c328336174f0ca432feba33bdfaf2ee8963a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ut8vugvkyry98ka0ezdgn8yamaztrayu4j2ec3", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "64386f937d295feaca32870da692f86264e9188e4b1c0b28018b8f3fff3d5a4b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uvgyutaeew50dszm6v0sja8cuc2hkfef4pgd6g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1ca0a1f8de36aec68b51f6ba8fb7c1a0b9482216d2c4f4464e3b8c1120aeefceaf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uvvssu8yklvex5gaq80qgnr0keq8682d84kcga", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ea6222455fd02393f5459b5df5bd406eed7361af34626cdf5db6c52feb78ae51", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uwlrrzugr69x9wvh2na2c9c3atx8re0pq0pj04", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "91e4ef0f05a7f1af3ee6770385e1ef0de6cc44dfb04803ac61ee9445fedb378e45", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uwxsrk2j33lcp00n5xyfcwcu2d7hew8lwuw55v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "93921646ecc4643af80fd56d67989692679c83ee4340d53dbb4ab557f6bdc606", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uwyag603vjnxhtehe83qua9n0x9aztmkk9ve23", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2fe88c699c43951d10c02e20c693c08a678f4367d50615b8871cfd9033234cd021", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ux4m288agwel4fg7vhesmuyf286qv9v7k30vk7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d239085fdd455cf5fd2ef6b95a72534962737f69ef3a287ec3881f1e6386fa9b04", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "69036236d5bc1b7404ec07171321f0ae6f6273b4f1072778809c1937ec51650f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uxvnd2cpx2dwszd833e70phvvlce4zrv32d6mt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97c333fead6b9c1700e1cf85caaf1815b4ecacf644f4698d9de77b545c52ebcd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uyz8t9eg38zwlmjyy6me52uw35lenuqrww3grq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "66d6401c5a737bcacf1fa7cbf187664be9f2ed0e1a133202503303400e34dea851", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uyzkqh70z5kvt3r6rf74el3l4da6ea49pauw43", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "97b43f15b163c7b5c58f79fdb15e29c530dfe18160688c48a4687bca682885413a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uznvuenlskxa5xrl3tpelhknprc0u07nyww8tv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d5d3fdc8b46638c602e5ef4359cfaab2ca8d1bd388eeddbb40a9502c636772d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uznvuenlskxa5xrl3tpelhknprc0u07nyww8tv", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "ca794661ab480a9001fecec623a4d4e6c14375c36bddd52ac0a236834ca16b2b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uzsql7rxx5q7l863e9r3dmgmspxxmdeym675dd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "07f7b37d4a1f2b6fd4a817866d8af34abbb40a03c687e03f63ceda062fe3764a16__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1uzsql7rxx5q7l863e9r3dmgmspxxmdeym675dd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "094c61766b13008016491d684542a830c978d82d28397ea84cf734f7976d66e3ca__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v0ksg9rrcrspr0dplylp869gnfxhcv2mn5rr3n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4424608a6b374b7958860d097bdb64e7fa93f764d8f95e83c36331f280a56dc6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v0ksg9rrcrspr0dplylp869gnfxhcv2mn5rr3n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4df3e75c8aabb1ecd4d1359bc298a423e4715d55cedb68a7c838e8f699fcdf51", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v0ksg9rrcrspr0dplylp869gnfxhcv2mn5rr3n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5fb5c2c564a93c10240faa89e1e74f0a5998681b997770919a2b70959a8d6e69", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v22wed4tvn5kfjclm0230xx3544mjmd0e6k5e4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a3a1b97eea34947f2a000e4a19c9285381783fa2e01cbb01826c9148b317473f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "issuer": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "proof": "15771c43abd49f0be19310f27c8b914f06cefc9d7fac3dc0701ea0afe5d135c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "252c84104d4d2dc01a3f485170be9b2a75a0092950a74863700bddbbdec29c36", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "issuer": "shareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "proof": "7c51e66901d48d69ede6c5541d7bcc8e6c68c19cd726fd3df1e6b756efc1a014", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "issuer": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "proof": "bd83144734aef25c5fd393af247e2675d403b2cc799f911b5bb247687636487a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "efddd776f4f1422a376521ca9ff946222e49c24ad8488512d63758c16a349050", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v2cxt5hwtsdlsjc0sgkxwgj2c46a2ac6jmaryf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "40c67743cdfff9b07033caf43e9e3d1e6362dd70bfda3948456cc3409771c55f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v2m8cyzccshkr8ptjy5wsmv2z3h5zwsh3q26h7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6edac2a2cad797ecc8ebd80cb8c3e51fd9133324477bb7f8bce1f6e6cf7935c3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49e31e0555c93817d015e146bc6b0aa5768bf37626ae2b627ac4377b8d526761", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "822e95cf4fc46b81621d98f071e8eaa25f3cd58c89644be63a349f95fff5ca21", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v6x0gzr4qcr570syfzmd7xcd2ev5fpyyzsnfl6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5d27f1656893dc04f40a2854b6077ba975298c50e0b9e945c234dec9ef44b407", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v82ae2hsgxxztxzr0n380aux4546xerq87fdtv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c5911d5415d66a2680a3574788b0252ebedb3010f578b61271df6fdaf298f28172", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v8cjs8xkjn8uszqd0lmm56e7hdj8dyzjlsdgdt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "05cc60264b70455577b2859abd678cb277ddd251cad46262bae174f3eb7e8201", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v8u8mt7m87pzymzls2dav6y3z82nguyd52gpau", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "38b46c3b4838becec9559ca2f87dd761be1c908e65ca2e4e143f5eb709ed36d763", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1v8vw7fwz0drl9gc85evfn2xgarl3ukstrepq6t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "83b31829a94ff752c3ee32715c511bd9c28146100c49f7fb47d7a3a59f9b0f6319", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vcuh3kvn2rc9ffnhnuhfzn7vge7gjets54fzmp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3e975080a1144dbaf54010da381816dbe0dc50146bf3f8fecd2568a06821739e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vcuh3kvn2rc9ffnhnuhfzn7vge7gjets54fzmp", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "da999b5d353a3ee55206d0811db10b65e8ecb22d6c3a5ad2340b034174868351", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vdzm2tfvwwegtk0j6qyu8v7gusak8uxngk5wng", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "de49468c72583437b6cc9e2b00cee19af0b02a7cae30ed3b72d40e448dbbf5a321", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vf57yzws9tn8qcfdf6cjw0u47x4e46rfqeldvm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9324a1e32ee415b45212f05e3af990d4b68775c524b2a725c621b197b750b799", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vfrh43z3hmygdl928ujtd4rglsluzmh2aku6wr", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ce7bbadadb6f54fda022a3cac40ef6a11e2a57b6f185837740445c805641f37d18", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vfyxtu50exhussxgl7uhlpu0g2449vrnkhf429", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "eab6508082acb575a4df8805b2635a2fbdbcbffb8c6beb9f0497f4761978ee53", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vhkspy7lnplcnx2hf4m3ekpqz9lhsxcvj5x42e", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4d809c8cbbe168296ffbf8b35d335bae6fc3378e4a27d9adf8149b4965a54e79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vjj2ufstr4amqr6pp25ywj8y0qaeyd8rc92as9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6863554865c89f66dce3ae04fad66aa310066c942dcf698bf08282aba41fca5e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vjrqur33scq29s2zmek99rm3yck84rq2dkraxn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0df43c1eb435d6cd86947599a6600216bbc35d8e8a173f1fb5daa2dc2ba6f201", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vjrqur33scq29s2zmek99rm3yck84rq2dkraxn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f23b077d977b9c81592e43fcc034e3e666211630d307d8ba66925948202cfd5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vjwsmlu33vm66vsscuenjnf6ajsspv9ge2keg8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3876c434b356a54d7d4acb26bcd64f3650e42c33a4b70a5c50ea5c0a0221960829__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vjwsmlu33vm66vsscuenjnf6ajsspv9ge2keg8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c0277a4aecde70c8c88ada5bc18bb80f50b4a9981504f073ee1f73b8ea950e808c__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vk05fvpa4jq9p20kw3dxx4c283xal8nt62szkm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a14fd693ac9c5e5025545c1e4a97ab7e2330d9a4df5bf2b5ed11646e8ed49b25a6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "13867dea7dab4759b1fc0f1eaf3498a05c8d38a54255673b7a39a36fd907db97", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "608a71d86687775253d6171f7b7cd5d7e5da2b5bac6ffa9c0c830a2028028ca5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "610d8beb870871c0364d2a6d993aa927c805bae30054f1d4e8397486169a7a76", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "6867302fd90467f981673c6e266ce710abb5641acad50e5536bbeff0061b733b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6887dfb6a5f98bd829b226ea59341cd249e7a7c31854cac6a5f54807dc048c70", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "695d3e2866cf7eb0e5d1873296ed4397fac7ace02ad3ddaaa8b3c332a77bceaf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bbeb59b1919bf5d7170e082aa918b805b10f0c03796ede967357f55f7ff3a422", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ec52f8ca19950e0c67b43afa89f6e2abd5194d3cab9ed9527b5bcd7d1e4fe20a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vl5cu8qrakc9r4w7dpsa5prwqwv90j8lufs575", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a04d4129c51f4c61bbb5762613edb26c86cbe61a66ed0a0fd44160b503e69f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vl5cu8qrakc9r4w7dpsa5prwqwv90j8lufs575", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "450c22da779e34c9522419b9dfdab42f10234425cce80d11cd851e58521a0220", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vnm6g5f3ng3kd3em653c4vhxjyn0s6l9fmfa0v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "01ec8f026ec586282b43038a33dfd32cdbb88e2cb8a13a370120fce6a21494a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vnm6g5f3ng3kd3em653c4vhxjyn0s6l9fmfa0v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "411dfc82eec346a7416313702778c3b3e97aa3b8d8ea9c6856ece57d40ec7f66", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vnm6g5f3ng3kd3em653c4vhxjyn0s6l9fmfa0v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "572f15b6369b91b34ac5a4fac9ced0ea48695808594e0f36ab2699745e910a31", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vnm6g5f3ng3kd3em653c4vhxjyn0s6l9fmfa0v", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d5a2a6eeb37abd4e46eee0f31fd9d79b5a74ca2172f6f7e271afdcb2f924edf8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vnxjhsesf9qd0w7g9etf2azk9srpd3t9pgr47n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "22653eb54bab51e878aedd5d952467188707ae5c2ac687c82d7d905cd3308d47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vnxjhsesf9qd0w7g9etf2azk9srpd3t9pgr47n", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4618b04165b565decd62cd7e338aea574f474fb7096d82c9220e88ea2a84adb8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vp8szhyzwyunec48g9apw3vnr38m276s8yfsh0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3ac748534e6e1fa49c15aff6a53529e6105361052f25a433b4c506853b41b1bb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vp8szhyzwyunec48g9apw3vnr38m276s8yfsh0", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c7730ee03331eb7e6ff03beaf9b15ac0a6af3cc60852860264b40b34158b3c29", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vpp0658df52rmjp66h0pzkqy48u6pwkkvvxky5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "95579f41938c024e53a397d8e33c69346f772776e31642e5172547a38fb037ce7f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vquyutfwqnur5w0v9udcae69n2y2gjqvkxkkr8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b23b0ca833454fb1da13b81620a4ff5ddc7dc22bf678d80090e75df49d989b97", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vrjp4kxcd2vyjfl27dp9pmyzcw28nrddhjgknx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "36b3ac68bdba34e621256997143dfb3862be675aaa78de9f1332211f819fb4dedf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vt9cmu30jh0tz22pxps729y868adknhnrczjsg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c38da8b28bf503b62521642eb56e91cd8c69a9998e856630b770b8e7d20aea91", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vt9cmu30jh0tz22pxps729y868adknhnrczjsg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "daed6f27bd3a047e869eb03e090a7ab26cff289f714e7ef17c9a5d1213e22bab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvg3hr4ax4r7fz72ehg3035sqhdtjnexw888hu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "33e935190381ce5a996d1f325b207208b72571b0bb705fff85da4e365dd336dc4d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "21e5a9dc94d0fe5a3e82fd9b6f06b3093d4cee6849b641e34b1f1f56cf0a5708", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "proof": "35cf3adeb5724760ccea1cb9c09ec4105badb5baae60c8d35cb7f37ba10fecbb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "48a0db84264ee7672026756163dac6756a2cf5a43b7d6e5c4aff5fb5e0eda06a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "proof": "5cc863ac2167c549d0583319963154c680881990b61b8cc37f45d11754a0a302", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9fe8080a897fd3836137037a1ef6a0f34a44e02bd6d73a9422f799fd86dfb7c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a751ae9ba09cf172481660f78aa0f0b5df5ad484500d1542f6afeceb620732ac", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba2c4c98d4d8010a20cabfd83471dca3ad1b52275bc5797f735009a8519b548e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dbb570fd4eb1c48ff48add3d9149e042a080e68e5b0362277283853fe13ded89", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vw0gkxf8v4c0ghg44rpav72p5wysgnc0mu9jmy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c7f0fba0aeace13abcaf0c0be24ad23022ff6cf7b7c3bd9086a7c31ee4ced10a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vx8q02enr4688mx5vgvs8hh90wap2eq3nnwdzp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "162f4e2362a864ff54258ea4b4a6f225b072e908b12122ae6242d217ed7b826a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vx8q02enr4688mx5vgvs8hh90wap2eq3nnwdzp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f889eb621cbdaf32e27ea9d1f8e94e2a41ddeb13d188a664919fa1a40ffb3e19", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "19d26848126d719c737598d257db6434398e05ba628e42a3faaf9900f4f0e5e1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "35e4c74296ddad0280df21f275e722fc74784a60af320a3efef6ba6ca8a687d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3b69b6fa0cc4c80ce09fe1c0a813fae81cbddd437dfebdc1fb513980453f46b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3fda8766bce4e3518fddb9822597a7947b6e5e4772a10e54f1217fb413651f50", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "44d4b5cd1912ffe6e53c0154e894243b9644548e061103c2448005125323945e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "850bdfc698a2e61d7369ef2c167cd20a6bb753ddcbe1a3d9a709a627aeccad4a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8890c1b444ed12bfe3e3ecfcde8ff5305d40969551a43f714c977e09f0bbeb15", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8f2ce39fd249a72f250916bd5824f047fbea188dfd6876b9a317a6ce15b2e4c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a004b5c886276ff163e904239f92a77755a3415386c55ceb8325c75d662bba0a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0469659a1849869b5da1038ee5e96ef0dedeae0306f7840746dfe65da826424", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e4a06b07f4d4bc711d95aa6f0fd2824f83fd68b7ef5411c3bfb41b457eda58f0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f076e165a6d1a9f96b6ca41afe6d7601fa4139933a8190a96fb4c384ec17a6df", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vy0gvf9dzypa6j4ycvf0s4tsyglyqnlcf9dxjf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e5af307905c89fdf1d2ed2438e4d719fb23e1f08c95be045da98084a1d438d5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1vye93g92zlhvza3295egw3ygrejwdlppnw2tt3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d7a762b7677858305abd73ed3149f58145e92932ae85fc31e5aa2d595eda09f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w20lvwretcp9ft4z929mrshdd0ecxq9p8vlzpv", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3df4514dfd175e916d227cf82129871baf80ecf296caa45fe220461421dea0051c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w35ur3z0wumtseekl2xqc3knzv67ynem9gnrr4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2041247925452a817b75a589451bd8b8dd54220ecff1228fb147b5716a72abb9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w35ur3z0wumtseekl2xqc3knzv67ynem9gnrr4", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "a9057c394f5f0903eb21ee7aabd12e98b4a2aaf67683b46fc34140f7674730d2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w5rjfsmupfnyhj78xqf3hd8k3q3vptwgkpdp0t", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c00540f7a7c7bf318eed67669660fec3bd28b86d1ccf85a3af2fbc399af38ddfe7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w63l5va8m28wh5tuvwm2n60h6ej3n55suajltt", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7d1dd74010335082e20037eda622d537a6234e5a662e4b17f29b8e1e2fe6e36f9f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w6nvs4zzdf8qc9qll60h4faqmz0t7yqx2p2867", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49ed479adefb835483ac0f4e66dd9b7d792f0dea57857017c772cd080ff005c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w6nvs4zzdf8qc9qll60h4faqmz0t7yqx2p2867", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a36e6bec1863f9e5da3067e62a1da1de1a52006c80f3bedbd7032945dc99be1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w78zjh5r4y7f9hz3glv28f733v6sj3he83jqal", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0fbcfa09c32fc811f5884461e535afe7d73379c62f1fafd8b079135af2161bcc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w78zjh5r4y7f9hz3glv28f733v6sj3he83jqal", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6c90b6db4ad36e3de9ca4e7fda60983a44cc45a28983afabc93ef50936568132", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "270165bb225e5c6e7b4f0926cf7578f84579e17ebe90f86fe62bb62bd8c75a16", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "75e38398263d6766dafa680f50604b3e6deada96b3967245f18280a9698fbfeb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8cdbb1524a0151c666814821c628a9ce897086b6bdcd6669f983e16e680d7bfb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "b036d039ce5ffa8198eb60573f95fa35f4522ac286d6063e572661ae56691001", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "bc3d5a65813cf7042ec7cb88300163fcda528747988203f395af05c1ea2ded2c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w7tkc3z943mj7kucvsylkzsk05x377z0ym9mhp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b41f6feea3c5352f0e09678d8e93598feca2dded1d14d66577d2e46c88f48709", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1w9ae3c6xvgzn88zdy8m3vrgfa000854n6wt040", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "24fdc48247fa78cfe1e24c480a3d3168170a34d335501e8dbe1da082a80ff29e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wdrnu7wevav342wjc7xz09lyqt0sjycyud5ujf", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e2192a413b4cd3e9aef8942362a88dc9c1e727af0484d9b3220c2d48332b2cff9c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1we276v92dedwz2wccmc2ghse5s63h0s47yzyfw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "95cd649b632dcd2ea886a48b3139e699360464b40e20625f801ceb461b10659ac6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wevrujawmm5hy3kh8y3ymflteaujxt8sjdpr3f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77dfcdc5a48e7d7d965b8bf6dc65a9ec7b1e25cdcf49b4c2d24dbbbcd604b234", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wf0dstk2w5xz02usr9wze59fz2judc0evmx70z", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "91b8460bc87b18974bac2a25b852677c64b06ca8d77c0c5016d4849ecc59f67c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wfm4uu0x8p4eucazjcgt0syww8jrpu6gsm5wf3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d5aa8dc97144cd127c744ea110bc0dd2ec1f67523bc4b46171375e02f0c74aa1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wglpw407n6fw7yyeqnq6v2aa7frdvns6lzc7cc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d761eda44929356940a3136af5623deeaaa0f466564f2cc8de9e28ae38fcd1d0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wgnms32r5xcv8m9zfequxfv0t7n0lr8xv50jx7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "68bd36d9c74e0fb70e9a086f8b121b6cc7df8d23c7bfcf86665ffef2148880b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wh9g0534d37t8mh475cnqkr7w8yl4tml8d93l5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "269185d5652d337c24824866cdd4ad1955e8a69b806ba4e2e70c4b549a22a76c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wh9g0534d37t8mh475cnqkr7w8yl4tml8d93l5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8ee85b506bde826444690606e9e1422cd65053a53a5eba7d58e4de0231aa294f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wherq35srvwetr6nd8hssjje3l9us7kercms77", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4a85f0f3b279f45f201a3c30f6806866f2ea513c4b4e7b3f1060f84f01d0ae69f0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjcdl65peaqj3wupsr6yyh0gfj6l0r7r06sl74", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "88e089cfa849c420891bb5fb8d13f09bf2927e2b70d9b717b52c988fbf284075", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjcdl65peaqj3wupsr6yyh0gfj6l0r7r06sl74", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "c3d97f80974ccd87aa718089ea9de199169977b894b1cd2fbc00715a1e633fb8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjcdl65peaqj3wupsr6yyh0gfj6l0r7r06sl74", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "e155c52ce2be3a6d1327457b52ff5314c7363f491008c38f409b63e168b918e2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjlvy2t8xjrnhnnpugy7kn03ftmwv9arec600c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8ef13fd913cb592117dd998a512aad29ce21812b0494e5f7f0756c1c1916056583", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "0afd578cbee317f9a451ff931508e234df414ec5221c9205b74e31457097686e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "18142b8faa3d399916b2c2db9037c71d8ee39723e6668d598643129324d629da", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "issuer": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "proof": "222eb24d721f191a1497c8cfeb32851bf5dbfe60a03d5a5f1bbe4ab1cbe3a6ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ba38f84457237e224480c0996683c717c9a75d9bee0b28ef1355776269f7c402", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f64f9472241c541c0ea515aa8254bf11ab63903ba5304fa7497ea926f6b181f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wk3zx3n89fj5a4wea3rs79688vdumruqxnl6zk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ac6d04e5fd50333c711f54571c4de587395f7dc5610be86df7ab4d046cb3d21e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wk3zx3n89fj5a4wea3rs79688vdumruqxnl6zk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f327c0619681fdee87adcf1a8207c0316b75196fb66f9c660308e235bef83384", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wkxtlcpaqjej4ytmsu260yr48yjfnkq2a8gs8c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "29ea955f3c920909a7acf582938cf003735452b5bcabe96c35f239eea04b5299", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wled7snehavh60akccay79vzhc8nc5kd6llurx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "27ff6ebf446a080955e9298aed3f975c2ed87c1c646d76860e846410b615b350", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wlygpu0pd0fwc6wx907dd72vfmt5mqgktq4y0x", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "shareledger1wlygpu0pd0fwc6wx907dd72vfmt5mqgktq4y0x", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wmj6ygxm0crs7mwd4wm32adh9akrdskym3p34a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a01a7db7280e77e8a0e52c92394b98a5ade3eca6a5dfce36ed3d83c14606aa55b0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wnetwx86duc3fddntd0hjk4m45f8ehzl258xsw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a599a45dd802139dbdaee968afdc330b3d11d81fb6c6af0e57f3f3d02281a0b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wpukjkvpp0zc36anmpmrxpdh9f7wzqx9sm887u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a1ca2565e80ab91728df944f3383ffed9e0d8c5fa77ba75f30e3bcbb5ff0b8ec", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wvmgjgn9rzlszw7qpfahdw77ppqzm4j4jcyk98", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "51d936bbdf981441e89570b97b7680109196e9cc5c6d2c93cd3cb65ee13548d055__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wvmgjgn9rzlszw7qpfahdw77ppqzm4j4jcyk98", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e8e2185c560005c6d6e0fc734ce8a9059123d6c78dece22b72598cc7e3883fb76d__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wx02rrvn52lkntscpvuq7ycte6p8xd4gt0v0ed", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0ef038c8d9c5ab2c7fb34df8bdb408156690357af3c757db35c0b477688954ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wx4ktl9tycewavrmajqqeycds9ddm53fpcdxe9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0b014b79b4e8810472b257a0b77f1302f94247ba88801cbad32594746622fb61", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wx4ktl9tycewavrmajqqeycds9ddm53fpcdxe9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5a1c679c84da76657ff303b782d9fafb26ca5fdf8ec6ed9c90b6a9e7fffab096", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wxcxjvqcplcyl2j4ygmxhvpd6xl0datgg3j4rn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0f169c0d7f12008f7876a296b0ff0b85615ad904b838fc6df63518d3b18419cb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wxcxjvqcplcyl2j4ygmxhvpd6xl0datgg3j4rn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3f80843c47ae3a1b40970880a6f24dcc483e27c261a8cb440de91cceae8e0ffb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wxzqrqxhfkeh2wnj27eew8l66zkn2yn5um235u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e4b9b224ea356a488621e58123ade802b2cbec0b40698fa51614e9591071fb42", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1wyq32220fe6gw0heq738thp2r948x6rwn7vpva", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d9297c3fb056cf76945052ba4756a658572e078bf0609c39ac54ff36639d40a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x0kkppd7hnmyqd55k36pvllpxu6kpmu6wjmxrk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fbedf21c4309dfe69a7d2976fbed098b7fb8022a40e1f3accd2b05d9fce10737", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x2d2x2rvumqm42cu65693ywrudehm3pq53ha7k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9990f9dc89c94237b3c4c1581e3811720f57a6aefe85b72ba9fa43ad51a54ab7f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "03283671ed07c2e98cc96bd16d4d7d0a26569764da76bd1477576cbc91b35dc44b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x6ujm68y0t9sgq6vk2pnxfsmqt8z4zvwdy92z3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4fa2506d3e1c81defe92d9dbedd1337e6aadea08681d7e272ccdd27e6cc71db3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x6ujm68y0t9sgq6vk2pnxfsmqt8z4zvwdy92z3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "caf75e377bdb684ac1d1ea8f80ed144eed45146a10c8a2e5ab4e1548bd6662a2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1212b8f950944d6134c14980b9ba39e0ac4f664bfda18be65bcfce98f025785e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "18062ab740c86ae2a670c84ac7fb59f0f4391be887946ee1824865b27c7cc7ad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "346976bbad290f2be75d9ff76cde6f8a092733f52acf0cbe7d0971653e801a18", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "757faccff90e55f0968c4190979c96b9aa8361652afa5bafcc0c132879793318", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bcfa7f327b908e718919b0f53c633184d9ad6855916cfbcd8cd29870d34e51cb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cfb16f7d8d07c03fe72fde1bd99c00fb2683419b1f587306d0df8a62ff9af046", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7n58v9a5g734nyxexmtvh4pt9rvxywn0uc0p2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0cc954998f0bcab35434730abe50882de5e35fb4a0977bce19fb318407829f99", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "009525f675c1cdb013b3eb4be0c7d08b856a55c831c5a750cbe1248be3c14290", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "04716027010015a560d0121f9423d9ac2a79a0fb518ae7bbbc1726763c275fc5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "083ad24d40beef11bd601312ef85f20ec14f64b4ff7c4e8106646b9a93476c0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "14bd3a5f937e36bc8388208f9219c27805a186b793fc1d5cafb4bb130a033742", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "14cd6329a9578fae3ab8147952d1eacc10496ac4e06d4997221666fe11fbf914", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "19273b3991336b018e92c863c7830f6d39fc3276548256d250c8da3329a6df1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2df458d5b757c32ca5582d2fcd7af87b5a8fef50839085f83b0b5d132b3f51b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "3277559a738ebfc61b385aec41b0eb3915f406a74a05b7f53a52a4b3d756f162", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "35993fa1190b00ba1d5744fa83dca1a6338c736c17d6bf4196d31b8de5a2e767", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "459b9fa339d622b75c476bdf0ce4451ae263c691536fbea173a4d2680c959d4a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "4f3049c5486203af031195f46e42f41e3149d23e51a029dbd327b1bd25cdf176", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "5017c2582569977de3cced16ec9a963803c2d5ebc333853f133e96844fde6483", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "9c0f5ff2dad3aeb6d3619ffa13933f1f68045ad6ebe0e79b7e332909f476c018", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "ab476d9caf0217be4d1b0de125814223a0758d6c8ae9c3815d698af29b1c4ea9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "abd59b81eda3cf1ce5bc065d787fb0e0ed2de009636680eb69db3f663257ca13", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "b3726c91f4fb033406ee3901b17a8db915abeee99c56b5c887606e6420662d26", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "c32d3bea4329dec9257baf61d05135e32054c751d30ab2e6c7bdabc93a4a2817", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "d3a00bfba9b40a9d47931f1165c5af8b5d9e3085cbce0bb0eaf3e1a6f2c668c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "issuer": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "proof": "ff5303cf6d66f33cc9006c42dcbe449b16761b68b9a8131a600d783e25f88d4d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x84n2ujejj9hxjj8fq9vm7wpzfj866mvl7sc0g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "35eaffd33ee10a8d27876f884d04f7c3811147ff0775b04bdcd19925e76c0804ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x8fgctprmrtnazz8w4jrz3wzgv8ruxr2knfe5s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a9c87a0b0e90edb05eae7b7f3920876a600d23767ff9ad0ee4f33924c604dd02d9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1x9keejhhmcg83cgzungaschfwc7dw9627hulsj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2f2cdd619263899a7afc7a697ebe4485fb75fb64df44eb258e313ccb127301326e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xc8qwdcguxgdffjga2fh8ne63856wdppx824f2", + "issuer": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "proof": "2f818e5f78d7cd5791cad1544bf34497b9839ebb835624e0e35f9a439a798c84", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xc8qwdcguxgdffjga2fh8ne63856wdppx824f2", + "issuer": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "proof": "30199fd35f4c8694908f9d359d30a4b80cad676fba6df2587f11b768e987c7fe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xc8qwdcguxgdffjga2fh8ne63856wdppx824f2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "53c4bf9077dd55d6e841b91d0bba33f994fdb6c9627d353c1f1949e658e81993", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xcu47jcfnfm60nlp20s038vuvm0v23qhrvqux6", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c9e5da0e85f49cf838829685e6c823e10ae44cff4d4856baa4feda5ed1ee1f933b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xdc29rsgjaxj4znjeugx7mx4u26qreh7qtewpy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "589c04ea5b7a14fc62625e7fc03e394f8efde6a4c80951d85a0b184ca2b7a392fc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xdcumal4uprr7q6z0jkjnj7v4qh7veek0allt4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a4a081c8a626189e777ad896d810614ff4f5270b4b8f378b7d11cbccb9f639db", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xe3ckap97a7p8dmcg385gcvzt2z4v4sjmvt7q5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "74cfd2ab38bf46692fa8ed4410812e3baa2865da84d79e8ca252cf28f5d328d6e9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xekmja8y3wz3prmde7k96v9jj3xhd0d8v9etsa", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7cf85bf92a9093fa4b4cd1f5581ad2e6684a9b73d5113e7c69340307c41c0ea10c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xfpna4wl23n2jugcalh2qgklghmc42s77km23r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d3fd398819ce6b09bf97e114b99fcddb631dd20ab3b786daec09a4a7a127867f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xg64gldp9640ljj63zapl34s256tefzv9sx05p", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "90876b146b51d92f57c09b4fa5ae000116317cd44b4ff0d4a8f8d0abe371bcd8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xg64gldp9640ljj63zapl34s256tefzv9sx05p", + "issuer": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "proof": "dc263e9b0bb17c3f42be11b1d273aab47fb4ea87880c0988ff599ca866128459", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xg9j7ps2xv0sy9jnjauyfx9wwu2qs37wwhlweq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "82c8b0b4821e15d482261e64c6a1e03992cbc1449c27638b94fe4a4bc6c597ed", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0a3dcae57c058051c12e864bb13568664a4253bc9b9d34e9e17cb0885306744f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1ffe5072cd42efcc005c75152f4955555a2bf9ffeab5bf9904e63bd9f6b4eb0e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2a0f4b63dc9c733641c7ef7b61c7421bb6b5956d13a103254c0f930cc879940c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5102dcbea9ac48b6919ce86826d6202fc7934971ae167373ef0a9a1fb713103a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6f7da4254e96326df578fc3d7d537a3b0f553679098ef11490bf6cbee4996c27", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "791d333d1ee497e4e25e43751c5863041697e0ba41274bd662d61fe5628bafda", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8897986725c43b48b89fd57c5133bb5ddac3bbf117e98aab6521e68616e96cfe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9d95a15e125b7fb0086feec15af90e8843919b0e7f4f4704ccdddc48cb7fea54", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b7e41f9e132aeb77ccbbe6b1d4d141c5bde645ba3f24b52fb4538bbd00e6443d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cfd23f3b092d5ed6eab3257ed9e7c5e26b591f06d892678d85ceaa67779e3cc9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d51808f3b0519441bdab3b5f5b9641fb83902fd2f70bdac4cbe32567b5f8559f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xkvz7zn8xnsujsn7jpu53plcqaaycal5xjv0tn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "20a4f593f779ab32ef5ae99efae53f4ea63a886c1c0f7d8c7e7740cc7a19175f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xmc45723nymjsaqpju52te35sk28hpuxkn208f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5817e031f6789da66024694782b6811b74bf4b0c9794995535e40fb574ada680", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xms5hfp3yhfa4pnvk49ewx9nu60xzm0890jjwq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "191d934cec2ee3ff6fa1d4c27cd9d70cb42ecf52599f0d6c71fbd37b1cecc06d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xn0y4m0qjumd8ahlvk7d7m74hg9f7dvy07ylnq", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "febc93a311f15781e28ab3f696593bb56db09923d4889d2c08fe62aade54139d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xn2fvzmr6q7dv5nqwju767luk7g485fep780qp", + "issuer": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "proof": "31584c61ce28f9183c38e290f00b00fde808ef9518fd2c273a09657d8e91cd5c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xn2fvzmr6q7dv5nqwju767luk7g485fep780qp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d73a0c57fb2657db3d15fe9cf194ba015ab71e9ae7075f41fb40d18d7035027e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xn56gqgya6jjej5nq7gnzqgpnmkyrj0gnqauu5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "07cfe5f00bf98d1ebb3b685796f3d90592a91113694f1ceed618e3987ef3a14792__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xn56gqgya6jjej5nq7gnzqgpnmkyrj0gnqauu5", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2e356ecd171c6bacbc951e0454203e3623a367f1b7f0c12d01d03b066dd11f36cf__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xphjq07xh5kcc2gynf9ysx9f6pxqtl9pnnv4p4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "26da5b9f3f7140de1747932cbf7536a843aae99b6631195a91e18a1012471e32c0__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xphjq07xh5kcc2gynf9ysx9f6pxqtl9pnnv4p4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e06241b14bc06e02dc96485156b4fa25a243e7acda5932dc34e8629b41827bfe64__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xpuxs68c8ms0gnj6pe2fdalgfjdllqk2gwwa9k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7e7c549a7e7019d51c52bfbe71d87e9e48671d725fef4ce179599494585181d440", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xqsvatwltcudu2kpr4hec5fkrl7zp3plj3fj4f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "87d17a7ade8aef0fbbd282e6cbfbe9b60b218ce75d198d581822119f906f92a1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xtaezwk6yym4fwnhfc48a63d2t50fu3mmg44hw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4219d3c022d32e88477bc845412e5d93b6f8d58cffeca0783f73a8b4963ed15d50", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xtxunh8heetsjaxkj7h4a7ewjv0xndpfx7t7a4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "98a01f3c508bbcf4a6d67730edefe83e17cb627277a224ff55d864a0861a1da737", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xujqhun3fsr0qnzrecqnm77j356x9l3zcaan7r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b6cbcf8dba6c2cd7144f5e9c6537cffa6231f27932b944b8737c51a399289ff3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xujqhun3fsr0qnzrecqnm77j356x9l3zcaan7r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e94fbd2e09f136831cb89a8de66d17f713f2f2a60b998fec1cde1b5e89529baa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xuslqag6cw2hg2a9pkjsq43twsw5xl3gyjek6f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bedc9d2083c2f3ec9d090d2dbf8ba471c3919fc46197b221f982ae0ea6331e79", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xuwetznphv05vt53selmm7lx82stvyx527ns08", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c57bc926bdf459370620b00d6cee2726d5c696ce0eb50611b4abbb356fce820dad", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xv7k9dd0tmwmaqfpu5ljfqe79qkm6g2xumccsg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d366cae8db2fc32e6fa18a2c97743edfd3e72a5e2f158a70b727307d19aa4411", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0d1c066ab5a2429d7272833d86e06d97f9a68ab1433f065df87a61e5173f8484", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "28ad3aa302850ab3c6869cd76317fba08d390e0ebf491466b6bcc319606baa77", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2940d46cd13a9195a2c6d65c4afec18a899480068d051cb902f49704d3b1e44b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "684b74d3c597a2b6abcd207515696c6808e9d4ddc3d93af3dbe1df7cdaba5b1f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "72135872a1212497e75bb0feae2247ca14b204af01da986ba6a837e8c31f5458", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xxaf2c0ujavt2g8ghq6ewev77kgf4x250e0hxd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b4c319322c52605e0c30590889ba1897f00a676fbc2b4763695e23b81062e858f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xxd3q9xgsknu7uvw5lz047atxwhfhc8xm9d53a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "17df4ea0600b1b8f51d0f6a7b3bfc1e61f6e01c9c1def3faf41fc4a4449a7e249f__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xxd3q9xgsknu7uvw5lz047atxwhfhc8xm9d53a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ef4f6aca7b840fca03735441a38980a9f17cfb01b1af0ef2693bd370c09f6febfd__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xxwl2r5pfnfkm3hpg3dyuhm84cnj5u6y9kfs8d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a5bd150ffeba0ca85cc0e0c2114273900ca01ffc40171b43b24c5fc03ab2084e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xxwl2r5pfnfkm3hpg3dyuhm84cnj5u6y9kfs8d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c5bff2b72a1691bd473d6a8fb123d76bbeed09baf24f2166aaeafdf02817cbcd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xy49c20ptj0n6jlacfvyr46cnqh0n89wk4n3nl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "595d34f6f3d476d9c8db32732b0ca9be119e8e0fdd0e373e64fa59cec3b9dcd9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xydwa7wsk0pkkzzh8a6v0hh80jnufz6ak7cf5c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da7ec14a042d78ad1741c7141dcd9cee7373763ac81b80c2ca46d77188911bfb11", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xz8rjyrq6cfg6x9a3dgatg45xyjtzc0x3lsj97", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b0f0efc3061182bb18cb4f61d4be754629c2112c59adf716e41f74e314064c5861", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1xznwds2dcgwghu9h5ws349wd97mayq94lqg2ly", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3c6a9c6efe58c2ca5b476954a358b596d0a49baa3dabb55cb19d341bfad2b13a41", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y0rpcac0n82x2lcu60yj76xnsnd2jctdt6939s", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fc5c84eb5fb4b9a58174cc7550ceab555811fa0113b53a18ab7628e0a679aa6b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y23eztclyf8t0akygwsfpn6mt77xrnwrskvcfx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d1ab2972059294fb6b2653ac3a32ac511122a80c8f0442140979e79fb60d001e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y3l66ejenc5g8l83ch34ysx0ty6ccm6numwzv8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5039aa664d006aa9c0f64482a2c661cbda7c55423bc398eaec90c39ef2337707", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y4quspa9ux6hkkpah5f9zakum6usa5hsgcwt6l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "54b78ef49b70ad9a47b4ac73c64d4cd44ad7371db3a261833772dfa62e224b77", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "741aa58baa643a4f45f3e27e630201850b35771ed5c7f1e2cbbf91bafa850f8d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "747fe3eb5ef7d729b87b28c8da0fc5e05a932ccfb037d85b3d53f61ccbc68cb2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7b52e4a3e62a962063bd81585dc3463d82c40f4289ca12c4a19deca9b4e4e0c1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "89a77868bb3fc3f9030366e6bc9b31795f98121d97ab5150620cb5aa58511fa1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d15a4afd76fc4b15032b703c650eac1ca29eafa64a15fd17267be605c2d5bfbd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y8c7nfxwcpw0xk6kj7jsdmqs3ykq0dk2aeekhw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b42c7da80672152ab2cf3ca197e842f83af97dda618de0a7f68e0dd57753aa74", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9crusdpy6j6nvqm98yegrqpf770pvs2yvlt48", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bb5486285c943117f3069575c6ed3a8b50d923b1fa4d7c3160c5633b171572a906", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "0d1d29fecb3477c5e42f0bb39c069ce2e7b324f81ada4b27a9dfccb011956043", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "25c61b94a07c66e57cf4a220577c893f7ea8c99232f909e4cb38ee0b1b71fa06", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "41a69e24de32dc472df334d71eb92ce820c8b9c86a9337abae6f164b8a3a30df", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5de1daaebcb0407fd16c3563437421f778fe9d5616e5a2b8c99e02aab114a3a9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "proof": "5ee7be1fe7e8408d8f25cc029ce6ddcaa9a09cc7ab768c3c6d4d8a2f3cda187a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "7ee8e60f9d279b3e1d4d0abdd138b752f0f4f3272fd644607a10f0ef0976c054", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9eb1ab9793ffdedf6c9520b78546eb59d9bee340838d0f7d5ba91290c9f7dbf5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "proof": "c37bc036ffaa44ab4d26321616032fac600d35396967335f173805a8abc508dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ccedfa85a45de7a6d6a21fefabfddffe0f013b6f50a4256f545eeadbfaf76e44", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cdf0fcf9dca263829e48bfc74b35d00a8da19cc4e3c1e3ee9170db4285a4cf05", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yamwn33rf607qsgg7pwuasmnxpa756zqnue7eg", + "issuer": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "proof": "49b4b89fc75d715341027ae5b564824c13a43c9062bebf5bd9850569af26d0b5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yamwn33rf607qsgg7pwuasmnxpa756zqnue7eg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5ac2bf6bc8c28f4d36976fcddc49335a101709a4a442399341b6b846882ad6e6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ydqjwl4f9t9mt2adjkagax98qkgp4w860hd4sd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c0bf5d3685d1f1624d0285e8dddb7f391be809739b461441acc60e007f3cf7f8f7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yepfzpkw90xaamznxc0ytc7jvedgn376sd05jj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e8b036444512d7ea5b6f8db6a97615399f6d1b1c28ad97881e5c77a2d05533a5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ygwhe63lxksdmwtnce85jlxr2x2tdhsm7eqvea", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5eb55e4507b437e61f8ed204b7c4181551998f026d740984bf27f9fe5877097787", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yhhlgv53fcz3j8f9lmr0ycwffpnzlfdjysxtuz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "42e5f2bc604723069ab2e464e4b9062914aecf7a3daef55a2bb2ccaa5b68be6e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yhr2n6wvf2a676t9t2d7p2tgt075yemqllaf5u", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "668413d4e017f162c6616ac2dfa2e6264fba02d09e4492fbd92e5be7e998009f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yj7spuhku7z83fjvjd6rc5aa40ul9k3we85wyl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb7bdaa95d9a1eb0aa5823cca4aa4326824420d0e068c5a9d5e2120e95016908", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yjvtkf3gduyw872g7xhwxqk5hz8srpf6xu3es0", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "1627978397841", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yleayhxff2dfjf45yyr5ha8mfkjpefa4mrng45", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "956a6e71d2ca7eab19b19151b3cfd8c599bcb0f2cb3b6e7d1f85a3a0a4909fbf73", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ylnq864kjwtey58nzc7khtzujn4a0mr2k7fspx", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "08ca26a56273248044f78ddb682b00718fdbb63820c1e3896fde17ff74a89861", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ym4cuw3fznyw5lwqjlt2av42lfpwfmkep5ez09", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c600e15cdae53e59f4202095ddebb3afd4b54835968116bfcaf3504a6321487de1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ymns4rej40zap5uzfxvzfvs9nuqr4vgh07r2xl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "71693743748e2cd3ca926f7d73dec19e298aaca4ba9038efbc2f5069903dafd6d7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ymvef9xvv82wus6z3r8hyygksqvtd4lelgh4lk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9450bce9efa2469160b4c87ef6c90c5447e52378cbc4b8f72baec99d8f4a48dc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ymvef9xvv82wus6z3r8hyygksqvtd4lelgh4lk", + "issuer": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "proof": "e4528b254712bbc946940fba07ce464fbfc90d5966ba90bc75e8ba400c56cb5e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ymvef9xvv82wus6z3r8hyygksqvtd4lelgh4lk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f2798cf2401cf81a8fe9b5da14d81e4ef6c1aa58de4470df7edca9f3590e3061", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yn77jff3sn68nqul0w4wjsmda9yqzrjrvf5nr3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bdb68f13f0b6609b80929e01dfa77dab6c62b219a66895f6f5fd4818814e750f46", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yn8dzt7srhvcwsaa9d2d4wjpr225vzduzzp0yh", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "77874e716390c562e5b0dc784938e26af283794414fad62684e006a2e2b6af91", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ynlqepmdn9efuc7hclj7m649p06mt29ce9zlcd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "621fc64a333c8d913c2ae0e0c0a06b58ab75307d940901a0e52bcce55ec7697a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "018112225914f1820021e5acb9890cbe9b2b2c04e5ebfe6cabecf63232256954", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yp9ldvklkrjum504jguh8j67kesnx7k6ajce8k", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3db7de694aa7d0c8fd14ddc418fa1c454ba2b2347a05d993cf03a6a485dab1d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yrndv25862h4dg2h9tcvs3jf2g93kuxkazaxsy", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "969bf7f09f327cf8ccf7efb31679211564cbde26b8cf14d63ceeabb0c10164affb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ys67d27s8dhup553vqa8zmn85p86ktqlwr6r8a", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d3095a097cf43ee0a8117040607bf5f01b1686b171829ce66f7a850616e53905", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ysrf0mn8frp6fnwf8m5yj79s7pfydlyzecd4r7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ed0de094fd2a2c97ca2ce733eb73c9df49db5dd5b35859a27cb0ac9b8c8ae53c55", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "af218028df51b15f68035ef84ec61f659ef5aeeeaa695055699cc5982d8c426d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "issuer": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "proof": "d4d3385969dac20102ef511fda4637c5d4ff62b834a75520f988cce43c7503fb", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yt847sukq7lqpp7c634zenndjanvsnxa9ucndc", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "832fa06f34a803f2a2fa2c3712aa22f8ed04a398d98af550d4a9c387a3e5235a68", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ytrw6cw56umn4a9l2qk2079edmyxs5h07jugqn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f02fbbdd16e861425875c9ade906c9efc4e20fa7fa126cb8b63f3fb0195c06e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yx4yfepjclv3swgqufjnvdshn6evem36tevvm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "48189d2f28b5678fb2aa1134ce894c3457eb8c7b058847c27e477975024d996e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yx4yfepjclv3swgqufjnvdshn6evem36tevvm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b85731dff69093479bd95cedeb2b9869c25390c993164b4a8971f925c16a010e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yx4yfepjclv3swgqufjnvdshn6evem36tevvm9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c977ac27d4c93e033c91045778e5146cac186f2884742320c9095a648b2b08d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yxatj9n6ddts52swzcxa4rrkn4v9utku9zur8y", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0dae4a9b5fcb674a73560b4e1261dac3c528072a5a54d0218ab81df6f5b4f75e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yxqg98a5wlpldfdjkp0vs9u9sn5qdgc00wkahm", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cbbb8c05a002fb4aeb632cb1e56bccf28aace61e89bf0f025184d9f2d6f5c6fa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "229c3e7ea96a781f317e998be97ad0976f9a5cffdf51393f3e5a3d5eff5af34c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "38fc2761d4764c891a2d4255477bf5a48efc8811ea3a5bb31379c0eea965de66", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4282723b9cb5d633e2c591115c7c4a373c1d47d2c115c6ad90752192b62ab702", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "6608bb3b472ed5adbdc731740f37d4637d49029e5dedd092a8f3a7a3eed5a9d5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "71a8ba59991ca10e3ffbda2fd9b96e9eb35fb2c4c11538fc44704c818dbbb5f1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bdcb47dce452f027cb074413ffee9c0dd3cc23947682fb7f910e2504be5b3986", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d2d4d910ec1256fb9dd4a5df07ed8101b42dd74730a82f4fd7112f80e9289b8a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e5acfdfc219c9c25d4c80890855490d75a70760b5a39fa5ead244386156f041d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy5lvl3um6pa7lcmy3qw28k92gsg04vkh2680d", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d870542174213ac5b505de45f388151514d218b3b41645e7409ea35276138a7bfa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "01fb28aaf055c020c9b280f8e8603043fb33271f023f70e2bcc05c0dd559b21c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "375cb9d75d3ca91c14102e3826fdc5e36e4d30226cb57ad591fa4babf0351e0b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4182c519adfd13362736275097a42bb426f22d2ffdd052cf8d1a08477e80c2d4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "4e15a6a7ecf5607d5ef77536984a02774491981d22fc436e0bd733ae09b203e5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "98836b0eabf22f7d4df46c416bbd9579d51a041310ceb08521695f2613a628d3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a6e3b545f9d1167ef4d22d79b7c873d809b991ba18ec3b886075a9004a4725b2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "b3035436d94e34cdb63908b427bc4839c8a81f28fd1c11945a7125d93d4d40ba", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bec724bf851855e549624a94a297de3667374bef24712c496d5b71fa470ad7be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z003jwxr85egmnav7lnzgj0tlerflsxtjusl6r", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e8973bd37e5b07a3e360a15457dc6f0a909e9b91bbefc9eebfae65a9407e406ef4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z0anr8ljgdd2wufwxdrk4jkgsydklfdkcxrj8l", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "19f4d33ac5d17c6d5e48648dfd966420df00dc25d3a5a7ebfe0af34186f7350c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z0awjcwn6q9wuydhu8qd2gw6wwldn9pc9yxrmp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0148f4ecdbfa2574c743cc80377617e4c508ab472a9774eb936884da482c1fbe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z0awjcwn6q9wuydhu8qd2gw6wwldn9pc9yxrmp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4056f75d1acef547f6970a54c49d51a5e9e1d0cf6720fa91dbb31f7e14827def", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z0awjcwn6q9wuydhu8qd2gw6wwldn9pc9yxrmp", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4a759a9587b9e32ac1cc815922b3dc6dd5655cb91312d54be1314a53f5bf31be", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z22ehgtccq3zfkkd4p7sur9x7320agz5jvvfhz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e1a8dfae932fd99d2b053b2efce8125a3432cb52b3ba8171d2ce6a40cc28cff5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z22ehgtccq3zfkkd4p7sur9x7320agz5jvvfhz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f3dd74816b521c9ef762527e580475842e983d24d07b433a94b0ade14fc5b36f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z2rz88fddw3gpmwmn5kesrncnsqyyfcm0520d2", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "3c59d60e2764f04babcbd16187ef48e1face28a18671782c6059a9edc3dddf75", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z3l977ja8y9tfjv08kqrd8zj577r9zcxfp0ga7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "78a31dca63cb81544a8220d84a8c3c1edd8fc4132d783982198aa23d84e34d2a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z3l977ja8y9tfjv08kqrd8zj577r9zcxfp0ga7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a9759483a2d8a9085166a7386d6c29aa7f325c736eb3ab932aca4959a3f85c49", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z3l977ja8y9tfjv08kqrd8zj577r9zcxfp0ga7", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fa78e1ed03a5fa3e030d5182bc1bff257ed3632eb04ff53e207e574f9bfd6c0e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z5yxaeayc892tg438fz959xakupwdkucfnn3cj", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cb31124985eab7018e4abd3726e65bc24ddf79d64161c2bfa613478d6ebf59ee88__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z65lpptv3t4f3j6weq0xjzwja7vusyejq3vryl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4036691ea1c0ece60eb5010a3d5a1a2a121f18fa976711127711e05fe7876ffa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6azx2ql98v25y03r7qc8m3laa6gk6fz376zrk", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c0167ed3ff5f1b719dae692f308f677dca6b702c2eb2a6ef5c2fc94765d8cefc1b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6fz752e5yraycredgdj7n7f7tj4gptg2p2pdd", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "fca0940363f527dc6bf9b74efdb421038675e9afaa302961696a91953bb7480d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "015f0112549298bfd282fbb6b2a4de664c7b7f62282f0d166b7be7fe37c7edf3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "0534100ff9e150d5a71abcd940a0ea523aa8a190fcd5f9d137c32f648cc5e816", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "05e08da47944c1c5f586682dde77f29ca7b1fbb5b7b133c56c2f82f16d3d4049", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "0f5caabb6a1e63beb05d2f8d56a775000772363513958c65e0b74eb6928bbbe1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "11c140e4de79312df2e1a84d51ac85335c8eb55a48d1824883557bb0cb376800", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "144aff4a54eb0a88498b7473a686b54d4217edc7a9211949e9776b327d952e2d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "14c3a974e7a8db576329cb328f4613e654effb6fa78d77daa4ccea8d67e5688d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1887c0a2f3ca32cf318bbaf6e69d49d68ffb6b5e379aa543df4fdc70f9577828", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1a8aa91b1e76ed307a87a57a09aa5474f6ec3aa63129a3e676307d6cc2f18464", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "1d37142e476bbcbd245b8d1f1dcd2db4eeb89327cb3367419d726027ac6479f8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "1de8ab69c6ef33965f3fa646f4b6b9a585d6e11efae005e26fc325d79d765c3b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1e2577c55fcef2bb2151948d216ab5d8b2cec92c4185f0619d95c2df4640e759", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "21c45dd094b6e44c371b692956bb54980c8a4b7634b71b0f63d1d8d1d117dc7b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "21d10ad8ae8c097d2f23c4facb90b2ae3e772a1c39a77ea89d2f4039a9216fbe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "2673769bf7e7bfe2943ac7fe0045450f4127dc31e3787a62e4f07805288d5cf4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "2b2bfb7956cf7c330aec09dce5f368e38c61d697ceb62c67c74f0fa1f814802a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "2ce1e43a9da8e6ba700c56c4e2af202cd92e0244b05efc19a06318ce6e5fc597", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3036ab86a6f6da52e8fe37ad2264b8aaf1f2f9bdcba9bb111327b34af594a8c9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "308e68d350e056b754717ef1511c366a0f4f21703b46f8d417b4e70fe0b65c69", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3421ee3fdd5789590179eaeeab3a90f8af8fbb2d59bafb06a6144367e8f84ff4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3a392d08cc3184d39cc7cd9149abb71c10aa36c3f5458126eae9e382c68baeed", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "3ab3b13c236a96667b2595d621ff48dbc937d7d4c3f84589f6c2f0f01143e4b3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3bd4982b80fe888996003afcd1820a0a97fb7a144409dd38560b860823772990", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "3eff34e1cabe7ec72605c19d2d628f24b42d5268835d00777643988a0ec493c6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "4321f1b01d54c0b981064788cbb0d3e22a92c7c59483dd99af74d4c5a604fed5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "44753e8607f1a3785a4be4217eceb413e9260d2c2676c66d994fe96231f4c08f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "49ed8551876471d517e8d2752b2f563521198cb43bd6dc383147bbb9a209bc23", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "4a2a800b1e791b184e3ef229dfe4172cd6be62b01921127f3290064736317cb4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4e071bbaf82117437a78f949abb0cefa59431b724e3ac1bdd65b4cc04d8fdb99", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "507e350cc90398fbfb972996c062715ec7e7edcf0ba98024127c0f81982d104f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "510d5af382b53037860b9d2ce661e7e73b36b89f2fa3d2e0a8a844a77b2587ce", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "58034d0771f1a3bcd6c81811a683c5da4a0966b2bb136791541e580f71aeeec5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "5922c698cbd4f4a7eb215bd4e65c36eccdb30f5be5962f764c388f916c408688", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "596cd78bf3ca4225923d9af2b17bf58322564ee93218fdfacb0639d87787da74", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "5dbde0789248459e5b3ca6a6358336380be955503c2981ce734a2e56fd255470", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "64b349635285db36c9f7500ee58f8b3c8f22ad89e0204f723f309e6eba180786", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "6a55e22e21db511c46ad992e27819c5abfb712490b45d39bebfc9d57c889a305", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "proof": "6b505f571b568412a2f04d8021b7e9202941bc4ae14cac10309a862363a47abd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "6bbda1dd7a3a11e0b63d87d524c4d005d74b0cfc0ce4587f8e9401c5427647e8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "6c92623e01e5e077595e110197ca748b4e8d67e141aefb2439eb981d94ea3932", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "6c9bbfd6737ebd532945a4ebc716d1d4b5ddd6301baf4a0716e44b20de5957c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "6d3a44b04a368315e3e874a9d7d4d4fe643d38d9eecf6ecb2e647d6bcec962e1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "73c4a6eaf92c4e13412b23965d032be462a9b252d2b484a8408d2e7ef888bc47", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "76236b55422201c531082fb320a31373b647d28623a4dd0f2caaf60a95a8ce29", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "796677d4636326336a9e4419d5c1d1a6e77b762340d041661bf46af334d73be1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "8016c588c636b9b598d81752e5c8a553db152398cc4681a473fd83498d59bdf6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "8761f31a260fdddd27c3fcde55fe62159f511fdd1d97489ed7fbc2f91e7583a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "888a45829c7da8acd061e921444a623dc6e869f6bdbf37b48d3c4b6a7ccb1816", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "91d6925da171e890e6e18ff63850c2c00d386957dc1b5e872465342ad05a1bab", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "93c8eeb05784f3bb7ed2721013529fd16d570e9e213a764bd0b9cdb5789316aa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "94502c4ffdf6febe34d7b3c47e96cf0fc57b347f0244fa5dfb58396d23ad926a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9566441dfab046f4c111b6dd564b0fbb14ab2c009745195aa8e2ebbcb83afe1f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "976770cc2996efce5f0d701e45e667f216e2b82196e796b93e755b94fba8ccfd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "978d47ce894270e16d5665490bd7647fe077c3e18dba67b4407bae30abbe7e24", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "9d209fa7bed69cdb5b9c03922ddcddc49ce0b93ce52fadf46ecca8f8d77a2de2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "a12572f2a1a932a18df8d6544b5ff031adfdaf8ef360ce334b35f4775792bcaa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "a16f1c675cc1c52b4adbffc25cd3cb3b13c35309e08c74a3866821ecf49ee115", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "a22a05e72c967b186a494a2ca774fb52b81a1805fa8fc47b711d5912ca2d02e2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "a5698cd120ebb5bc93d19a5172e6f9718b23efe5a88a6eed226d7e8e7f8ed5ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "a683abbe121d7df6ce0980587d95e6ecbf151a85e2c767c8f851fa7c865690fc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ae23ec27684426b1545556797c90309277319d4b3627e8429b26e729414fb1c0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "b2e9aec2e8d499dfb45128b77ecbdbe9a8834d54cb9b6b9a71a26e315e9a31a8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b39fa5abfbfc62890f3deafd3d67cc28607de55f8045d5377112c78c71abd6f5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "b50c90c9f02e57c7c11367cd6a47acc2515bf27ece876412a973afffe1b44c04", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bc56de8535b192bf0e088dc267a5a264ced30bd4a108e8b1f3775f68e371ca4f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "bcdffb0d30ff6c926a845375e3e3133dfe40ac78d1e4bcac27059384659d8d94", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bd570e50c693794a0382c813c9cdab125f7b45b0fe3654b8c36ca4283c1a9d4c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "cba8e51e56c7b8e0856dbe511f171ffec1506cf87ad2d643dff2a2929e8c18fe", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "cdcdcb01a7d10e640cb477157f3b9618ecbdbaea9cb592341b53d0fc07aac0b9", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "ce46599943b4a20aee73444dc3d62a3e8680ebf2ece2fa1100e229056b141ef1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d17fb2710422c3e229742764fdb2df5724b9452f6f25dedd6134eebea381498d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "d2af3dd88cf87a471a10a46ed479473ea7989b15a600771d53243c6badb55ac6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d42c573c85bcab2f0980129d030195b06c816260b437413c33ddaceac815a694", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "d5a5555a2c21ff913f184ce6c59e8437ab83f885bec84c6418cc1b96a223d732", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "d5f12dcfc50192323bb3c7f8f99f540cb6141896f4fc3316aacda3d4b9e6c7c6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "proof": "d6a8a9e2a579735da81559db4a5ac519cdb21004fb4af79f61c99ac9411d2cf3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d90af8061308d772340e63b35b3451840428a52270dd19ed6b3b8123afb9f915", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "da0e11e0cbfea5c0cf81e46f9206f56b222dbdcc87189f92cae2eafaece672f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e0fa13ded1ccb5894b7cd8f4bf2e60bac2b74217754dda367618fe2a25701564", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e22c50ec9fa2a5dd127a3d65e07817e36cf019f042dbfbeb93d95093d5fd9155", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "e2bdd33b4f4e1a28708c78b3ef0000fb9aced8ef25917961278f13ed544c1814", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e4a285652dd4bf6ba7a2b8f1c95b3aa93d7165828b2fee26cdc1f03885fde3a5", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e5061ca910ee00e828ffa103ee5fc31b784fdffd26f52204b0edaec24cf2dc3b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "e51b273bfcc0b0fc775ef576920e9ecdb5f6a5b9209fac0f3ed9c422e7d8d608", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e62df03174bd1cde1567403380b64296f260625729c40eac8e7042f75d8bd290", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "e6306c3800792fbd94782af0a46ff5cdd0f4ca6141fc75fde01f932f2b107c03", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f1826c114d61185d077bbba03d1409e4dfa6678ec495f3bf5af4098a470277aa", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "proof": "f4b1c8d0d049934486f6b8694a4935b38176d52bfca8d0377d76e80a5e5f02f3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "proof": "f658a7ed3eb4218e897daac5e7830d2dffa83bb34b2e432b29e3fe41a22da6df", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f75f324cdb9b319763971b091d9fb2e30106a36c1d1145792a487ecc0429cd86", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "issuer": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "proof": "fa28ff2462b60bbeb617db79183f314f30c91e5c2275551274908424d7c8655a", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z7uh9ze53tne2u7k8junyzpzv4yuhlaenzzu2p", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3900c5b3b8c2c8fe634f7f95a4729f10270aa7c49503c892db6453275054cd4b63", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z87cv90jkgdgwhqwegrm6h0978qc2ufqm6xnfd", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "614c2dc46eba000dd4bcc1b67d6ce8c9d1896e17021cad3bb83266ce6b78e841", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1z8c32l466eptzcry0gw9hnnu2juju5ngykyzeg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3e256becf9bf1ae413fb038405f222e5a8e66f8b842ba5465c2585582c84b03394", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zavhj0qsfash6srfqnxh4ft35msn3xrspnwr6f", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "1ce622bd3877e45a6d207f17d334d95dec7f241717665d0045e3a9087aeccb7c2e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zceum754ahlcz2zv20q6gwqpmg8u90vv6lstvl", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "dd66a100191faa09fa69821d4de83cda8121bbee6cb86c87919c10a1861692d3cf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zfme9z9cdsvafgn09ca0nwz7fg7t0dgt7kn4r9", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "ff5e70a882856088dd6c40833296db90fd2b507d6b8b0050df1b1761f2c8dfbf", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zfztnd5etgjg07ees0yshfd9ttyylch0aqrhac", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "fb70966f2ee721abe14fb7554050feeba09ef44d01f5659069a39c17fe59d78e24", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zglsp8j55gv9rgnvf4vx5kutus3v0y6td93ua4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a60926c051353d198ac9528dc986ca64da6d3218e10af4c900cf271b16205c8b", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zhf6yjwkaqw03608glu9fpwcquwytvmtd4dz28", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "81b11dee43a2dab2337e705fb24ca405fcfb6a6c7c32e52ab1ac710910de0011f6", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zjpneg5t68gekzfpv9yg5ngd795ggwj328rvlg", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bd8fd103fa3b255edbddd2eeef32fe669e50879606e143293cf772d46470144eb4", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zk4gd7x7uet7a7umwxtlv8qjxjffg8m443z609", + "issuer": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "proof": "893c00bf61b5a73a7ba610e5084ff355ba363e9401fba865e7e66802399a9116", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zlg73azp8vyj9k6q03m0yjclxpzl9g25wywq9c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4a763d3ed983ad9135c1407c98f3443e2d1925c1e96441c6f59a0e742a7380bb19__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zlg73azp8vyj9k6q03m0yjclxpzl9g25wywq9c", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "60420bc2d341cc8a488af6db8cf9848f561b4d0e3e622f7b491bb540df41e411e7__", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zn4zvmvhpplwul6h66qtjcnj8jypej8k836wat", + "issuer": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "proof": "43525153e0f018fd13103dcb2800b48e7b78c7b7970cf7970109a6ecb22618ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zn6k9xnras22rhj5zgjwx6dazd475ayp224xj4", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "bda99822b1a3230a3714b67627d3d84ce5130b057327cb2925dbf77faa2756bd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1znx68ug9yx3077g0cxuxqp3ufnk4xfj2g0cx26", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "80dbe4ef4fe604677ffd30e5e2c5c96560d83eadc4b0c68072c55f45033cdc8d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zp3dlz3a7ct5vl7gkma7nsne8ercpckrrgdh5g", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "3585bd53ecb4a7b109cae1f6cc2cc589b30fc3e88a619374a96fd34b378316a7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zp3dlz3a7ct5vl7gkma7nsne8ercpckrrgdh5g", + "issuer": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "proof": "7c400d61a477eaa9c902b154dee365b4cec50b6926003f245e1b06a73c039424", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zp3dlz3a7ct5vl7gkma7nsne8ercpckrrgdh5g", + "issuer": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "proof": "ebcc6cd808b7ea3d3c06b92b60cf3431a4d61626b252b58a75a3c14f078be40c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zp3dlz3a7ct5vl7gkma7nsne8ercpckrrgdh5g", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f8c4101f9a933bf78558a4e551ef9f18a315e4fc99af3eef903dceedfd0bf421", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zqscrmy9qad6fgspmcjkre77f69f72fqg7mj7p", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3226a6d16b9fd3b9ddfbdd303113060178fcf04c90251a0e5b69333a82deaa19", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zqscrmy9qad6fgspmcjkre77f69f72fqg7mj7p", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "82150d6fda74f90790990b2ff0dd67e4168946653ed013df8766c57b86e15bc8", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zr46c3gk5tc6aln20ru0u4vchgkdqgn80n52x8", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "63de2dd564f7e831db042e3de51593b748557d46228b8fc4e2c89bb4d037f03e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zrfrpjtct4xurmmlwr6ymrm9xkj67gpxpqr9qw", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "634ba44ccc1b2dcc091d1fa8c267726d9e39bf8f6ebf2c5b89712a6a073ee75c", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zsnxq4u3scx6qqn78qadwtlg3rhf95nulst02w", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "f2b1c3175b109e4faa3e43a0e1251d0d8d3c457f05b82299320916ed753e14ebb0", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "343013f17a74cec71687a04bb244b33cc0ef74cfccde00a169f06e6dabd24c28", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "4f094e89939343f538ade5923a831d12ed08abd26d21a85dad7650f6aafa1015", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "60b4517e55cb3f092b82f095f6c68592a125ce62af401721c6d648845662ddf3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "issuer": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "proof": "9ac63b7065aa31c6d252555d0b7e84f547f2bf170a23d3ec789e624b3a80c1f2", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "c46a4b3544aefed0cc20318895f99a1efd838f4b022c32ac59f57abba14292d1", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1ztv60kwmjzwesvc62vg6qttnylx4uxyxs2h4tz", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "d612e2cdec4c5b1c9165dfb52ddeed7d2168611ec76cb457d1693ba4a3df9482e7", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zufs2vj0elt682eew83n0hd8hzgdsejayujet2", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "7f5b785e523bba0748db1cc2865fc7c83ff16855a756e8cea58d8c197835d06de3", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zupjvrdx5j4hvy9ey7w7wj3gxxefpd6ml83nml", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "34a0d56d39649d1abfee465f2990b148bee97e345bb268c8e242c47a0b727b0592", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "01bcba6802e83593c75b189f38a9a76e19e4fab4bfbfc30f1a52a1232e3b5c78", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "3d4696bfe270db5beec6d15bc778c7d57e63164dbc1fd9fc3ed8b4ef57b9a454", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "86e51af255aa0f44e91ebee28df5f010afcdf698035db05a45cfc75d30c562fc", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "9ea7e0e06180d2d7671734a99d2a2cad056946f425e9b366de4efaff8acd841f", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "e08292ea0db8c0c61bf36040e6ceeb43c6b5d02070bd8dbdb6f87f1cd45cc668", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "0dd2c74239354b56697a269777d27c88d8c28ff4748f5c3e4dc11fe82be672ee", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "proof": "1f61caead8c853a3095d8e37ce3c46345308d8a67d7327b42206c87bebf3b1fd", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "21497c9c3d8cce8e2901819a6d869b699a72a068135f2470c7ec81acecbb7541", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "proof": "4ccf3ae4967592289a9d05d0754e4c9d41d3c661da4cbce851dff6045998131d", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "proof": "602c84a166664eb65e2b86ea5c6ba3f05d329fbe69b722bd3b271dc6c5018f0e", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "proof": "abb3bc0aff082b36d20dd29753bedfb490c5802902c4add0f4e495372210e706", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "proof": "ba2205778d207af5665ceb0fa4947364e0ed12e407a2c7c03725e0c9a4c60389", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "issuer": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "proof": "d3fa95c17f9fcbe52d1090c0a2c3e2d5f4030d4c2bd8ce2c7fe6d4e9e5c36147", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zyd3387z9cxczjcsuukc95zyxz5awpmq5yvman", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "b2b6f2552edec0412c77809f2ed674ad945b1cffef682bdc4642542c0d790690", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zykn3mry9ld0jdrfrdw5lsza0zxqqur0n45mym", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "a8fdcc5e9931cb3e9cebd53e53ff2d678c6203e48d90617054608c5df5f4887502", + "data": "", + "version": 0 + }, + { + "holder": "shareledger1zz8mpdsk28vm8523ecaez3kh3haxn73kf395d3", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "455256eeea160c55a31041ae5d8e3ac4059860d1baf96d41c4e406bd0c64456cb7", + "data": "", + "version": 0 + }, + { + "holder": "uid-159654", + "issuer": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "proof": "shareledger1s432u6zv95wpluxhf4qru2ewy58kc3w4tkzm3v", + "data": "http://sharering.network", + "version": 0 + } + ] + }, + "electoral": { + "accStateList": [ + { + "key": "accopshareledger18g8x9censnr3k2y7x6vwntlhvz254ym4qflcak", + "address": "shareledger18g8x9censnr3k2y7x6vwntlhvz254ym4qflcak", + "status": "active" + }, + { + "key": "docIssuershareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "address": "shareledger10d0qmdhxa6m7049fwvauc0g8wn5rpa6al5a806", + "status": "inactive" + }, + { + "key": "docIssuershareledger10pkvjgnz2xpqcshzntqh05m75jf9g49hqf3cq6", + "address": "shareledger10pkvjgnz2xpqcshzntqh05m75jf9g49hqf3cq6", + "status": "inactive" + }, + { + "key": "docIssuershareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "address": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "status": "active" + }, + { + "key": "docIssuershareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "address": "shareledger10ynhltm8cj9wjczcmkc9tckjq4wded34f39v9w", + "status": "inactive" + }, + { + "key": "docIssuershareledger12hlzse63r0fq8rem34s2fwdgxzskdlewm4dps6", + "address": "shareledger12hlzse63r0fq8rem34s2fwdgxzskdlewm4dps6", + "status": "inactive" + }, + { + "key": "docIssuershareledger12p5y8ngc8y46cl6ygn8c52q9f0wqc0egq5yh0m", + "address": "shareledger12p5y8ngc8y46cl6ygn8c52q9f0wqc0egq5yh0m", + "status": "active" + }, + { + "key": "docIssuershareledger12pcp7u9nq8x6u0vwrufc8l9j48mvl8qf9a0rwj", + "address": "shareledger12pcp7u9nq8x6u0vwrufc8l9j48mvl8qf9a0rwj", + "status": "active" + }, + { + "key": "docIssuershareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "address": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "status": "active" + }, + { + "key": "docIssuershareledger135k00n2uec225kjecsljc2vep0apwnh5kmyrls", + "address": "shareledger135k00n2uec225kjecsljc2vep0apwnh5kmyrls", + "status": "inactive" + }, + { + "key": "docIssuershareledger13jvwzmum2s0t8lu8lvpzpxdshet9mk4h0nupyc", + "address": "shareledger13jvwzmum2s0t8lu8lvpzpxdshet9mk4h0nupyc", + "status": "inactive" + }, + { + "key": "docIssuershareledger13qrkzy3zq7ny3s6pc4fqze36q6dpc8uev7jq69", + "address": "shareledger13qrkzy3zq7ny3s6pc4fqze36q6dpc8uev7jq69", + "status": "active" + }, + { + "key": "docIssuershareledger14lu2t8vqu2kgy9grvg44az4hekz3339s6xdzmr", + "address": "shareledger14lu2t8vqu2kgy9grvg44az4hekz3339s6xdzmr", + "status": "active" + }, + { + "key": "docIssuershareledger14lxq7qevsjgnz6lecntuuxeuuj8453y6uh4kes", + "address": "shareledger14lxq7qevsjgnz6lecntuuxeuuj8453y6uh4kes", + "status": "active" + }, + { + "key": "docIssuershareledger14m7klg3fcuhvs2j3dwva4vedsqgv8xn7vxqnxn", + "address": "shareledger14m7klg3fcuhvs2j3dwva4vedsqgv8xn7vxqnxn", + "status": "inactive" + }, + { + "key": "docIssuershareledger14np3phs56qqv5d4hqcjvsclw0p4wlncafyczf9", + "address": "shareledger14np3phs56qqv5d4hqcjvsclw0p4wlncafyczf9", + "status": "inactive" + }, + { + "key": "docIssuershareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "address": "shareledger14slcwd2vvxl9x7wh8dvwsx3knl22auy2v4tf42", + "status": "inactive" + }, + { + "key": "docIssuershareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "address": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "status": "active" + }, + { + "key": "docIssuershareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "address": "shareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "status": "active" + }, + { + "key": "docIssuershareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "address": "shareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "status": "inactive" + }, + { + "key": "docIssuershareledger167cp5dnfqahvqpz6aj5rcgwqd0jufxys6drk4e", + "address": "shareledger167cp5dnfqahvqpz6aj5rcgwqd0jufxys6drk4e", + "status": "active" + }, + { + "key": "docIssuershareledger16e03pe7y0x2hgyhfgudadr9pkj2pdh6n98kmth", + "address": "shareledger16e03pe7y0x2hgyhfgudadr9pkj2pdh6n98kmth", + "status": "active" + }, + { + "key": "docIssuershareledger16ks6a7kek6ft2np5afppe8sv8a7futxuuuuq89", + "address": "shareledger16ks6a7kek6ft2np5afppe8sv8a7futxuuuuq89", + "status": "active" + }, + { + "key": "docIssuershareledger16sd6a3qfwpum63yed9c7fcmx9tjq03haglvxnf", + "address": "shareledger16sd6a3qfwpum63yed9c7fcmx9tjq03haglvxnf", + "status": "active" + }, + { + "key": "docIssuershareledger1709s6z0y49t0skaw6hh9zqqdp6kfetld2rjqeg", + "address": "shareledger1709s6z0y49t0skaw6hh9zqqdp6kfetld2rjqeg", + "status": "active" + }, + { + "key": "docIssuershareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "address": "shareledger17584u5w048u3sr3pzaky97axqwcda9z4kgkmth", + "status": "active" + }, + { + "key": "docIssuershareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "address": "shareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "status": "inactive" + }, + { + "key": "docIssuershareledger18m4le7qrrhguj5vvfzpejsvrsjzyt46cy40t6m", + "address": "shareledger18m4le7qrrhguj5vvfzpejsvrsjzyt46cy40t6m", + "status": "active" + }, + { + "key": "docIssuershareledger18tprakt5zqtkg74c8dlw324jsxn3fsjqyxe4vv", + "address": "shareledger18tprakt5zqtkg74c8dlw324jsxn3fsjqyxe4vv", + "status": "inactive" + }, + { + "key": "docIssuershareledger18xwztyus5aynnndlwk9qagqhxunvver8ahdr69", + "address": "shareledger18xwztyus5aynnndlwk9qagqhxunvver8ahdr69", + "status": "active" + }, + { + "key": "docIssuershareledger192cg6txf8kwnkaat9mmuuc4ynn74yfa22p2mmv", + "address": "shareledger192cg6txf8kwnkaat9mmuuc4ynn74yfa22p2mmv", + "status": "inactive" + }, + { + "key": "docIssuershareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "address": "shareledger19a8nje2lh7h8n7g0ka9qerknp9vyyygh77cz7s", + "status": "active" + }, + { + "key": "docIssuershareledger19cgvyj0eyq78c8yc0v9nl7aysun8s6vqde797f", + "address": "shareledger19cgvyj0eyq78c8yc0v9nl7aysun8s6vqde797f", + "status": "inactive" + }, + { + "key": "docIssuershareledger19ecf5vhnyq0m3dq2ewgh4d7qa00qkqe9ylyx9m", + "address": "shareledger19ecf5vhnyq0m3dq2ewgh4d7qa00qkqe9ylyx9m", + "status": "active" + }, + { + "key": "docIssuershareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "address": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "status": "active" + }, + { + "key": "docIssuershareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "address": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "status": "active" + }, + { + "key": "docIssuershareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "address": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "status": "active" + }, + { + "key": "docIssuershareledger19r53qvhwws05fzjldrrljaw70g2pmgytt77e6n", + "address": "shareledger19r53qvhwws05fzjldrrljaw70g2pmgytt77e6n", + "status": "inactive" + }, + { + "key": "docIssuershareledger19rl923wwl9erhq6n2eeh6stqfuuwmfvmwrcu24", + "address": "shareledger19rl923wwl9erhq6n2eeh6stqfuuwmfvmwrcu24", + "status": "active" + }, + { + "key": "docIssuershareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "address": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "status": "active" + }, + { + "key": "docIssuershareledger1arl2drkh9qmugjfg6k7k4zl9axfv7vf07n09t5", + "address": "shareledger1arl2drkh9qmugjfg6k7k4zl9axfv7vf07n09t5", + "status": "active" + }, + { + "key": "docIssuershareledger1c0vdgrmwnu0x56xxcr3taarfvu5aedvlfem89x", + "address": "shareledger1c0vdgrmwnu0x56xxcr3taarfvu5aedvlfem89x", + "status": "inactive" + }, + { + "key": "docIssuershareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "address": "shareledger1c7nqet8jas28kmkngxejwm58nyerxptkj5xzqt", + "status": "inactive" + }, + { + "key": "docIssuershareledger1ch5rvu4267humyc8r9czfqrchyr9843ehjkeu4", + "address": "shareledger1ch5rvu4267humyc8r9czfqrchyr9843ehjkeu4", + "status": "inactive" + }, + { + "key": "docIssuershareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "address": "shareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "status": "active" + }, + { + "key": "docIssuershareledger1crm7w5rfpr4zugjvzv0ww6sr06e0qm4c37krq6", + "address": "shareledger1crm7w5rfpr4zugjvzv0ww6sr06e0qm4c37krq6", + "status": "active" + }, + { + "key": "docIssuershareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "address": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "status": "active" + }, + { + "key": "docIssuershareledger1daxr559k3z8yat8utdk20jufu0ypqspkw4y88q", + "address": "shareledger1daxr559k3z8yat8utdk20jufu0ypqspkw4y88q", + "status": "active" + }, + { + "key": "docIssuershareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "address": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "status": "active" + }, + { + "key": "docIssuershareledger1dfy2l3rwulkqnkfqay8py630jhg0m605rrq7ke", + "address": "shareledger1dfy2l3rwulkqnkfqay8py630jhg0m605rrq7ke", + "status": "active" + }, + { + "key": "docIssuershareledger1dkfa4kea2ez9ht094lhkxsz36aufhdqgjcfz22", + "address": "shareledger1dkfa4kea2ez9ht094lhkxsz36aufhdqgjcfz22", + "status": "inactive" + }, + { + "key": "docIssuershareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "address": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "status": "active" + }, + { + "key": "docIssuershareledger1dt6cvssk5qzk3ghdl34kaem7385xnudkayqsg8", + "address": "shareledger1dt6cvssk5qzk3ghdl34kaem7385xnudkayqsg8", + "status": "active" + }, + { + "key": "docIssuershareledger1dtr5k5sshcegmeuc3lcaszp0ueje3nn0vet5a0", + "address": "shareledger1dtr5k5sshcegmeuc3lcaszp0ueje3nn0vet5a0", + "status": "inactive" + }, + { + "key": "docIssuershareledger1e5xaqefpv6tt2eh5uxv5p8ersap5q6rmtwylme", + "address": "shareledger1e5xaqefpv6tt2eh5uxv5p8ersap5q6rmtwylme", + "status": "active" + }, + { + "key": "docIssuershareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "address": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "status": "active" + }, + { + "key": "docIssuershareledger1ewy9qcptaaaknewp8445yft9rgyupjdntu3uea", + "address": "shareledger1ewy9qcptaaaknewp8445yft9rgyupjdntu3uea", + "status": "inactive" + }, + { + "key": "docIssuershareledger1f75eqhu2ml0kavmc3y57037sa853tcq8ve8ylm", + "address": "shareledger1f75eqhu2ml0kavmc3y57037sa853tcq8ve8ylm", + "status": "active" + }, + { + "key": "docIssuershareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "address": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "status": "inactive" + }, + { + "key": "docIssuershareledger1fav80hwfuz3yvjmzfwfrldjlvshu9zauyl4383", + "address": "shareledger1fav80hwfuz3yvjmzfwfrldjlvshu9zauyl4383", + "status": "active" + }, + { + "key": "docIssuershareledger1fckwx6zpqa5pn0vcvtfjnnfemhvz2wlnv3ek2e", + "address": "shareledger1fckwx6zpqa5pn0vcvtfjnnfemhvz2wlnv3ek2e", + "status": "active" + }, + { + "key": "docIssuershareledger1fd62lmq96jgjxadqx4sfem6lcnq4t3s7u32rhl", + "address": "shareledger1fd62lmq96jgjxadqx4sfem6lcnq4t3s7u32rhl", + "status": "inactive" + }, + { + "key": "docIssuershareledger1ff554s7rcwxn943kwc9qyzj6pcgp6jetpceh5e", + "address": "shareledger1ff554s7rcwxn943kwc9qyzj6pcgp6jetpceh5e", + "status": "active" + }, + { + "key": "docIssuershareledger1fpcsqt6dzjw7g79arh2x5vdehseq09jul7s4cs", + "address": "shareledger1fpcsqt6dzjw7g79arh2x5vdehseq09jul7s4cs", + "status": "active" + }, + { + "key": "docIssuershareledger1fs3vakvwz3hepyls3z3xwkxs49n97576eaxjzh", + "address": "shareledger1fs3vakvwz3hepyls3z3xwkxs49n97576eaxjzh", + "status": "inactive" + }, + { + "key": "docIssuershareledger1fuef677js5cn76k0tdjtrdw9mu3zc8rxtk3prg", + "address": "shareledger1fuef677js5cn76k0tdjtrdw9mu3zc8rxtk3prg", + "status": "inactive" + }, + { + "key": "docIssuershareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "address": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "status": "active" + }, + { + "key": "docIssuershareledger1gd27ny9wr7m3ych0m603j3je5u6ratp0w387zu", + "address": "shareledger1gd27ny9wr7m3ych0m603j3je5u6ratp0w387zu", + "status": "active" + }, + { + "key": "docIssuershareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "address": "shareledger1gnkemrqgkcdm3fc95c4uarwsjexrrgw998yl2l", + "status": "active" + }, + { + "key": "docIssuershareledger1h3g702kksf0zpstu26e55v3m2emrul3hagakca", + "address": "shareledger1h3g702kksf0zpstu26e55v3m2emrul3hagakca", + "status": "inactive" + }, + { + "key": "docIssuershareledger1hestt2yt308j8xg95cy3pg80yy7l0n839zg8ak", + "address": "shareledger1hestt2yt308j8xg95cy3pg80yy7l0n839zg8ak", + "status": "inactive" + }, + { + "key": "docIssuershareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "address": "shareledger1hf82kwrf8e05ccuwahxrqqzcfeck2m0gqz3r52", + "status": "inactive" + }, + { + "key": "docIssuershareledger1hgqnk8r7s95la55wptk6t5xt3pj08kg2xp4lpt", + "address": "shareledger1hgqnk8r7s95la55wptk6t5xt3pj08kg2xp4lpt", + "status": "inactive" + }, + { + "key": "docIssuershareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "address": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "status": "active" + }, + { + "key": "docIssuershareledger1hjvm357yhtqkwxdzxgj5pvchpuaqktgx9nzxde", + "address": "shareledger1hjvm357yhtqkwxdzxgj5pvchpuaqktgx9nzxde", + "status": "active" + }, + { + "key": "docIssuershareledger1hl0wxra5yh2gaamah693q8pff6tk56tz9zhu0c", + "address": "shareledger1hl0wxra5yh2gaamah693q8pff6tk56tz9zhu0c", + "status": "inactive" + }, + { + "key": "docIssuershareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "address": "shareledger1j0svcpcql0xfvfezu5n707g80xy8k7tjqxuy02", + "status": "inactive" + }, + { + "key": "docIssuershareledger1juufvm9pznmt98pvlslkzs7szw0uz2k7qcgv89", + "address": "shareledger1juufvm9pznmt98pvlslkzs7szw0uz2k7qcgv89", + "status": "active" + }, + { + "key": "docIssuershareledger1jy4jl0j3v3w70pceunlghykj8jc470pufn7sem", + "address": "shareledger1jy4jl0j3v3w70pceunlghykj8jc470pufn7sem", + "status": "active" + }, + { + "key": "docIssuershareledger1jzm268e9uh23c0jw6ndlnft3qqhrv0yunn8ghn", + "address": "shareledger1jzm268e9uh23c0jw6ndlnft3qqhrv0yunn8ghn", + "status": "active" + }, + { + "key": "docIssuershareledger1kqhs4nh6akhaxqjhn5gedeyqnarq6pd3gj02ys", + "address": "shareledger1kqhs4nh6akhaxqjhn5gedeyqnarq6pd3gj02ys", + "status": "inactive" + }, + { + "key": "docIssuershareledger1krraljy2c3g00pjsmkfqljq38eykra8zyauujv", + "address": "shareledger1krraljy2c3g00pjsmkfqljq38eykra8zyauujv", + "status": "active" + }, + { + "key": "docIssuershareledger1ktdzhu65lr0klt882wuxnlzyrzcnnxh0d5k358", + "address": "shareledger1ktdzhu65lr0klt882wuxnlzyrzcnnxh0d5k358", + "status": "inactive" + }, + { + "key": "docIssuershareledger1kwllfyfv0nfu85n0srk74kr686uasmxwpkxe6s", + "address": "shareledger1kwllfyfv0nfu85n0srk74kr686uasmxwpkxe6s", + "status": "inactive" + }, + { + "key": "docIssuershareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "address": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "status": "active" + }, + { + "key": "docIssuershareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "address": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "status": "active" + }, + { + "key": "docIssuershareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "address": "shareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "status": "active" + }, + { + "key": "docIssuershareledger1mcfr42ll89dwlck77es57ghgmkea2vpdgwats4", + "address": "shareledger1mcfr42ll89dwlck77es57ghgmkea2vpdgwats4", + "status": "active" + }, + { + "key": "docIssuershareledger1meczxtde40f7znlx0vzewuhxnux3p5y2336d34", + "address": "shareledger1meczxtde40f7znlx0vzewuhxnux3p5y2336d34", + "status": "active" + }, + { + "key": "docIssuershareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "address": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "status": "active" + }, + { + "key": "docIssuershareledger1n2s623cxv765vl74an0wsw8lzsh4933hjpl987", + "address": "shareledger1n2s623cxv765vl74an0wsw8lzsh4933hjpl987", + "status": "active" + }, + { + "key": "docIssuershareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "address": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "status": "active" + }, + { + "key": "docIssuershareledger1nhgddhdrwxpwc4jdf4prphpwdjmd7g80andunp", + "address": "shareledger1nhgddhdrwxpwc4jdf4prphpwdjmd7g80andunp", + "status": "active" + }, + { + "key": "docIssuershareledger1nlc24p5dfcglwjscxdyh6q2rnzwgglqd8ddgm4", + "address": "shareledger1nlc24p5dfcglwjscxdyh6q2rnzwgglqd8ddgm4", + "status": "active" + }, + { + "key": "docIssuershareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "address": "shareledger1nlm38w6q6cfxwd8vwfylagtwqw2gye0uyuwsuk", + "status": "active" + }, + { + "key": "docIssuershareledger1nryw8q00f4expchtpgmfn56n2q9slfsfejdn2x", + "address": "shareledger1nryw8q00f4expchtpgmfn56n2q9slfsfejdn2x", + "status": "active" + }, + { + "key": "docIssuershareledger1p2l7z3v8hzjlhhwxccylngntlft2mas7m73ksp", + "address": "shareledger1p2l7z3v8hzjlhhwxccylngntlft2mas7m73ksp", + "status": "active" + }, + { + "key": "docIssuershareledger1p2uyr55gpzcv5vxw8vxplkk8gtj23vy3wkmr49", + "address": "shareledger1p2uyr55gpzcv5vxw8vxplkk8gtj23vy3wkmr49", + "status": "active" + }, + { + "key": "docIssuershareledger1p78j993d6axd0h5zw5lf5wau8gyaqm852g8rlp", + "address": "shareledger1p78j993d6axd0h5zw5lf5wau8gyaqm852g8rlp", + "status": "active" + }, + { + "key": "docIssuershareledger1pd4rlrgxv0052ztzqn47zdjjv57weesseynjj9", + "address": "shareledger1pd4rlrgxv0052ztzqn47zdjjv57weesseynjj9", + "status": "active" + }, + { + "key": "docIssuershareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "address": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "status": "inactive" + }, + { + "key": "docIssuershareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "address": "shareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "status": "active" + }, + { + "key": "docIssuershareledger1qs9xq7xk753qq47qan40sa5wedtqf77vmf07qv", + "address": "shareledger1qs9xq7xk753qq47qan40sa5wedtqf77vmf07qv", + "status": "inactive" + }, + { + "key": "docIssuershareledger1r62wn8pfw4606vc0xyusxt6h877yxmpkm44996", + "address": "shareledger1r62wn8pfw4606vc0xyusxt6h877yxmpkm44996", + "status": "active" + }, + { + "key": "docIssuershareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "address": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "status": "active" + }, + { + "key": "docIssuershareledger1rl9p3ectaj6pxmnfcs3pu3v4q4hy9y55edj9qm", + "address": "shareledger1rl9p3ectaj6pxmnfcs3pu3v4q4hy9y55edj9qm", + "status": "active" + }, + { + "key": "docIssuershareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "address": "shareledger1rrspzptghx4frvj4ktjdr3vmjl6mta9j6krpeg", + "status": "active" + }, + { + "key": "docIssuershareledger1scdq96hxerv2mkqgdseyxpnpjgygjqcvkk8urc", + "address": "shareledger1scdq96hxerv2mkqgdseyxpnpjgygjqcvkk8urc", + "status": "active" + }, + { + "key": "docIssuershareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "address": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "status": "inactive" + }, + { + "key": "docIssuershareledger1sr0u37lws307yakpar48vzwpdale46q38mlyym", + "address": "shareledger1sr0u37lws307yakpar48vzwpdale46q38mlyym", + "status": "inactive" + }, + { + "key": "docIssuershareledger1t6w63shshwhhgs4tn39evacahxjja9jck4lsmf", + "address": "shareledger1t6w63shshwhhgs4tn39evacahxjja9jck4lsmf", + "status": "active" + }, + { + "key": "docIssuershareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "address": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "status": "active" + }, + { + "key": "docIssuershareledger1tl8uh5fumtz5mpru045nyj9rx62emqgymvwsqy", + "address": "shareledger1tl8uh5fumtz5mpru045nyj9rx62emqgymvwsqy", + "status": "active" + }, + { + "key": "docIssuershareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "address": "shareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "status": "inactive" + }, + { + "key": "docIssuershareledger1uty2sj65rdj88gzheq0jufg0dww96elf0ph25k", + "address": "shareledger1uty2sj65rdj88gzheq0jufg0dww96elf0ph25k", + "status": "active" + }, + { + "key": "docIssuershareledger1uu8f9gkn9699fryp0axa02wjnl2ldzwkzvsa49", + "address": "shareledger1uu8f9gkn9699fryp0axa02wjnl2ldzwkzvsa49", + "status": "active" + }, + { + "key": "docIssuershareledger1uv2hqjc0y6m278fmcl3kll9e42z79ardtzta3e", + "address": "shareledger1uv2hqjc0y6m278fmcl3kll9e42z79ardtzta3e", + "status": "inactive" + }, + { + "key": "docIssuershareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "address": "shareledger1v9jwp6f2rs04a476vuf68va63rkfn39u7kgh8c", + "status": "inactive" + }, + { + "key": "docIssuershareledger1vfyvgzp5tcvz5ptcgun5u5cqpl587mc5ym79tc", + "address": "shareledger1vfyvgzp5tcvz5ptcgun5u5cqpl587mc5ym79tc", + "status": "active" + }, + { + "key": "docIssuershareledger1vjtat7mgaseugvqpg53jwt2pfeplsq9sp6mk7r", + "address": "shareledger1vjtat7mgaseugvqpg53jwt2pfeplsq9sp6mk7r", + "status": "active" + }, + { + "key": "docIssuershareledger1vnt0dge8xvhjkns43u3sxt5yt39p8ep657l388", + "address": "shareledger1vnt0dge8xvhjkns43u3sxt5yt39p8ep657l388", + "status": "active" + }, + { + "key": "docIssuershareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "address": "shareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "status": "active" + }, + { + "key": "docIssuershareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "address": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "status": "active" + }, + { + "key": "docIssuershareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "address": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "status": "active" + }, + { + "key": "docIssuershareledger1wek0dg5kpfkuxyqsn0yjze6g26awsfegf65pk0", + "address": "shareledger1wek0dg5kpfkuxyqsn0yjze6g26awsfegf65pk0", + "status": "active" + }, + { + "key": "docIssuershareledger1wsdegaxzrd23a5a8zqa88ex3ck8hdzscy53szy", + "address": "shareledger1wsdegaxzrd23a5a8zqa88ex3ck8hdzscy53szy", + "status": "active" + }, + { + "key": "docIssuershareledger1wwqcr9u8x5gc85krradq6mq60kh34zxcs29gaq", + "address": "shareledger1wwqcr9u8x5gc85krradq6mq60kh34zxcs29gaq", + "status": "inactive" + }, + { + "key": "docIssuershareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "address": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "status": "active" + }, + { + "key": "docIssuershareledger1x2ymylwng5qced6qc3ff0xwjmcv7hwl2h2rfc6", + "address": "shareledger1x2ymylwng5qced6qc3ff0xwjmcv7hwl2h2rfc6", + "status": "active" + }, + { + "key": "docIssuershareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "address": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "status": "active" + }, + { + "key": "docIssuershareledger1x68t235755ysh23fcetk6zqxqmkqnntttjttzm", + "address": "shareledger1x68t235755ysh23fcetk6zqxqmkqnntttjttzm", + "status": "inactive" + }, + { + "key": "docIssuershareledger1xw6yscwhhtrn5yj5h5g3fe9yd62xgw5m3lj5pu", + "address": "shareledger1xw6yscwhhtrn5yj5h5g3fe9yd62xgw5m3lj5pu", + "status": "active" + }, + { + "key": "docIssuershareledger1xxjusktxrw6uf9wz9p22wa8pdn8qe2p7yz4hu6", + "address": "shareledger1xxjusktxrw6uf9wz9p22wa8pdn8qe2p7yz4hu6", + "status": "inactive" + }, + { + "key": "docIssuershareledger1xz665w3an5ervxnh8j9yfd3uusdhxtj9yyu7cy", + "address": "shareledger1xz665w3an5ervxnh8j9yfd3uusdhxtj9yyu7cy", + "status": "active" + }, + { + "key": "docIssuershareledger1y22wald653cfzy4v6uk8w5e4kha2eukhh728xv", + "address": "shareledger1y22wald653cfzy4v6uk8w5e4kha2eukhh728xv", + "status": "active" + }, + { + "key": "docIssuershareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "address": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "status": "inactive" + }, + { + "key": "docIssuershareledger1y7a3knerah596djfa7m0jldv6k0nad5msrgk80", + "address": "shareledger1y7a3knerah596djfa7m0jldv6k0nad5msrgk80", + "status": "active" + }, + { + "key": "docIssuershareledger1yjsatwl8k6jan9newlwqya8z06hwkgh05w0w39", + "address": "shareledger1yjsatwl8k6jan9newlwqya8z06hwkgh05w0w39", + "status": "active" + }, + { + "key": "docIssuershareledger1yjzrfs6wprg8k065fs6qx6r35cqumdl69ytwhz", + "address": "shareledger1yjzrfs6wprg8k065fs6qx6r35cqumdl69ytwhz", + "status": "inactive" + }, + { + "key": "docIssuershareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "address": "shareledger1ysfj66na5pc4uzdhxyujvk5rddgwrd4tjuce85", + "status": "active" + }, + { + "key": "docIssuershareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "address": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "status": "active" + }, + { + "key": "docIssuershareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "address": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "status": "active" + }, + { + "key": "docIssuershareledger1zea7vyt3u7mqf7ehh7yqh6rj8c4g50aeycux49", + "address": "shareledger1zea7vyt3u7mqf7ehh7yqh6rj8c4g50aeycux49", + "status": "active" + }, + { + "key": "docIssuershareledger1zjnj0rwshc4zk6sgz2nr5nhffxemvw8x57g2f5", + "address": "shareledger1zjnj0rwshc4zk6sgz2nr5nhffxemvw8x57g2f5", + "status": "active" + }, + { + "key": "docIssuershareledger1zntz0yadlajjqng5ywzcxdtfc3y3w9mj7h52kq", + "address": "shareledger1zntz0yadlajjqng5ywzcxdtfc3y3w9mj7h52kq", + "status": "inactive" + }, + { + "key": "docIssuershareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "address": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "status": "active" + }, + { + "key": "idsignershareledger18xcsdjpdphtrd9yjwtw6hymandgfwlayg3nwq6", + "address": "shareledger18xcsdjpdphtrd9yjwtw6hymandgfwlayg3nwq6", + "status": "active" + }, + { + "key": "idsignershareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "address": "shareledger1nf7mkd0zdlthlf6x4rxzpxw7ytvdhdretqg5js", + "status": "active" + }, + { + "key": "idsignershareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "address": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "status": "active" + }, + { + "key": "shrploadershareledger135guptu3wef6fkxnfatzk2phdf62pk0d3vw4qv", + "address": "shareledger135guptu3wef6fkxnfatzk2phdf62pk0d3vw4qv", + "status": "active" + }, + { + "key": "shrploadershareledger15t5h59yd7nsu0lw3u358j62eqd7w6jqcmxnqcx", + "address": "shareledger15t5h59yd7nsu0lw3u358j62eqd7w6jqcmxnqcx", + "status": "active" + }, + { + "key": "shrploadershareledger18w6wwqwtjg8j33ap8g9tnkyz0jmj0ep2u9v45x", + "address": "shareledger18w6wwqwtjg8j33ap8g9tnkyz0jmj0ep2u9v45x", + "status": "active" + }, + { + "key": "shrploadershareledger19z6unptm8pyl0yt0y7c4vzuj2q2wkekk22h0kg", + "address": "shareledger19z6unptm8pyl0yt0y7c4vzuj2q2wkekk22h0kg", + "status": "active" + }, + { + "key": "shrploadershareledger1al85nhdmwheeg9m423gsvhvz6f5uapnwjz7vdy", + "address": "shareledger1al85nhdmwheeg9m423gsvhvz6f5uapnwjz7vdy", + "status": "active" + }, + { + "key": "shrploadershareledger1fmh57s94nhgu2c8j2y89w4gzqw29wtx9cxrwjj", + "address": "shareledger1fmh57s94nhgu2c8j2y89w4gzqw29wtx9cxrwjj", + "status": "active" + }, + { + "key": "shrploadershareledger1j2k0cr7zps880ltz8m2flx922uquk44pzk9zyl", + "address": "shareledger1j2k0cr7zps880ltz8m2flx922uquk44pzk9zyl", + "status": "active" + }, + { + "key": "shrploadershareledger1pafnpv3cthf8k0qf7n2hy9qxzdp3rawzw8e52k", + "address": "shareledger1pafnpv3cthf8k0qf7n2hy9qxzdp3rawzw8e52k", + "status": "active" + }, + { + "key": "shrploadershareledger1pyw7adsw7we75n9f8lj68t8g8uu5ap462gsev0", + "address": "shareledger1pyw7adsw7we75n9f8lj68t8g8uu5ap462gsev0", + "status": "active" + }, + { + "key": "shrploadershareledger1qq86x7fh579vt9d93r7dyunmsvd8njgzf8vc92", + "address": "shareledger1qq86x7fh579vt9d93r7dyunmsvd8njgzf8vc92", + "status": "active" + }, + { + "key": "shrploadershareledger1r4crkrsn6mxjncj54hagnfl65ef4hw08yvy975", + "address": "shareledger1r4crkrsn6mxjncj54hagnfl65ef4hw08yvy975", + "status": "active" + }, + { + "key": "shrploadershareledger1rkqwwwlsu3rxds5gehu9j5lu6jtvlmc2pcmw5n", + "address": "shareledger1rkqwwwlsu3rxds5gehu9j5lu6jtvlmc2pcmw5n", + "status": "active" + }, + { + "key": "shrploadershareledger1uvjkdax474zn9ejyvy7zy4ntlwcay6hfjflw8h", + "address": "shareledger1uvjkdax474zn9ejyvy7zy4ntlwcay6hfjflw8h", + "status": "active" + }, + { + "key": "shrploadershareledger1wyr9mn9qpjlvd6q0wemsj4rzepff79q67yvhdd", + "address": "shareledger1wyr9mn9qpjlvd6q0wemsj4rzepff79q67yvhdd", + "status": "active" + }, + { + "key": "shrploadershareledger1ztmxdfzsdktnc5kvf4wkng8njqffnctv972ls5", + "address": "shareledger1ztmxdfzsdktnc5kvf4wkng8njqffnctv972ls5", + "status": "active" + }, + { + "key": "votershareledger1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9w7z28p", + "address": "shareledger1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9w7z28p", + "status": "active" + }, + { + "key": "votershareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + "address": "shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + "status": "active" + }, + { + "key": "votershareledger1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8glahgf", + "address": "shareledger1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8glahgf", + "status": "active" + }, + { + "key": "votershareledger1w4l5fchs69d9avlgvdehq9ypvdh4xyev3p490g", + "address": "shareledger1w4l5fchs69d9avlgvdehq9ypvdh4xyev3p490g", + "status": "active" + } + ], + "authority": { + "address": "shareledger19ac3d6cwqwpzvaxr4xv9kfduwtyswad88fjgw4" + }, + "treasurer": { + "address": "shareledger1hq7wjjgeymvs3q4vmkvac3dghfsjwvjvf8jdaw" + } + }, + "evidence": { + "evidence": [] + }, + "feegrant": { + "allowances": [] + }, + "gentlemint": { + "exchangeRate": { + "rate": "200" + }, + "levelFeeList": [], + "actionLevelFeeList": [] + }, + "genutil": { + "gen_txs": [] + }, + "gov": { + "deposit_params": { + "max_deposit_period": "172800s", + "min_deposit": [ + { + "amount": "10000000000000000", + "denom": "nshr" + } + ] + }, + "deposits": [], + "proposals": [], + "starting_proposal_id": "1", + "tally_params": { + "quorum": "0.334000000000000000", + "threshold": "0.500000000000000000", + "veto_threshold": "0.334000000000000000" + }, + "votes": [], + "voting_params": { + "voting_period": "172800s" + } + }, + "ibc": { + "channel_genesis": { + "ack_sequences": [], + "acknowledgements": [], + "channels": [], + "commitments": [], + "next_channel_sequence": "0", + "receipts": [], + "recv_sequences": [], + "send_sequences": [] + }, + "client_genesis": { + "clients": [], + "clients_consensus": [], + "clients_metadata": [], + "create_localhost": false, + "next_client_sequence": "0", + "params": { + "allowed_clients": [ + "06-solomachine", + "07-tendermint" + ] + } + }, + "connection_genesis": { + "client_connection_paths": [], + "connections": [], + "next_connection_sequence": "0", + "params": { + "max_expected_time_per_block": "30000000000" + } + } + }, + "id": { + "IDs": [ + { + "id": "shareledger102l2e2wg8auuzv3vwfxvjxwwn95xaagr5f7zmx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger102l2e2wg8auuzv3vwfxvjxwwn95xaagr5f7zmx", + "ownerAddress": "shareledger102l2e2wg8auuzv3vwfxvjxwwn95xaagr5f7zmx", + "extraData": "" + } + }, + { + "id": "shareledger102u6fl385282jnwvjfsvcxjnahsnfkgfurxaq9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger102u6fl385282jnwvjfsvcxjnahsnfkgfurxaq9", + "ownerAddress": "shareledger102u6fl385282jnwvjfsvcxjnahsnfkgfurxaq9", + "extraData": "" + } + }, + { + "id": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "ownerAddress": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "extraData": "" + } + }, + { + "id": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "ownerAddress": "shareledger10394rltujj9ctngcfm5a8xak3fq2vndg7v0554", + "extraData": "" + } + }, + { + "id": "shareledger103kps74kwnv23xe6myxj4zvvn8ksqpql06ufdv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger103kps74kwnv23xe6myxj4zvvn8ksqpql06ufdv", + "ownerAddress": "shareledger103kps74kwnv23xe6myxj4zvvn8ksqpql06ufdv", + "extraData": "" + } + }, + { + "id": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "ownerAddress": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "extraData": "" + } + }, + { + "id": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "ownerAddress": "shareledger104cjpt6y3azhn4tkutl5z3tz22as2ppl3mc3lu", + "extraData": "" + } + }, + { + "id": "shareledger104d87v5e9pxx3sh9kpaznyuwxccr8mv0pr0k32", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger104d87v5e9pxx3sh9kpaznyuwxccr8mv0pr0k32", + "ownerAddress": "shareledger104d87v5e9pxx3sh9kpaznyuwxccr8mv0pr0k32", + "extraData": "" + } + }, + { + "id": "shareledger104sh8trl7tc650mk5rt7x83su94sv7qsjs0htt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger104sh8trl7tc650mk5rt7x83su94sv7qsjs0htt", + "ownerAddress": "shareledger104sh8trl7tc650mk5rt7x83su94sv7qsjs0htt", + "extraData": "" + } + }, + { + "id": "shareledger1052069k30nr8ahj8sl0tk3yfqm0d5eccs6xqga", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1052069k30nr8ahj8sl0tk3yfqm0d5eccs6xqga", + "ownerAddress": "shareledger1052069k30nr8ahj8sl0tk3yfqm0d5eccs6xqga", + "extraData": "" + } + }, + { + "id": "shareledger1054gfpm2hp6mc3vmvpzl8ejx8a8nxwz2zm5mru", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1054gfpm2hp6mc3vmvpzl8ejx8a8nxwz2zm5mru", + "ownerAddress": "shareledger1054gfpm2hp6mc3vmvpzl8ejx8a8nxwz2zm5mru", + "extraData": "" + } + }, + { + "id": "shareledger105pr3jhvs3hpkl2lyv4u9yzsug86564ssp5hga", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger105pr3jhvs3hpkl2lyv4u9yzsug86564ssp5hga", + "ownerAddress": "shareledger105pr3jhvs3hpkl2lyv4u9yzsug86564ssp5hga", + "extraData": "" + } + }, + { + "id": "shareledger105u83pujnp3e7mjszq9x5w998vk6g82cr4zy43", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger105u83pujnp3e7mjszq9x5w998vk6g82cr4zy43", + "ownerAddress": "shareledger105u83pujnp3e7mjszq9x5w998vk6g82cr4zy43", + "extraData": "" + } + }, + { + "id": "shareledger1067e5jh6et7qgpd6spp6dnsyfg9yzdnlkvexca", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1067e5jh6et7qgpd6spp6dnsyfg9yzdnlkvexca", + "ownerAddress": "shareledger1067e5jh6et7qgpd6spp6dnsyfg9yzdnlkvexca", + "extraData": "" + } + }, + { + "id": "shareledger106ygha8ah756aucu6d7wttg9gtspvxwcwc2kt3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger106ygha8ah756aucu6d7wttg9gtspvxwcwc2kt3", + "ownerAddress": "shareledger106ygha8ah756aucu6d7wttg9gtspvxwcwc2kt3", + "extraData": "" + } + }, + { + "id": "shareledger10784nexh7metvn2ggsartszw0pv4r7swpv4hv2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10784nexh7metvn2ggsartszw0pv4r7swpv4hv2", + "ownerAddress": "shareledger10784nexh7metvn2ggsartszw0pv4r7swpv4hv2", + "extraData": "" + } + }, + { + "id": "shareledger108g2zednfqwtpppy3mrfxtx2rmux8fnvx49vzx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger108g2zednfqwtpppy3mrfxtx2rmux8fnvx49vzx", + "ownerAddress": "shareledger108g2zednfqwtpppy3mrfxtx2rmux8fnvx49vzx", + "extraData": "" + } + }, + { + "id": "shareledger109e7wfj3jfqk2t6d2kmw0myhplk8lma8yxyca9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger109e7wfj3jfqk2t6d2kmw0myhplk8lma8yxyca9", + "ownerAddress": "shareledger109e7wfj3jfqk2t6d2kmw0myhplk8lma8yxyca9", + "extraData": "" + } + }, + { + "id": "shareledger10afzc5l6a9rtdstcqtcs285gjnq86sylr602yy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10afzc5l6a9rtdstcqtcs285gjnq86sylr602yy", + "ownerAddress": "shareledger10afzc5l6a9rtdstcqtcs285gjnq86sylr602yy", + "extraData": "" + } + }, + { + "id": "shareledger10ak8cxz5ap437r420wuqgqaqg7tldlleg9nsj4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10ak8cxz5ap437r420wuqgqaqg7tldlleg9nsj4", + "ownerAddress": "shareledger10ak8cxz5ap437r420wuqgqaqg7tldlleg9nsj4", + "extraData": "" + } + }, + { + "id": "shareledger10awcsld9nkf0eanqyeq2wew5wjv8q3qpe6t8zz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10awcsld9nkf0eanqyeq2wew5wjv8q3qpe6t8zz", + "ownerAddress": "shareledger10awcsld9nkf0eanqyeq2wew5wjv8q3qpe6t8zz", + "extraData": "" + } + }, + { + "id": "shareledger10ce4ayesl8x90y4cc34jqudq7tfkphd6qzp8rz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10ce4ayesl8x90y4cc34jqudq7tfkphd6qzp8rz", + "ownerAddress": "shareledger10ce4ayesl8x90y4cc34jqudq7tfkphd6qzp8rz", + "extraData": "" + } + }, + { + "id": "shareledger10cgma3pf2ecqvq2dsa4dv24ngcwahg95v75589", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10cgma3pf2ecqvq2dsa4dv24ngcwahg95v75589", + "ownerAddress": "shareledger10cgma3pf2ecqvq2dsa4dv24ngcwahg95v75589", + "extraData": "" + } + }, + { + "id": "shareledger10ch2lllvvmxecszdcml5cvv7w4acl9ja2dcl70", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10ch2lllvvmxecszdcml5cvv7w4acl9ja2dcl70", + "ownerAddress": "shareledger10ch2lllvvmxecszdcml5cvv7w4acl9ja2dcl70", + "extraData": "" + } + }, + { + "id": "shareledger10egj3nafz3vk6hlnyj7zfg2tkqwul5devkxxfx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10egj3nafz3vk6hlnyj7zfg2tkqwul5devkxxfx", + "ownerAddress": "shareledger10egj3nafz3vk6hlnyj7zfg2tkqwul5devkxxfx", + "extraData": "" + } + }, + { + "id": "shareledger10eh4fww4lgk0hmml84eexu7w5tvj7f52xvzgta", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10eh4fww4lgk0hmml84eexu7w5tvj7f52xvzgta", + "ownerAddress": "shareledger10eh4fww4lgk0hmml84eexu7w5tvj7f52xvzgta", + "extraData": "" + } + }, + { + "id": "shareledger10f7lcaa0y8z5cg3ulgjl6fsqk8w6g8hwvhymhc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10f7lcaa0y8z5cg3ulgjl6fsqk8w6g8hwvhymhc", + "ownerAddress": "shareledger10f7lcaa0y8z5cg3ulgjl6fsqk8w6g8hwvhymhc", + "extraData": "" + } + }, + { + "id": "shareledger10jrymlw7hy5xj74k5vyj3hd0jgy9szma8zsz7v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10jrymlw7hy5xj74k5vyj3hd0jgy9szma8zsz7v", + "ownerAddress": "shareledger10jrymlw7hy5xj74k5vyj3hd0jgy9szma8zsz7v", + "extraData": "" + } + }, + { + "id": "shareledger10kqt2gg3rp8ac0p0trky7fcfp7dp8enptq295y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10kqt2gg3rp8ac0p0trky7fcfp7dp8enptq295y", + "ownerAddress": "shareledger10kqt2gg3rp8ac0p0trky7fcfp7dp8enptq295y", + "extraData": "" + } + }, + { + "id": "shareledger10mptcsgynk9p60zrljjpt5quk29qqgka7v74le", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10mptcsgynk9p60zrljjpt5quk29qqgka7v74le", + "ownerAddress": "shareledger10mptcsgynk9p60zrljjpt5quk29qqgka7v74le", + "extraData": "" + } + }, + { + "id": "shareledger10n4882yyvrc2fyvfzuezcd7gnkwt5mcea8p5g0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10n4882yyvrc2fyvfzuezcd7gnkwt5mcea8p5g0", + "ownerAddress": "shareledger10n4882yyvrc2fyvfzuezcd7gnkwt5mcea8p5g0", + "extraData": "" + } + }, + { + "id": "shareledger10ndy587h8rmdec054338nwrv5wk9zsxkutrx2q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10ndy587h8rmdec054338nwrv5wk9zsxkutrx2q", + "ownerAddress": "shareledger10ndy587h8rmdec054338nwrv5wk9zsxkutrx2q", + "extraData": "" + } + }, + { + "id": "shareledger10ps74dg9wzypdp2pkp3v3m65dny4ryv0ghuxsq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10ps74dg9wzypdp2pkp3v3m65dny4ryv0ghuxsq", + "ownerAddress": "shareledger10ps74dg9wzypdp2pkp3v3m65dny4ryv0ghuxsq", + "extraData": "" + } + }, + { + "id": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "ownerAddress": "shareledger10r8xj45957p7q8a2scau3aft5cnkumj8z74nu3", + "extraData": "" + } + }, + { + "id": "shareledger10rrxnkcdyckqg0lnvkn8j52gyghng7a93uljep", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10rrxnkcdyckqg0lnvkn8j52gyghng7a93uljep", + "ownerAddress": "shareledger10rrxnkcdyckqg0lnvkn8j52gyghng7a93uljep", + "extraData": "" + } + }, + { + "id": "shareledger10rs7c07y8y58shjpy5htq9t2taemn65fazf6dp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10rs7c07y8y58shjpy5htq9t2taemn65fazf6dp", + "ownerAddress": "shareledger10rs7c07y8y58shjpy5htq9t2taemn65fazf6dp", + "extraData": "" + } + }, + { + "id": "shareledger10sgaadzkhmfnavydaa9tdm05xr2aj7exqt6vj6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10sgaadzkhmfnavydaa9tdm05xr2aj7exqt6vj6", + "ownerAddress": "shareledger10sgaadzkhmfnavydaa9tdm05xr2aj7exqt6vj6", + "extraData": "" + } + }, + { + "id": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "ownerAddress": "shareledger10svsxkf0svvxqlt6uwctd3y8ynkcsh2j36k5ua", + "extraData": "" + } + }, + { + "id": "shareledger10t3p624nzdvhu4ezujw7a25dh36crpnzt6rdux", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10t3p624nzdvhu4ezujw7a25dh36crpnzt6rdux", + "ownerAddress": "shareledger10t3p624nzdvhu4ezujw7a25dh36crpnzt6rdux", + "extraData": "" + } + }, + { + "id": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "ownerAddress": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "extraData": "" + } + }, + { + "id": "shareledger10ukkafjem7xh5hdep6f0vgrrpyrggumqmltp26", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10ukkafjem7xh5hdep6f0vgrrpyrggumqmltp26", + "ownerAddress": "shareledger10ukkafjem7xh5hdep6f0vgrrpyrggumqmltp26", + "extraData": "" + } + }, + { + "id": "shareledger10uzk2tk7tfk62m0xrnk3mq2dktc0epd65sqxq3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10uzk2tk7tfk62m0xrnk3mq2dktc0epd65sqxq3", + "ownerAddress": "shareledger10uzk2tk7tfk62m0xrnk3mq2dktc0epd65sqxq3", + "extraData": "" + } + }, + { + "id": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "ownerAddress": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "extraData": "" + } + }, + { + "id": "shareledger10v2snd8gpduwqasyj85znf0e7zfz5u6qgmfxwy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10v2snd8gpduwqasyj85znf0e7zfz5u6qgmfxwy", + "ownerAddress": "shareledger10v2snd8gpduwqasyj85znf0e7zfz5u6qgmfxwy", + "extraData": "" + } + }, + { + "id": "shareledger10vkygvsuky25swdv5kc9jls8le3kj03696gnkg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10vkygvsuky25swdv5kc9jls8le3kj03696gnkg", + "ownerAddress": "shareledger10vkygvsuky25swdv5kc9jls8le3kj03696gnkg", + "extraData": "" + } + }, + { + "id": "shareledger10wnsdwhzmnnuy8ddswafjr6l3n6fc9g24ny2tg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10wnsdwhzmnnuy8ddswafjr6l3n6fc9g24ny2tg", + "ownerAddress": "shareledger10wnsdwhzmnnuy8ddswafjr6l3n6fc9g24ny2tg", + "extraData": "" + } + }, + { + "id": "shareledger10xldm6y5uyf09xtgwaqrrpuppg7nhdf03x4zep", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10xldm6y5uyf09xtgwaqrrpuppg7nhdf03x4zep", + "ownerAddress": "shareledger10xldm6y5uyf09xtgwaqrrpuppg7nhdf03x4zep", + "extraData": "" + } + }, + { + "id": "shareledger10xtkp9uqekr69vzmh4chwm9k27ujutlv2r94x5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10xtkp9uqekr69vzmh4chwm9k27ujutlv2r94x5", + "ownerAddress": "shareledger10xtkp9uqekr69vzmh4chwm9k27ujutlv2r94x5", + "extraData": "" + } + }, + { + "id": "shareledger10xxs2e3vuxr9ftnzf29s3p2mx85pdzllfaeq6v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10xxs2e3vuxr9ftnzf29s3p2mx85pdzllfaeq6v", + "ownerAddress": "shareledger10xxs2e3vuxr9ftnzf29s3p2mx85pdzllfaeq6v", + "extraData": "" + } + }, + { + "id": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "ownerAddress": "shareledger10y2ugnad72lggn8rfesajzfg5g3anc2umc9ld0", + "extraData": "" + } + }, + { + "id": "shareledger10ykgm8yknntec3h4csyqlm7yk4zna7zp0mx2f0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10ykgm8yknntec3h4csyqlm7yk4zna7zp0mx2f0", + "ownerAddress": "shareledger10ykgm8yknntec3h4csyqlm7yk4zna7zp0mx2f0", + "extraData": "" + } + }, + { + "id": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "ownerAddress": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "extraData": "" + } + }, + { + "id": "shareledger10z0qv8vl6z0ua4e0q0jufnncq6h6m0kkyekf2y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10z0qv8vl6z0ua4e0q0jufnncq6h6m0kkyekf2y", + "ownerAddress": "shareledger10z0qv8vl6z0ua4e0q0jufnncq6h6m0kkyekf2y", + "extraData": "" + } + }, + { + "id": "shareledger10z7u3wz0n6mfrdwzfnmsk6dqtq7lwq908qqh3s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10z7u3wz0n6mfrdwzfnmsk6dqtq7lwq908qqh3s", + "ownerAddress": "shareledger10z7u3wz0n6mfrdwzfnmsk6dqtq7lwq908qqh3s", + "extraData": "" + } + }, + { + "id": "shareledger10zej9tc7725ft3q43vl4kqr6xsr5jv3vzg3trl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger10zej9tc7725ft3q43vl4kqr6xsr5jv3vzg3trl", + "ownerAddress": "shareledger10zej9tc7725ft3q43vl4kqr6xsr5jv3vzg3trl", + "extraData": "" + } + }, + { + "id": "shareledger122gk69qd26pqrv9gt4stjkdr7uf607s9paqfd2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger122gk69qd26pqrv9gt4stjkdr7uf607s9paqfd2", + "ownerAddress": "shareledger122gk69qd26pqrv9gt4stjkdr7uf607s9paqfd2", + "extraData": "" + } + }, + { + "id": "shareledger122v95upe4ye4nthpay63wjrzqczgy6y0qynzuv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger122v95upe4ye4nthpay63wjrzqczgy6y0qynzuv", + "ownerAddress": "shareledger122v95upe4ye4nthpay63wjrzqczgy6y0qynzuv", + "extraData": "" + } + }, + { + "id": "shareledger12334p4yg8gfxcw4y4uweucv7lxm9fsgs60erya", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12334p4yg8gfxcw4y4uweucv7lxm9fsgs60erya", + "ownerAddress": "shareledger12334p4yg8gfxcw4y4uweucv7lxm9fsgs60erya", + "extraData": "" + } + }, + { + "id": "shareledger123ern33060ks6lprah7jv8323gy0yejx5kz53g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger123ern33060ks6lprah7jv8323gy0yejx5kz53g", + "ownerAddress": "shareledger123ern33060ks6lprah7jv8323gy0yejx5kz53g", + "extraData": "" + } + }, + { + "id": "shareledger123xrl7e4vmzfvwpj0q7rlm2sem25x2a9r9qndg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger123xrl7e4vmzfvwpj0q7rlm2sem25x2a9r9qndg", + "ownerAddress": "shareledger123xrl7e4vmzfvwpj0q7rlm2sem25x2a9r9qndg", + "extraData": "" + } + }, + { + "id": "shareledger126dgtw9mxyzgjcwyky2fkutw3tt6l9vqnl6mg9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger126dgtw9mxyzgjcwyky2fkutw3tt6l9vqnl6mg9", + "ownerAddress": "shareledger126dgtw9mxyzgjcwyky2fkutw3tt6l9vqnl6mg9", + "extraData": "" + } + }, + { + "id": "shareledger126naavtzeqgsktvrw0flukpm05kwc5050lcl0h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger126naavtzeqgsktvrw0flukpm05kwc5050lcl0h", + "ownerAddress": "shareledger126naavtzeqgsktvrw0flukpm05kwc5050lcl0h", + "extraData": "" + } + }, + { + "id": "shareledger127apvn5cc6a66zh3t7szxx69kmu5qzldzfjly6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger127apvn5cc6a66zh3t7szxx69kmu5qzldzfjly6", + "ownerAddress": "shareledger127apvn5cc6a66zh3t7szxx69kmu5qzldzfjly6", + "extraData": "" + } + }, + { + "id": "shareledger127vgekkmhmwcf9gt6gjrfq5m5v28emmn6sr0mj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger127vgekkmhmwcf9gt6gjrfq5m5v28emmn6sr0mj", + "ownerAddress": "shareledger127vgekkmhmwcf9gt6gjrfq5m5v28emmn6sr0mj", + "extraData": "" + } + }, + { + "id": "shareledger127wmdzeq9xxwu03p4dltwk8hx6mr72y2sy9eg4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger127wmdzeq9xxwu03p4dltwk8hx6mr72y2sy9eg4", + "ownerAddress": "shareledger127wmdzeq9xxwu03p4dltwk8hx6mr72y2sy9eg4", + "extraData": "" + } + }, + { + "id": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "ownerAddress": "shareledger128dvmmmwu8s4nztxe75huycyl29vgg5cy0nsrd", + "extraData": "" + } + }, + { + "id": "shareledger12d8j99suhhnuj6m8l5lajwerrvn0yjkvvzu9px", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12d8j99suhhnuj6m8l5lajwerrvn0yjkvvzu9px", + "ownerAddress": "shareledger12d8j99suhhnuj6m8l5lajwerrvn0yjkvvzu9px", + "extraData": "" + } + }, + { + "id": "shareledger12e9wdezndkxtxzx29dqv65pk77xq7za2y7jhlk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12e9wdezndkxtxzx29dqv65pk77xq7za2y7jhlk", + "ownerAddress": "shareledger12e9wdezndkxtxzx29dqv65pk77xq7za2y7jhlk", + "extraData": "" + } + }, + { + "id": "shareledger12kmgxdmsrvuq3r0gctqtfkaagxa85t73fed732", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12kmgxdmsrvuq3r0gctqtfkaagxa85t73fed732", + "ownerAddress": "shareledger12kmgxdmsrvuq3r0gctqtfkaagxa85t73fed732", + "extraData": "" + } + }, + { + "id": "shareledger12mua95xw7kquv2fd057wvczty9m4xqgk0x2w97", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12mua95xw7kquv2fd057wvczty9m4xqgk0x2w97", + "ownerAddress": "shareledger12mua95xw7kquv2fd057wvczty9m4xqgk0x2w97", + "extraData": "" + } + }, + { + "id": "shareledger12mvnvx64yju9vnankkusy4plzskwmndtmj6lj6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12mvnvx64yju9vnankkusy4plzskwmndtmj6lj6", + "ownerAddress": "shareledger12mvnvx64yju9vnankkusy4plzskwmndtmj6lj6", + "extraData": "" + } + }, + { + "id": "shareledger12n0xl76eh6uw6aw3qznljhm6g7v99vy6csnhkp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12n0xl76eh6uw6aw3qznljhm6g7v99vy6csnhkp", + "ownerAddress": "shareledger12n0xl76eh6uw6aw3qznljhm6g7v99vy6csnhkp", + "extraData": "" + } + }, + { + "id": "shareledger12p5y8ngc8y46cl6ygn8c52q9f0wqc0egq5yh0m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12p5y8ngc8y46cl6ygn8c52q9f0wqc0egq5yh0m", + "ownerAddress": "shareledger12p5y8ngc8y46cl6ygn8c52q9f0wqc0egq5yh0m", + "extraData": "" + } + }, + { + "id": "shareledger12pcp7u9nq8x6u0vwrufc8l9j48mvl8qf9a0rwj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12pcp7u9nq8x6u0vwrufc8l9j48mvl8qf9a0rwj", + "ownerAddress": "shareledger12pcp7u9nq8x6u0vwrufc8l9j48mvl8qf9a0rwj", + "extraData": "" + } + }, + { + "id": "shareledger12pfcd4qlhm8ga8ckud0rj7g97m7tez2wm4gagp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12pfcd4qlhm8ga8ckud0rj7g97m7tez2wm4gagp", + "ownerAddress": "shareledger12pfcd4qlhm8ga8ckud0rj7g97m7tez2wm4gagp", + "extraData": "" + } + }, + { + "id": "shareledger12qlmeq9h6vje5ynpruuhkj2pf5ntx7aqd929k0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12qlmeq9h6vje5ynpruuhkj2pf5ntx7aqd929k0", + "ownerAddress": "shareledger12qlmeq9h6vje5ynpruuhkj2pf5ntx7aqd929k0", + "extraData": "" + } + }, + { + "id": "shareledger12qr8xd766lx8yuj2lnuxdhnu540h2c83ys72hx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12qr8xd766lx8yuj2lnuxdhnu540h2c83ys72hx", + "ownerAddress": "shareledger12qr8xd766lx8yuj2lnuxdhnu540h2c83ys72hx", + "extraData": "" + } + }, + { + "id": "shareledger12qyz8aejy305sn8q7q694vs6gftzm0mzr4x3lz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12qyz8aejy305sn8q7q694vs6gftzm0mzr4x3lz", + "ownerAddress": "shareledger12qyz8aejy305sn8q7q694vs6gftzm0mzr4x3lz", + "extraData": "" + } + }, + { + "id": "shareledger12ra2sfswe54c37lwre2eh933qqfqv8tna3jj8n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12ra2sfswe54c37lwre2eh933qqfqv8tna3jj8n", + "ownerAddress": "shareledger12ra2sfswe54c37lwre2eh933qqfqv8tna3jj8n", + "extraData": "" + } + }, + { + "id": "shareledger12rq2v3dhsx6460ahp2af0uwvkths4hpksdhf3k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12rq2v3dhsx6460ahp2af0uwvkths4hpksdhf3k", + "ownerAddress": "shareledger12rq2v3dhsx6460ahp2af0uwvkths4hpksdhf3k", + "extraData": "" + } + }, + { + "id": "shareledger12ry7qkhcu9nkk63r0zepzrs55k6yhn3ns89jvc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12ry7qkhcu9nkk63r0zepzrs55k6yhn3ns89jvc", + "ownerAddress": "shareledger12ry7qkhcu9nkk63r0zepzrs55k6yhn3ns89jvc", + "extraData": "" + } + }, + { + "id": "shareledger12s3sae9m328j3hr3uv3glh7eg584gkr6zrmks5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12s3sae9m328j3hr3uv3glh7eg584gkr6zrmks5", + "ownerAddress": "shareledger12s3sae9m328j3hr3uv3glh7eg584gkr6zrmks5", + "extraData": "" + } + }, + { + "id": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "ownerAddress": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "extraData": "" + } + }, + { + "id": "shareledger12t89z96n97vct9h6vd50tutzwqul9wk4z7v9e0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12t89z96n97vct9h6vd50tutzwqul9wk4z7v9e0", + "ownerAddress": "shareledger12t89z96n97vct9h6vd50tutzwqul9wk4z7v9e0", + "extraData": "" + } + }, + { + "id": "shareledger12u8qutra2cfzl07dwkzxfg32lv6k4mz5zguttk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12u8qutra2cfzl07dwkzxfg32lv6k4mz5zguttk", + "ownerAddress": "shareledger12u8qutra2cfzl07dwkzxfg32lv6k4mz5zguttk", + "extraData": "" + } + }, + { + "id": "shareledger12umetguevuffzqrq2vy9e55f5vnalg9733vxnt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12umetguevuffzqrq2vy9e55f5vnalg9733vxnt", + "ownerAddress": "shareledger12umetguevuffzqrq2vy9e55f5vnalg9733vxnt", + "extraData": "" + } + }, + { + "id": "shareledger12uszlqp727fg4rsftzwhs4e4t6q9cvrkzqkw0q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12uszlqp727fg4rsftzwhs4e4t6q9cvrkzqkw0q", + "ownerAddress": "shareledger12uszlqp727fg4rsftzwhs4e4t6q9cvrkzqkw0q", + "extraData": "" + } + }, + { + "id": "shareledger12wq2r03tlwcx57ejftnm2nek00a3xg47k2f5uy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12wq2r03tlwcx57ejftnm2nek00a3xg47k2f5uy", + "ownerAddress": "shareledger12wq2r03tlwcx57ejftnm2nek00a3xg47k2f5uy", + "extraData": "" + } + }, + { + "id": "shareledger12xtxksdmalemezy0h93rhp8lld3f0kyhrnqlpk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12xtxksdmalemezy0h93rhp8lld3f0kyhrnqlpk", + "ownerAddress": "shareledger12xtxksdmalemezy0h93rhp8lld3f0kyhrnqlpk", + "extraData": "" + } + }, + { + "id": "shareledger12xxwcampgumwetfcayg20qeufsy2wral28jwec", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12xxwcampgumwetfcayg20qeufsy2wral28jwec", + "ownerAddress": "shareledger12xxwcampgumwetfcayg20qeufsy2wral28jwec", + "extraData": "" + } + }, + { + "id": "shareledger12zt5k0nudnaspkf9smlgxstpaqhvldx8hrkvwt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger12zt5k0nudnaspkf9smlgxstpaqhvldx8hrkvwt", + "ownerAddress": "shareledger12zt5k0nudnaspkf9smlgxstpaqhvldx8hrkvwt", + "extraData": "" + } + }, + { + "id": "shareledger1300uq43uz7fruqtqzrdndh7m3kw6czzuvg3n8n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1300uq43uz7fruqtqzrdndh7m3kw6czzuvg3n8n", + "ownerAddress": "shareledger1300uq43uz7fruqtqzrdndh7m3kw6czzuvg3n8n", + "extraData": "" + } + }, + { + "id": "shareledger130zqgsnvtwze8qkwmjwkvpy8jxwz6ny6ssmtck", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger130zqgsnvtwze8qkwmjwkvpy8jxwz6ny6ssmtck", + "ownerAddress": "shareledger130zqgsnvtwze8qkwmjwkvpy8jxwz6ny6ssmtck", + "extraData": "" + } + }, + { + "id": "shareledger132phlgz6ufl2ajk835gjh55fhczh7t60rtyjgk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger132phlgz6ufl2ajk835gjh55fhczh7t60rtyjgk", + "ownerAddress": "shareledger132phlgz6ufl2ajk835gjh55fhczh7t60rtyjgk", + "extraData": "" + } + }, + { + "id": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "ownerAddress": "shareledger132zq66tn0tlx4h3d8zfm04qjjlrde6q5ltulr8", + "extraData": "" + } + }, + { + "id": "shareledger133ekdf36nfy4tadwqyca0ha2zt9klrkmdjnjcq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger133ekdf36nfy4tadwqyca0ha2zt9klrkmdjnjcq", + "ownerAddress": "shareledger133ekdf36nfy4tadwqyca0ha2zt9klrkmdjnjcq", + "extraData": "" + } + }, + { + "id": "shareledger134mucv2szzgy6c9nqw69m289448pm6t0vr4m46", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger134mucv2szzgy6c9nqw69m289448pm6t0vr4m46", + "ownerAddress": "shareledger134mucv2szzgy6c9nqw69m289448pm6t0vr4m46", + "extraData": "" + } + }, + { + "id": "shareledger1353yrx5xhurzzkqj3tu8kn6wv59y0xagq4hkrj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1353yrx5xhurzzkqj3tu8kn6wv59y0xagq4hkrj", + "ownerAddress": "shareledger1353yrx5xhurzzkqj3tu8kn6wv59y0xagq4hkrj", + "extraData": "" + } + }, + { + "id": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "ownerAddress": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "extraData": "" + } + }, + { + "id": "shareledger13a3079k2pf4hpkj52avtajetjkzzgzextt4xf2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13a3079k2pf4hpkj52avtajetjkzzgzextt4xf2", + "ownerAddress": "shareledger13a3079k2pf4hpkj52avtajetjkzzgzextt4xf2", + "extraData": "" + } + }, + { + "id": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "ownerAddress": "shareledger13a3hgge6l83qx4ycygv533nnfy9z3nxxnuz49l", + "extraData": "" + } + }, + { + "id": "shareledger13a640s6vn8s4v8rjl8fz6kuaf5y6hft43j6fjq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13a640s6vn8s4v8rjl8fz6kuaf5y6hft43j6fjq", + "ownerAddress": "shareledger13a640s6vn8s4v8rjl8fz6kuaf5y6hft43j6fjq", + "extraData": "" + } + }, + { + "id": "shareledger13a838fm9z6lpj2lqs7s7t5hnpjhup8q9z0tsrt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13a838fm9z6lpj2lqs7s7t5hnpjhup8q9z0tsrt", + "ownerAddress": "shareledger13a838fm9z6lpj2lqs7s7t5hnpjhup8q9z0tsrt", + "extraData": "" + } + }, + { + "id": "shareledger13c49kkmn2lue2nf8na897qut472swz750w2eeq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13c49kkmn2lue2nf8na897qut472swz750w2eeq", + "ownerAddress": "shareledger13c49kkmn2lue2nf8na897qut472swz750w2eeq", + "extraData": "" + } + }, + { + "id": "shareledger13cvr3xu0a2zjarx6ec8r9647dp8faa7w4p3pt5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13cvr3xu0a2zjarx6ec8r9647dp8faa7w4p3pt5", + "ownerAddress": "shareledger13cvr3xu0a2zjarx6ec8r9647dp8faa7w4p3pt5", + "extraData": "" + } + }, + { + "id": "shareledger13e2uzceccpfsyel6le5welrjp2gtjngqvpzeed", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13e2uzceccpfsyel6le5welrjp2gtjngqvpzeed", + "ownerAddress": "shareledger13e2uzceccpfsyel6le5welrjp2gtjngqvpzeed", + "extraData": "" + } + }, + { + "id": "shareledger13gj3w4x83gez4yj69az4ax67epzlgdnrm9h6a7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13gj3w4x83gez4yj69az4ax67epzlgdnrm9h6a7", + "ownerAddress": "shareledger13gj3w4x83gez4yj69az4ax67epzlgdnrm9h6a7", + "extraData": "" + } + }, + { + "id": "shareledger13gwp0yq33k7dqg09x9pu2me88q4thphx5ez667", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13gwp0yq33k7dqg09x9pu2me88q4thphx5ez667", + "ownerAddress": "shareledger13gwp0yq33k7dqg09x9pu2me88q4thphx5ez667", + "extraData": "" + } + }, + { + "id": "shareledger13gyk5vseww6v30k3wp4wvend5t9kel2kj76fpy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13gyk5vseww6v30k3wp4wvend5t9kel2kj76fpy", + "ownerAddress": "shareledger13gyk5vseww6v30k3wp4wvend5t9kel2kj76fpy", + "extraData": "" + } + }, + { + "id": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "ownerAddress": "shareledger13hsvjdktnjl5envxzhh7yjt0yzjtpdne7hhr5r", + "extraData": "" + } + }, + { + "id": "shareledger13kddea0f0xxjdpt6vm0dz3yxcnv5nsseveypcm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13kddea0f0xxjdpt6vm0dz3yxcnv5nsseveypcm", + "ownerAddress": "shareledger13kddea0f0xxjdpt6vm0dz3yxcnv5nsseveypcm", + "extraData": "" + } + }, + { + "id": "shareledger13ledethatn9a274xjf89u88kk33w0rljx07sy2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13ledethatn9a274xjf89u88kk33w0rljx07sy2", + "ownerAddress": "shareledger13ledethatn9a274xjf89u88kk33w0rljx07sy2", + "extraData": "" + } + }, + { + "id": "shareledger13mjjv7y40zvv9766ndclyhar44vup625mwy6ge", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13mjjv7y40zvv9766ndclyhar44vup625mwy6ge", + "ownerAddress": "shareledger13mjjv7y40zvv9766ndclyhar44vup625mwy6ge", + "extraData": "" + } + }, + { + "id": "shareledger13n39ckqvvk5dm26kj45uwgkjavw0qh8257pnvr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13n39ckqvvk5dm26kj45uwgkjavw0qh8257pnvr", + "ownerAddress": "shareledger13n39ckqvvk5dm26kj45uwgkjavw0qh8257pnvr", + "extraData": "" + } + }, + { + "id": "shareledger13n6jyhkdrs92yqmeqvj5gr3cc3nqa9fuc4lsdg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13n6jyhkdrs92yqmeqvj5gr3cc3nqa9fuc4lsdg", + "ownerAddress": "shareledger13n6jyhkdrs92yqmeqvj5gr3cc3nqa9fuc4lsdg", + "extraData": "" + } + }, + { + "id": "shareledger13pjy44adup78p84tncxd5x0ynyj0fyv0ehdqpw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13pjy44adup78p84tncxd5x0ynyj0fyv0ehdqpw", + "ownerAddress": "shareledger13pjy44adup78p84tncxd5x0ynyj0fyv0ehdqpw", + "extraData": "" + } + }, + { + "id": "shareledger13pmfkcwst8z9442q7un7r7k07txu6849y98n38", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13pmfkcwst8z9442q7un7r7k07txu6849y98n38", + "ownerAddress": "shareledger13pmfkcwst8z9442q7un7r7k07txu6849y98n38", + "extraData": "" + } + }, + { + "id": "shareledger13pwscfwm6v9l2gujnqv04pn0gns59ng35vnjqt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13pwscfwm6v9l2gujnqv04pn0gns59ng35vnjqt", + "ownerAddress": "shareledger13pwscfwm6v9l2gujnqv04pn0gns59ng35vnjqt", + "extraData": "" + } + }, + { + "id": "shareledger13qrkzy3zq7ny3s6pc4fqze36q6dpc8uev7jq69", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13qrkzy3zq7ny3s6pc4fqze36q6dpc8uev7jq69", + "ownerAddress": "shareledger13qrkzy3zq7ny3s6pc4fqze36q6dpc8uev7jq69", + "extraData": "" + } + }, + { + "id": "shareledger13r92p5gve08s95vv5gzewf9lpsvqu67223zjkp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13r92p5gve08s95vv5gzewf9lpsvqu67223zjkp", + "ownerAddress": "shareledger13r92p5gve08s95vv5gzewf9lpsvqu67223zjkp", + "extraData": "" + } + }, + { + "id": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "ownerAddress": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "extraData": "" + } + }, + { + "id": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "ownerAddress": "shareledger13s80eqrqzz06aa553ra6x5usn7mjdkl9ha3k4a", + "extraData": "" + } + }, + { + "id": "shareledger13t3dke80pt0kq4m5fyhen552qs4z8mc348530t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13t3dke80pt0kq4m5fyhen552qs4z8mc348530t", + "ownerAddress": "shareledger13t3dke80pt0kq4m5fyhen552qs4z8mc348530t", + "extraData": "" + } + }, + { + "id": "shareledger13tlmnzph993ujxm7zz0g9qww7jldfl0hk3k0lz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13tlmnzph993ujxm7zz0g9qww7jldfl0hk3k0lz", + "ownerAddress": "shareledger13tlmnzph993ujxm7zz0g9qww7jldfl0hk3k0lz", + "extraData": "" + } + }, + { + "id": "shareledger13tw08pxsqjtmrp89t0xchmh7hgtees9daqgw70", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13tw08pxsqjtmrp89t0xchmh7hgtees9daqgw70", + "ownerAddress": "shareledger13tw08pxsqjtmrp89t0xchmh7hgtees9daqgw70", + "extraData": "" + } + }, + { + "id": "shareledger13u6wjqnzetfkpuwujsj8403yh6272ygrdrvptw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13u6wjqnzetfkpuwujsj8403yh6272ygrdrvptw", + "ownerAddress": "shareledger13u6wjqnzetfkpuwujsj8403yh6272ygrdrvptw", + "extraData": "" + } + }, + { + "id": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "ownerAddress": "shareledger13vpr2cdmnl67yzxk2j7yh43l69cf82jhmthghe", + "extraData": "" + } + }, + { + "id": "shareledger13vqzhzmmzd60jyp44mgrpf9r7t33jc3arnpk2h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13vqzhzmmzd60jyp44mgrpf9r7t33jc3arnpk2h", + "ownerAddress": "shareledger13vqzhzmmzd60jyp44mgrpf9r7t33jc3arnpk2h", + "extraData": "" + } + }, + { + "id": "shareledger13vts4zarv5n2z73flal844flexf3gtqvvajfc9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13vts4zarv5n2z73flal844flexf3gtqvvajfc9", + "ownerAddress": "shareledger13vts4zarv5n2z73flal844flexf3gtqvvajfc9", + "extraData": "" + } + }, + { + "id": "shareledger13w9jp0fcrugm4sayzfvycwzzk39peur8ferpce", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13w9jp0fcrugm4sayzfvycwzzk39peur8ferpce", + "ownerAddress": "shareledger13w9jp0fcrugm4sayzfvycwzzk39peur8ferpce", + "extraData": "" + } + }, + { + "id": "shareledger13wvrkd4sycldtfxejet80w4vmw3clvfy55wpqc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13wvrkd4sycldtfxejet80w4vmw3clvfy55wpqc", + "ownerAddress": "shareledger13wvrkd4sycldtfxejet80w4vmw3clvfy55wpqc", + "extraData": "" + } + }, + { + "id": "shareledger13xu4s4j5zcdfzfhuq6ttdzun85g2q0hn2vrpgv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13xu4s4j5zcdfzfhuq6ttdzun85g2q0hn2vrpgv", + "ownerAddress": "shareledger13xu4s4j5zcdfzfhuq6ttdzun85g2q0hn2vrpgv", + "extraData": "" + } + }, + { + "id": "shareledger13ymjkpkymme4cpf272fvjlg8azccr8r3r98sj4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13ymjkpkymme4cpf272fvjlg8azccr8r3r98sj4", + "ownerAddress": "shareledger13ymjkpkymme4cpf272fvjlg8azccr8r3r98sj4", + "extraData": "" + } + }, + { + "id": "shareledger13yxmhe2xsy9lh3prfleclnp2rtpp7dtpwzlewm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13yxmhe2xsy9lh3prfleclnp2rtpp7dtpwzlewm", + "ownerAddress": "shareledger13yxmhe2xsy9lh3prfleclnp2rtpp7dtpwzlewm", + "extraData": "" + } + }, + { + "id": "shareledger13yxze9wsaqcew6hs8qedu6fvnl2j068ftwv4aa", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger13yxze9wsaqcew6hs8qedu6fvnl2j068ftwv4aa", + "ownerAddress": "shareledger13yxze9wsaqcew6hs8qedu6fvnl2j068ftwv4aa", + "extraData": "" + } + }, + { + "id": "shareledger1406593d0nsy68gelk32svwckjlxlpnkaf5npxj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1406593d0nsy68gelk32svwckjlxlpnkaf5npxj", + "ownerAddress": "shareledger1406593d0nsy68gelk32svwckjlxlpnkaf5npxj", + "extraData": "" + } + }, + { + "id": "shareledger140kjh95n6td9lf4j7s60gsvfhzfq9valyexj43", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger140kjh95n6td9lf4j7s60gsvfhzfq9valyexj43", + "ownerAddress": "shareledger140kjh95n6td9lf4j7s60gsvfhzfq9valyexj43", + "extraData": "" + } + }, + { + "id": "shareledger140s8dk8sx9w5yd4vk8axlhe0xqulynazvzauhv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger140s8dk8sx9w5yd4vk8axlhe0xqulynazvzauhv", + "ownerAddress": "shareledger140s8dk8sx9w5yd4vk8axlhe0xqulynazvzauhv", + "extraData": "" + } + }, + { + "id": "shareledger142a5mx9kz9p9qw6tc0ttst5g42yl06n02pdea5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger142a5mx9kz9p9qw6tc0ttst5g42yl06n02pdea5", + "ownerAddress": "shareledger142a5mx9kz9p9qw6tc0ttst5g42yl06n02pdea5", + "extraData": "" + } + }, + { + "id": "shareledger142awx25tnh8kcf8j35fwrsucp8kgjknzwmtn2g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger142awx25tnh8kcf8j35fwrsucp8kgjknzwmtn2g", + "ownerAddress": "shareledger142awx25tnh8kcf8j35fwrsucp8kgjknzwmtn2g", + "extraData": "" + } + }, + { + "id": "shareledger1432966tm58820zz8terp53w9pmvsh6d70p4pue", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1432966tm58820zz8terp53w9pmvsh6d70p4pue", + "ownerAddress": "shareledger1432966tm58820zz8terp53w9pmvsh6d70p4pue", + "extraData": "" + } + }, + { + "id": "shareledger1433hkhn4jjakkw0g5zch9naxy2rwumdt3ks5ad", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1433hkhn4jjakkw0g5zch9naxy2rwumdt3ks5ad", + "ownerAddress": "shareledger1433hkhn4jjakkw0g5zch9naxy2rwumdt3ks5ad", + "extraData": "" + } + }, + { + "id": "shareledger144mrscguprm4lw32r69yczs00r4n3d4dem5v5w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger144mrscguprm4lw32r69yczs00r4n3d4dem5v5w", + "ownerAddress": "shareledger144mrscguprm4lw32r69yczs00r4n3d4dem5v5w", + "extraData": "" + } + }, + { + "id": "shareledger145yulsfy7hd3ry0ulxneed27fh76xgsf5ze903", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger145yulsfy7hd3ry0ulxneed27fh76xgsf5ze903", + "ownerAddress": "shareledger145yulsfy7hd3ry0ulxneed27fh76xgsf5ze903", + "extraData": "" + } + }, + { + "id": "shareledger146r527z73q0ffknzlq3uxlcycajzgc6zc6003t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger146r527z73q0ffknzlq3uxlcycajzgc6zc6003t", + "ownerAddress": "shareledger146r527z73q0ffknzlq3uxlcycajzgc6zc6003t", + "extraData": "" + } + }, + { + "id": "shareledger147md59vy06y50gjwfp97qt3vu8crlfyy07fgw0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger147md59vy06y50gjwfp97qt3vu8crlfyy07fgw0", + "ownerAddress": "shareledger147md59vy06y50gjwfp97qt3vu8crlfyy07fgw0", + "extraData": "" + } + }, + { + "id": "shareledger1489hq58syj6nj4yjzah89eguceprkwsymtnvg2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1489hq58syj6nj4yjzah89eguceprkwsymtnvg2", + "ownerAddress": "shareledger1489hq58syj6nj4yjzah89eguceprkwsymtnvg2", + "extraData": "" + } + }, + { + "id": "shareledger148v7f5f9l74wdv3eug5augakv9cgxqxaucnga9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger148v7f5f9l74wdv3eug5augakv9cgxqxaucnga9", + "ownerAddress": "shareledger148v7f5f9l74wdv3eug5augakv9cgxqxaucnga9", + "extraData": "" + } + }, + { + "id": "shareledger14938s7mgruaz887mqndlxrufn79k844k27z2zv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14938s7mgruaz887mqndlxrufn79k844k27z2zv", + "ownerAddress": "shareledger14938s7mgruaz887mqndlxrufn79k844k27z2zv", + "extraData": "" + } + }, + { + "id": "shareledger149gdsgyzrp0nn3zjm48pz7j3dz7mme7j0rtmec", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger149gdsgyzrp0nn3zjm48pz7j3dz7mme7j0rtmec", + "ownerAddress": "shareledger149gdsgyzrp0nn3zjm48pz7j3dz7mme7j0rtmec", + "extraData": "" + } + }, + { + "id": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "ownerAddress": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "extraData": "" + } + }, + { + "id": "shareledger14adxd4p47kztmyzd3xcexaxjemwglrqjmxqmay", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14adxd4p47kztmyzd3xcexaxjemwglrqjmxqmay", + "ownerAddress": "shareledger14adxd4p47kztmyzd3xcexaxjemwglrqjmxqmay", + "extraData": "" + } + }, + { + "id": "shareledger14cakh700sc25mw8m96jfsam6ptnlz5e4pwyuxs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14cakh700sc25mw8m96jfsam6ptnlz5e4pwyuxs", + "ownerAddress": "shareledger14cakh700sc25mw8m96jfsam6ptnlz5e4pwyuxs", + "extraData": "" + } + }, + { + "id": "shareledger14cp043w5g9v4968qjhqtl5f3nuktus977ecz2y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14cp043w5g9v4968qjhqtl5f3nuktus977ecz2y", + "ownerAddress": "shareledger14cp043w5g9v4968qjhqtl5f3nuktus977ecz2y", + "extraData": "" + } + }, + { + "id": "shareledger14cu5shmu033x68xez6rrqdgudhyjntdckzdjnd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14cu5shmu033x68xez6rrqdgudhyjntdckzdjnd", + "ownerAddress": "shareledger14cu5shmu033x68xez6rrqdgudhyjntdckzdjnd", + "extraData": "" + } + }, + { + "id": "shareledger14d2an8uf769k0ssl9gk3tapxxwmdgd60ugkqwj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14d2an8uf769k0ssl9gk3tapxxwmdgd60ugkqwj", + "ownerAddress": "shareledger14d2an8uf769k0ssl9gk3tapxxwmdgd60ugkqwj", + "extraData": "" + } + }, + { + "id": "shareledger14d654fm8fjljscx34duqva0ye076czve8lt5ld", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14d654fm8fjljscx34duqva0ye076czve8lt5ld", + "ownerAddress": "shareledger14d654fm8fjljscx34duqva0ye076czve8lt5ld", + "extraData": "" + } + }, + { + "id": "shareledger14det2q7qwzjrq50zmlg5chlueejj6v6re67ffc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14det2q7qwzjrq50zmlg5chlueejj6v6re67ffc", + "ownerAddress": "shareledger14det2q7qwzjrq50zmlg5chlueejj6v6re67ffc", + "extraData": "" + } + }, + { + "id": "shareledger14dwcra2d7quxjaeg5v3p7yr5gaj2rfah7hk0y5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14dwcra2d7quxjaeg5v3p7yr5gaj2rfah7hk0y5", + "ownerAddress": "shareledger14dwcra2d7quxjaeg5v3p7yr5gaj2rfah7hk0y5", + "extraData": "" + } + }, + { + "id": "shareledger14e8rx5j7hup9qhaqhxww94kswu8v6se0p326q2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14e8rx5j7hup9qhaqhxww94kswu8v6se0p326q2", + "ownerAddress": "shareledger14e8rx5j7hup9qhaqhxww94kswu8v6se0p326q2", + "extraData": "" + } + }, + { + "id": "shareledger14eljdkr677kg2du8qq400nnq3pfjdfy3fwd6v7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14eljdkr677kg2du8qq400nnq3pfjdfy3fwd6v7", + "ownerAddress": "shareledger14eljdkr677kg2du8qq400nnq3pfjdfy3fwd6v7", + "extraData": "" + } + }, + { + "id": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "ownerAddress": "shareledger14ex0hhseu8jss5mycasvwctctvpsw8ddlu4myw", + "extraData": "" + } + }, + { + "id": "shareledger14f66vefkax7h64e5j05a2xqjmh9fk8sywmcjsh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14f66vefkax7h64e5j05a2xqjmh9fk8sywmcjsh", + "ownerAddress": "shareledger14f66vefkax7h64e5j05a2xqjmh9fk8sywmcjsh", + "extraData": "" + } + }, + { + "id": "shareledger14hwt5kfu83cz84uj3algutddxf63w4nnnnulqf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14hwt5kfu83cz84uj3algutddxf63w4nnnnulqf", + "ownerAddress": "shareledger14hwt5kfu83cz84uj3algutddxf63w4nnnnulqf", + "extraData": "" + } + }, + { + "id": "shareledger14jfqttq6826dm0uhnuq48zldpysamnhpye99xp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14jfqttq6826dm0uhnuq48zldpysamnhpye99xp", + "ownerAddress": "shareledger14jfqttq6826dm0uhnuq48zldpysamnhpye99xp", + "extraData": "" + } + }, + { + "id": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "ownerAddress": "shareledger14jhmsllntjwqgsz92xac0pkg8g0d44xvk04zhu", + "extraData": "" + } + }, + { + "id": "shareledger14kql8dfynhzlugusxhkjfv7rwnrrmf8u08kntk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14kql8dfynhzlugusxhkjfv7rwnrrmf8u08kntk", + "ownerAddress": "shareledger14kql8dfynhzlugusxhkjfv7rwnrrmf8u08kntk", + "extraData": "" + } + }, + { + "id": "shareledger14lscnssmvfc8fjety8fx3urlejyjct84qd9c88", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14lscnssmvfc8fjety8fx3urlejyjct84qd9c88", + "ownerAddress": "shareledger14lscnssmvfc8fjety8fx3urlejyjct84qd9c88", + "extraData": "" + } + }, + { + "id": "shareledger14mcqhk2d8qk0puke0xt3ztmyu7hdkeaavkjd27", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14mcqhk2d8qk0puke0xt3ztmyu7hdkeaavkjd27", + "ownerAddress": "shareledger14mcqhk2d8qk0puke0xt3ztmyu7hdkeaavkjd27", + "extraData": "" + } + }, + { + "id": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "ownerAddress": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "extraData": "" + } + }, + { + "id": "shareledger14n8nfchxx5klcl8cclng28kpchqpx2psaqlu5t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14n8nfchxx5klcl8cclng28kpchqpx2psaqlu5t", + "ownerAddress": "shareledger14n8nfchxx5klcl8cclng28kpchqpx2psaqlu5t", + "extraData": "" + } + }, + { + "id": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "ownerAddress": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "extraData": "" + } + }, + { + "id": "shareledger14pa8qj6nxxvjn83uhkgr7l0cr2k3lzmxymq44d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14pa8qj6nxxvjn83uhkgr7l0cr2k3lzmxymq44d", + "ownerAddress": "shareledger14pa8qj6nxxvjn83uhkgr7l0cr2k3lzmxymq44d", + "extraData": "" + } + }, + { + "id": "shareledger14pggr7ztg4mqgnqgt2tmns67t77m9ukewc6ylj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14pggr7ztg4mqgnqgt2tmns67t77m9ukewc6ylj", + "ownerAddress": "shareledger14pggr7ztg4mqgnqgt2tmns67t77m9ukewc6ylj", + "extraData": "" + } + }, + { + "id": "shareledger14plzqhycl4t2jnuyn93cs5dx9kr3z3936y96y3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14plzqhycl4t2jnuyn93cs5dx9kr3z3936y96y3", + "ownerAddress": "shareledger14plzqhycl4t2jnuyn93cs5dx9kr3z3936y96y3", + "extraData": "" + } + }, + { + "id": "shareledger14q60dpl5u8vfzml3a38pe2atzvd5vze7hje9lf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14q60dpl5u8vfzml3a38pe2atzvd5vze7hje9lf", + "ownerAddress": "shareledger14q60dpl5u8vfzml3a38pe2atzvd5vze7hje9lf", + "extraData": "" + } + }, + { + "id": "shareledger14qqsl3kk8mq33afe4a5nsgzsey3yfu5zxcm4t2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14qqsl3kk8mq33afe4a5nsgzsey3yfu5zxcm4t2", + "ownerAddress": "shareledger14qqsl3kk8mq33afe4a5nsgzsey3yfu5zxcm4t2", + "extraData": "" + } + }, + { + "id": "shareledger14rd047arv87t3x6gnnp8dprenlgdrmzxgpdean", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14rd047arv87t3x6gnnp8dprenlgdrmzxgpdean", + "ownerAddress": "shareledger14rd047arv87t3x6gnnp8dprenlgdrmzxgpdean", + "extraData": "" + } + }, + { + "id": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "ownerAddress": "shareledger14s2wuf6y7elztv6aknyclqlcy2pylksk4tgfrn", + "extraData": "" + } + }, + { + "id": "shareledger14u976szrthnfh2fyc8tad5l3n6zy8rngmqv4zv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14u976szrthnfh2fyc8tad5l3n6zy8rngmqv4zv", + "ownerAddress": "shareledger14u976szrthnfh2fyc8tad5l3n6zy8rngmqv4zv", + "extraData": "" + } + }, + { + "id": "shareledger14ug5mafahm8zgxc0juwdskdn3k7xhxlxhh3jhx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14ug5mafahm8zgxc0juwdskdn3k7xhxlxhh3jhx", + "ownerAddress": "shareledger14ug5mafahm8zgxc0juwdskdn3k7xhxlxhh3jhx", + "extraData": "" + } + }, + { + "id": "shareledger14wf7r0l0vc00n2gnd03wsuf2nrgwgunxzy2kxh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14wf7r0l0vc00n2gnd03wsuf2nrgwgunxzy2kxh", + "ownerAddress": "shareledger14wf7r0l0vc00n2gnd03wsuf2nrgwgunxzy2kxh", + "extraData": "" + } + }, + { + "id": "shareledger14wwqad86h5uf2ua050uqhdduuywklgvxssffks", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14wwqad86h5uf2ua050uqhdduuywklgvxssffks", + "ownerAddress": "shareledger14wwqad86h5uf2ua050uqhdduuywklgvxssffks", + "extraData": "" + } + }, + { + "id": "shareledger14xwyehu4wcezx78fu08m8vca24k7gvsa65n6vs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14xwyehu4wcezx78fu08m8vca24k7gvsa65n6vs", + "ownerAddress": "shareledger14xwyehu4wcezx78fu08m8vca24k7gvsa65n6vs", + "extraData": "" + } + }, + { + "id": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "ownerAddress": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "extraData": "" + } + }, + { + "id": "shareledger14ytguph48v9562uc4qprg7yjc8tsrk2r7dnmmt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger14ytguph48v9562uc4qprg7yjc8tsrk2r7dnmmt", + "ownerAddress": "shareledger14ytguph48v9562uc4qprg7yjc8tsrk2r7dnmmt", + "extraData": "" + } + }, + { + "id": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "ownerAddress": "shareledger150az3q4s2yu6wcmgpj73uhhsldgnc3tm0gq9us", + "extraData": "" + } + }, + { + "id": "shareledger150nj6cvg0kjca5dnkjqq3898ywn3zkjuy59v3k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger150nj6cvg0kjca5dnkjqq3898ywn3zkjuy59v3k", + "ownerAddress": "shareledger150nj6cvg0kjca5dnkjqq3898ywn3zkjuy59v3k", + "extraData": "" + } + }, + { + "id": "shareledger1524xj69y3xf7qpj9x8xduchk6x9kty96qh0wmf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1524xj69y3xf7qpj9x8xduchk6x9kty96qh0wmf", + "ownerAddress": "shareledger1524xj69y3xf7qpj9x8xduchk6x9kty96qh0wmf", + "extraData": "" + } + }, + { + "id": "shareledger152c6cf25eukrnjya0mz7v8465mfmluh20px2nj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger152c6cf25eukrnjya0mz7v8465mfmluh20px2nj", + "ownerAddress": "shareledger152c6cf25eukrnjya0mz7v8465mfmluh20px2nj", + "extraData": "" + } + }, + { + "id": "shareledger152pp9unk3s7ukurvwuuuc7xangy5zfyddpu7jw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger152pp9unk3s7ukurvwuuuc7xangy5zfyddpu7jw", + "ownerAddress": "shareledger152pp9unk3s7ukurvwuuuc7xangy5zfyddpu7jw", + "extraData": "" + } + }, + { + "id": "shareledger152wmax63ucpfyhpypnleu2vuv5cuv66mrcjkvp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger152wmax63ucpfyhpypnleu2vuv5cuv66mrcjkvp", + "ownerAddress": "shareledger152wmax63ucpfyhpypnleu2vuv5cuv66mrcjkvp", + "extraData": "" + } + }, + { + "id": "shareledger1532wrprzyfzayz3n3tukhsutzhtyna3f2kjjtg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1532wrprzyfzayz3n3tukhsutzhtyna3f2kjjtg", + "ownerAddress": "shareledger1532wrprzyfzayz3n3tukhsutzhtyna3f2kjjtg", + "extraData": "" + } + }, + { + "id": "shareledger154302njxw7ezurlwtj0ajqfakmpla4g5qh0j9y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger154302njxw7ezurlwtj0ajqfakmpla4g5qh0j9y", + "ownerAddress": "shareledger154302njxw7ezurlwtj0ajqfakmpla4g5qh0j9y", + "extraData": "" + } + }, + { + "id": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "ownerAddress": "shareledger1548ydl5k6at3vwrrd0k3tw7q2vy6v90t2qqaxp", + "extraData": "" + } + }, + { + "id": "shareledger155r7vjt870mdpdsgh5rrwkwgvqnqd6qsv8t454", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger155r7vjt870mdpdsgh5rrwkwgvqnqd6qsv8t454", + "ownerAddress": "shareledger155r7vjt870mdpdsgh5rrwkwgvqnqd6qsv8t454", + "extraData": "" + } + }, + { + "id": "shareledger15643kf2hddntkxtnhe4gw3tehpsgtfahdn6wew", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15643kf2hddntkxtnhe4gw3tehpsgtfahdn6wew", + "ownerAddress": "shareledger15643kf2hddntkxtnhe4gw3tehpsgtfahdn6wew", + "extraData": "" + } + }, + { + "id": "shareledger156frwr8ctpt77c9pjphfztramy05gy07pngadu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger156frwr8ctpt77c9pjphfztramy05gy07pngadu", + "ownerAddress": "shareledger156frwr8ctpt77c9pjphfztramy05gy07pngadu", + "extraData": "" + } + }, + { + "id": "shareledger1582qmzfmpf4mcptlgdq336aqdxr89as5yaz7pt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1582qmzfmpf4mcptlgdq336aqdxr89as5yaz7pt", + "ownerAddress": "shareledger1582qmzfmpf4mcptlgdq336aqdxr89as5yaz7pt", + "extraData": "" + } + }, + { + "id": "shareledger1585he9y4s57tmgh28cvthslkfgj9lvh2dsnyx6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1585he9y4s57tmgh28cvthslkfgj9lvh2dsnyx6", + "ownerAddress": "shareledger1585he9y4s57tmgh28cvthslkfgj9lvh2dsnyx6", + "extraData": "" + } + }, + { + "id": "shareledger158mnvssgnzn4x60w8xmg6gjyyz87qag7tqruvc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger158mnvssgnzn4x60w8xmg6gjyyz87qag7tqruvc", + "ownerAddress": "shareledger158mnvssgnzn4x60w8xmg6gjyyz87qag7tqruvc", + "extraData": "" + } + }, + { + "id": "shareledger158v6qsxgv782fhj9ag5vfnh3uuvjn9mnlwtpww", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger158v6qsxgv782fhj9ag5vfnh3uuvjn9mnlwtpww", + "ownerAddress": "shareledger158v6qsxgv782fhj9ag5vfnh3uuvjn9mnlwtpww", + "extraData": "" + } + }, + { + "id": "shareledger15a0al8429xqr28jju0zggtgm33mknk470j46qs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15a0al8429xqr28jju0zggtgm33mknk470j46qs", + "ownerAddress": "shareledger15a0al8429xqr28jju0zggtgm33mknk470j46qs", + "extraData": "" + } + }, + { + "id": "shareledger15a7kutrmljqyhp3ldk87dd7wdp2f0tmu7l5fpl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15a7kutrmljqyhp3ldk87dd7wdp2f0tmu7l5fpl", + "ownerAddress": "shareledger15a7kutrmljqyhp3ldk87dd7wdp2f0tmu7l5fpl", + "extraData": "" + } + }, + { + "id": "shareledger15cf4uslyjxgmuzaajehzussjz408l975hgfwgv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15cf4uslyjxgmuzaajehzussjz408l975hgfwgv", + "ownerAddress": "shareledger15cf4uslyjxgmuzaajehzussjz408l975hgfwgv", + "extraData": "" + } + }, + { + "id": "shareledger15cqqddze75tppuzqgqyawtxg3jlte03xp7kxk7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15cqqddze75tppuzqgqyawtxg3jlte03xp7kxk7", + "ownerAddress": "shareledger15cqqddze75tppuzqgqyawtxg3jlte03xp7kxk7", + "extraData": "" + } + }, + { + "id": "shareledger15cwpq3m0slnaq0ztnk3dg72s3q5qznjtjy7xdu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15cwpq3m0slnaq0ztnk3dg72s3q5qznjtjy7xdu", + "ownerAddress": "shareledger15cwpq3m0slnaq0ztnk3dg72s3q5qznjtjy7xdu", + "extraData": "" + } + }, + { + "id": "shareledger15dc8ylysuvuw5hsmqavxtn0pd273z9fww766kt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15dc8ylysuvuw5hsmqavxtn0pd273z9fww766kt", + "ownerAddress": "shareledger15dc8ylysuvuw5hsmqavxtn0pd273z9fww766kt", + "extraData": "" + } + }, + { + "id": "shareledger15drupa0qth5cy2dmg4vsus37ryypy8nnspu23a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15drupa0qth5cy2dmg4vsus37ryypy8nnspu23a", + "ownerAddress": "shareledger15drupa0qth5cy2dmg4vsus37ryypy8nnspu23a", + "extraData": "" + } + }, + { + "id": "shareledger15e43smzg4ty38jd6wxgh69vcfm4vtdzuhf9c50", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15e43smzg4ty38jd6wxgh69vcfm4vtdzuhf9c50", + "ownerAddress": "shareledger15e43smzg4ty38jd6wxgh69vcfm4vtdzuhf9c50", + "extraData": "" + } + }, + { + "id": "shareledger15eh36eklk4uf0gsqh503e47fzqhru6pvypt00s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15eh36eklk4uf0gsqh503e47fzqhru6pvypt00s", + "ownerAddress": "shareledger15eh36eklk4uf0gsqh503e47fzqhru6pvypt00s", + "extraData": "" + } + }, + { + "id": "shareledger15eym2877yv9u94mxglppslcnwhsv2pm6etx8fv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15eym2877yv9u94mxglppslcnwhsv2pm6etx8fv", + "ownerAddress": "shareledger15eym2877yv9u94mxglppslcnwhsv2pm6etx8fv", + "extraData": "" + } + }, + { + "id": "shareledger15fjm6ncx0wxt7gktlwwrmy0rnrmvtfdmrnnymt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15fjm6ncx0wxt7gktlwwrmy0rnrmvtfdmrnnymt", + "ownerAddress": "shareledger15fjm6ncx0wxt7gktlwwrmy0rnrmvtfdmrnnymt", + "extraData": "" + } + }, + { + "id": "shareledger15ftguxa96mkgt9d8mw9x3nln3jhgjgeyzy6ee3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15ftguxa96mkgt9d8mw9x3nln3jhgjgeyzy6ee3", + "ownerAddress": "shareledger15ftguxa96mkgt9d8mw9x3nln3jhgjgeyzy6ee3", + "extraData": "" + } + }, + { + "id": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "ownerAddress": "shareledger15glw22wfr8uyp69xr0fzf0heyhup836dxhellq", + "extraData": "" + } + }, + { + "id": "shareledger15grcj8quffa5tdg78hwmskpmqwfjq5tex2a04r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15grcj8quffa5tdg78hwmskpmqwfjq5tex2a04r", + "ownerAddress": "shareledger15grcj8quffa5tdg78hwmskpmqwfjq5tex2a04r", + "extraData": "" + } + }, + { + "id": "shareledger15k872z3uu9qr7d7mhfqh62khw5rv2dwwpm9zvu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15k872z3uu9qr7d7mhfqh62khw5rv2dwwpm9zvu", + "ownerAddress": "shareledger15k872z3uu9qr7d7mhfqh62khw5rv2dwwpm9zvu", + "extraData": "" + } + }, + { + "id": "shareledger15kuas4ej7fsnv46pxx2eh488hw400af2mxkjy8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15kuas4ej7fsnv46pxx2eh488hw400af2mxkjy8", + "ownerAddress": "shareledger15kuas4ej7fsnv46pxx2eh488hw400af2mxkjy8", + "extraData": "" + } + }, + { + "id": "shareledger15lelak6vey7wl6sx5g2mwsr0rj549qzpmr5sgy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15lelak6vey7wl6sx5g2mwsr0rj549qzpmr5sgy", + "ownerAddress": "shareledger15lelak6vey7wl6sx5g2mwsr0rj549qzpmr5sgy", + "extraData": "" + } + }, + { + "id": "shareledger15m9c6hqs09zlu6t0pn9cx8mg8skhvkp34w3rs2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15m9c6hqs09zlu6t0pn9cx8mg8skhvkp34w3rs2", + "ownerAddress": "shareledger15m9c6hqs09zlu6t0pn9cx8mg8skhvkp34w3rs2", + "extraData": "" + } + }, + { + "id": "shareledger15ng8vcmmv5sp7935zc5ttd838fldlnnudmwwsg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15ng8vcmmv5sp7935zc5ttd838fldlnnudmwwsg", + "ownerAddress": "shareledger15ng8vcmmv5sp7935zc5ttd838fldlnnudmwwsg", + "extraData": "" + } + }, + { + "id": "shareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "ownerAddress": "shareledger15ntxar7jmmyr64p84p96f4qv9lm6rwmjytf5n4", + "extraData": "" + } + }, + { + "id": "shareledger15pavx33tsfv7lh80kt9m3xl2xxvn3q24e8d8g2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15pavx33tsfv7lh80kt9m3xl2xxvn3q24e8d8g2", + "ownerAddress": "shareledger15pavx33tsfv7lh80kt9m3xl2xxvn3q24e8d8g2", + "extraData": "" + } + }, + { + "id": "shareledger15qaesd3a0ajk3klyhmyhdz0mgz55xhkjugj9hh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15qaesd3a0ajk3klyhmyhdz0mgz55xhkjugj9hh", + "ownerAddress": "shareledger15qaesd3a0ajk3klyhmyhdz0mgz55xhkjugj9hh", + "extraData": "" + } + }, + { + "id": "shareledger15qk9crt99n8r3e75xdhky4na5cny9j26hden4p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15qk9crt99n8r3e75xdhky4na5cny9j26hden4p", + "ownerAddress": "shareledger15qk9crt99n8r3e75xdhky4na5cny9j26hden4p", + "extraData": "" + } + }, + { + "id": "shareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "ownerAddress": "shareledger15rfs35vh0g4jawfd8gfzjw4v9vw3rh6t44d5sd", + "extraData": "" + } + }, + { + "id": "shareledger15rtkz550ldd9fpexxquv964qnthqxh9qgke7x3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15rtkz550ldd9fpexxquv964qnthqxh9qgke7x3", + "ownerAddress": "shareledger15rtkz550ldd9fpexxquv964qnthqxh9qgke7x3", + "extraData": "" + } + }, + { + "id": "shareledger15twsd8cf0fnqejs699ud5ypye8s666kuepyk37", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15twsd8cf0fnqejs699ud5ypye8s666kuepyk37", + "ownerAddress": "shareledger15twsd8cf0fnqejs699ud5ypye8s666kuepyk37", + "extraData": "" + } + }, + { + "id": "shareledger15u2yfmeq3tp5ffdns8848gmqzc3tpjgwsk5mw9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15u2yfmeq3tp5ffdns8848gmqzc3tpjgwsk5mw9", + "ownerAddress": "shareledger15u2yfmeq3tp5ffdns8848gmqzc3tpjgwsk5mw9", + "extraData": "" + } + }, + { + "id": "shareledger15v8c735zdj9fz5jcgp3qjqulhejm94d2a27kal", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15v8c735zdj9fz5jcgp3qjqulhejm94d2a27kal", + "ownerAddress": "shareledger15v8c735zdj9fz5jcgp3qjqulhejm94d2a27kal", + "extraData": "" + } + }, + { + "id": "shareledger15vmv4sahawq22wcqupkw436f2ed792wn37rnud", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15vmv4sahawq22wcqupkw436f2ed792wn37rnud", + "ownerAddress": "shareledger15vmv4sahawq22wcqupkw436f2ed792wn37rnud", + "extraData": "" + } + }, + { + "id": "shareledger15xscpwy0w6jc275yyc8asncec3yqg9acx79el6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15xscpwy0w6jc275yyc8asncec3yqg9acx79el6", + "ownerAddress": "shareledger15xscpwy0w6jc275yyc8asncec3yqg9acx79el6", + "extraData": "" + } + }, + { + "id": "shareledger15ymgyymx5phmaf3mz82nqxvcpy780jas4kshgw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15ymgyymx5phmaf3mz82nqxvcpy780jas4kshgw", + "ownerAddress": "shareledger15ymgyymx5phmaf3mz82nqxvcpy780jas4kshgw", + "extraData": "" + } + }, + { + "id": "shareledger15yq9tyersd73yxgwnkk2gj2usfrt9mwju9n85c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15yq9tyersd73yxgwnkk2gj2usfrt9mwju9n85c", + "ownerAddress": "shareledger15yq9tyersd73yxgwnkk2gj2usfrt9mwju9n85c", + "extraData": "" + } + }, + { + "id": "shareledger15zdme9u6tct0s39k6rzf2yfgt5y4r736w6edxw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger15zdme9u6tct0s39k6rzf2yfgt5y4r736w6edxw", + "ownerAddress": "shareledger15zdme9u6tct0s39k6rzf2yfgt5y4r736w6edxw", + "extraData": "" + } + }, + { + "id": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "ownerAddress": "shareledger160pwp6mj4zz5n308ayap4tpwfu93fmkm5z2vwh", + "extraData": "" + } + }, + { + "id": "shareledger162sphjv3erwx7swsljq5kzs6hmw49h8les0fmh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger162sphjv3erwx7swsljq5kzs6hmw49h8les0fmh", + "ownerAddress": "shareledger162sphjv3erwx7swsljq5kzs6hmw49h8les0fmh", + "extraData": "" + } + }, + { + "id": "shareledger1638ynzlarl99ghrcujt4c90sas7znmmj55gwm4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1638ynzlarl99ghrcujt4c90sas7znmmj55gwm4", + "ownerAddress": "shareledger1638ynzlarl99ghrcujt4c90sas7znmmj55gwm4", + "extraData": "" + } + }, + { + "id": "shareledger163f85mdfelacns9ape7zryh8du02rwjapld0z4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger163f85mdfelacns9ape7zryh8du02rwjapld0z4", + "ownerAddress": "shareledger163f85mdfelacns9ape7zryh8du02rwjapld0z4", + "extraData": "" + } + }, + { + "id": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "ownerAddress": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "extraData": "" + } + }, + { + "id": "shareledger164aptzgmwtup4ff2f2mne0edef7z90u596q3uh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger164aptzgmwtup4ff2f2mne0edef7z90u596q3uh", + "ownerAddress": "shareledger164aptzgmwtup4ff2f2mne0edef7z90u596q3uh", + "extraData": "" + } + }, + { + "id": "shareledger164f5k83ejdgjmsgex73dtt9a3nd0t7ljudax7f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger164f5k83ejdgjmsgex73dtt9a3nd0t7ljudax7f", + "ownerAddress": "shareledger164f5k83ejdgjmsgex73dtt9a3nd0t7ljudax7f", + "extraData": "" + } + }, + { + "id": "shareledger1652jgg7r3flr28nn3rvnteqq369hc3f5mzj90a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1652jgg7r3flr28nn3rvnteqq369hc3f5mzj90a", + "ownerAddress": "shareledger1652jgg7r3flr28nn3rvnteqq369hc3f5mzj90a", + "extraData": "" + } + }, + { + "id": "shareledger166dx3ln6q2cnrfp2jk6wsqp6f3l8g0rh5eqxhc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger166dx3ln6q2cnrfp2jk6wsqp6f3l8g0rh5eqxhc", + "ownerAddress": "shareledger166dx3ln6q2cnrfp2jk6wsqp6f3l8g0rh5eqxhc", + "extraData": "" + } + }, + { + "id": "shareledger166eyunxatfpckdnac307zpljxluuphl67wktlk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger166eyunxatfpckdnac307zpljxluuphl67wktlk", + "ownerAddress": "shareledger166eyunxatfpckdnac307zpljxluuphl67wktlk", + "extraData": "" + } + }, + { + "id": "shareledger166myf8a7gfqmajjfa964m7aqmr5flalktpzk73", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger166myf8a7gfqmajjfa964m7aqmr5flalktpzk73", + "ownerAddress": "shareledger166myf8a7gfqmajjfa964m7aqmr5flalktpzk73", + "extraData": "" + } + }, + { + "id": "shareledger166ue9wga9muuksqsgj0q2fvkpwwkp05l2slzvr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger166ue9wga9muuksqsgj0q2fvkpwwkp05l2slzvr", + "ownerAddress": "shareledger166ue9wga9muuksqsgj0q2fvkpwwkp05l2slzvr", + "extraData": "" + } + }, + { + "id": "shareledger167uc8gantrhvdvnl8kutds6eh7y92rm9wddpwn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger167uc8gantrhvdvnl8kutds6eh7y92rm9wddpwn", + "ownerAddress": "shareledger167uc8gantrhvdvnl8kutds6eh7y92rm9wddpwn", + "extraData": "" + } + }, + { + "id": "shareledger168l086dwgshrd3tafpsdgk9qa4k7ycxe5xvnz8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger168l086dwgshrd3tafpsdgk9qa4k7ycxe5xvnz8", + "ownerAddress": "shareledger168l086dwgshrd3tafpsdgk9qa4k7ycxe5xvnz8", + "extraData": "" + } + }, + { + "id": "shareledger169qekdxjm9hay0xwtcj02xjke7es7j57kh3m8m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger169qekdxjm9hay0xwtcj02xjke7es7j57kh3m8m", + "ownerAddress": "shareledger169qekdxjm9hay0xwtcj02xjke7es7j57kh3m8m", + "extraData": "" + } + }, + { + "id": "shareledger16aq8xcxmecuncv2nwflwmrfs3aeuq9fm2fcwsj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16aq8xcxmecuncv2nwflwmrfs3aeuq9fm2fcwsj", + "ownerAddress": "shareledger16aq8xcxmecuncv2nwflwmrfs3aeuq9fm2fcwsj", + "extraData": "" + } + }, + { + "id": "shareledger16aycjxat728mu7g6fhnfgq4flxfmzvewvhslrr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16aycjxat728mu7g6fhnfgq4flxfmzvewvhslrr", + "ownerAddress": "shareledger16aycjxat728mu7g6fhnfgq4flxfmzvewvhslrr", + "extraData": "" + } + }, + { + "id": "shareledger16c2yeykmt95wldnfr85da348gdmhy69nz8gvp3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16c2yeykmt95wldnfr85da348gdmhy69nz8gvp3", + "ownerAddress": "shareledger16c2yeykmt95wldnfr85da348gdmhy69nz8gvp3", + "extraData": "" + } + }, + { + "id": "shareledger16c7p70jmmcufv64awllv0ug8zrkl4kgxzmmeyv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16c7p70jmmcufv64awllv0ug8zrkl4kgxzmmeyv", + "ownerAddress": "shareledger16c7p70jmmcufv64awllv0ug8zrkl4kgxzmmeyv", + "extraData": "" + } + }, + { + "id": "shareledger16cf5ndlhqlzqazth7x246a97e5uf5lcur52nwu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16cf5ndlhqlzqazth7x246a97e5uf5lcur52nwu", + "ownerAddress": "shareledger16cf5ndlhqlzqazth7x246a97e5uf5lcur52nwu", + "extraData": "" + } + }, + { + "id": "shareledger16e03pe7y0x2hgyhfgudadr9pkj2pdh6n98kmth", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16e03pe7y0x2hgyhfgudadr9pkj2pdh6n98kmth", + "ownerAddress": "shareledger16e03pe7y0x2hgyhfgudadr9pkj2pdh6n98kmth", + "extraData": "" + } + }, + { + "id": "shareledger16fjez9slpa4d8u4pjwwdpa09zz9vmj664yn3cf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16fjez9slpa4d8u4pjwwdpa09zz9vmj664yn3cf", + "ownerAddress": "shareledger16fjez9slpa4d8u4pjwwdpa09zz9vmj664yn3cf", + "extraData": "" + } + }, + { + "id": "shareledger16fmpgvw4e3qwfaumr5ax4yg9qt6c32avvel5lh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16fmpgvw4e3qwfaumr5ax4yg9qt6c32avvel5lh", + "ownerAddress": "shareledger16fmpgvw4e3qwfaumr5ax4yg9qt6c32avvel5lh", + "extraData": "" + } + }, + { + "id": "shareledger16g57dzx64kupw4ae05gvqhpqp9maq8t4lwhjfd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16g57dzx64kupw4ae05gvqhpqp9maq8t4lwhjfd", + "ownerAddress": "shareledger16g57dzx64kupw4ae05gvqhpqp9maq8t4lwhjfd", + "extraData": "" + } + }, + { + "id": "shareledger16gt8v4ljnrq7kuqtleg9jxva7xj2pgc3sdcugx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16gt8v4ljnrq7kuqtleg9jxva7xj2pgc3sdcugx", + "ownerAddress": "shareledger16gt8v4ljnrq7kuqtleg9jxva7xj2pgc3sdcugx", + "extraData": "" + } + }, + { + "id": "shareledger16h88phth99jmfet60vt8auctxkj2ch6yhs5xzw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16h88phth99jmfet60vt8auctxkj2ch6yhs5xzw", + "ownerAddress": "shareledger16h88phth99jmfet60vt8auctxkj2ch6yhs5xzw", + "extraData": "" + } + }, + { + "id": "shareledger16hc2xff826z5s4ejpw9jmlhv9msgtycmmwrs3u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16hc2xff826z5s4ejpw9jmlhv9msgtycmmwrs3u", + "ownerAddress": "shareledger16hc2xff826z5s4ejpw9jmlhv9msgtycmmwrs3u", + "extraData": "" + } + }, + { + "id": "shareledger16hf86h5eq9jpx6c0nn3nl6ph66gxgsz5q33ct2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16hf86h5eq9jpx6c0nn3nl6ph66gxgsz5q33ct2", + "ownerAddress": "shareledger16hf86h5eq9jpx6c0nn3nl6ph66gxgsz5q33ct2", + "extraData": "" + } + }, + { + "id": "shareledger16hfttxvqwxtyx89t58s3wq8lvhfcyc2h8mzlqw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16hfttxvqwxtyx89t58s3wq8lvhfcyc2h8mzlqw", + "ownerAddress": "shareledger16hfttxvqwxtyx89t58s3wq8lvhfcyc2h8mzlqw", + "extraData": "" + } + }, + { + "id": "shareledger16hv3583nka9wyx7px4l3q52lkv8q89hv5w9k4n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16hv3583nka9wyx7px4l3q52lkv8q89hv5w9k4n", + "ownerAddress": "shareledger16hv3583nka9wyx7px4l3q52lkv8q89hv5w9k4n", + "extraData": "" + } + }, + { + "id": "shareledger16hzrwax27cjvqfzj56dplj6lmswh5ngfnhpzm9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16hzrwax27cjvqfzj56dplj6lmswh5ngfnhpzm9", + "ownerAddress": "shareledger16hzrwax27cjvqfzj56dplj6lmswh5ngfnhpzm9", + "extraData": "" + } + }, + { + "id": "shareledger16j8a2j84hk6736j4g29ll9au2x2mjpytfvdnzc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16j8a2j84hk6736j4g29ll9au2x2mjpytfvdnzc", + "ownerAddress": "shareledger16j8a2j84hk6736j4g29ll9au2x2mjpytfvdnzc", + "extraData": "" + } + }, + { + "id": "shareledger16jhhes6sc9zgcrxqqhe7luzugf3cf582j8kgqm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16jhhes6sc9zgcrxqqhe7luzugf3cf582j8kgqm", + "ownerAddress": "shareledger16jhhes6sc9zgcrxqqhe7luzugf3cf582j8kgqm", + "extraData": "" + } + }, + { + "id": "shareledger16jx23tyjsnjzj8hr9es2j4unvnddk558dukf6n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16jx23tyjsnjzj8hr9es2j4unvnddk558dukf6n", + "ownerAddress": "shareledger16jx23tyjsnjzj8hr9es2j4unvnddk558dukf6n", + "extraData": "" + } + }, + { + "id": "shareledger16kwxemz32ranmkcpnz0ckqh4d44q3tlak4z76c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16kwxemz32ranmkcpnz0ckqh4d44q3tlak4z76c", + "ownerAddress": "shareledger16kwxemz32ranmkcpnz0ckqh4d44q3tlak4z76c", + "extraData": "" + } + }, + { + "id": "shareledger16l0m2x0mzwzl3jcanv99f0c4sgw6gcgp7sllaw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16l0m2x0mzwzl3jcanv99f0c4sgw6gcgp7sllaw", + "ownerAddress": "shareledger16l0m2x0mzwzl3jcanv99f0c4sgw6gcgp7sllaw", + "extraData": "" + } + }, + { + "id": "shareledger16l6lf035zt27rsa6zkncc8znkx0z2ryaaw7atv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16l6lf035zt27rsa6zkncc8znkx0z2ryaaw7atv", + "ownerAddress": "shareledger16l6lf035zt27rsa6zkncc8znkx0z2ryaaw7atv", + "extraData": "" + } + }, + { + "id": "shareledger16ljcz5ctr5uw2tmwrpgmh3nu9m0dzzvdf6j58m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16ljcz5ctr5uw2tmwrpgmh3nu9m0dzzvdf6j58m", + "ownerAddress": "shareledger16ljcz5ctr5uw2tmwrpgmh3nu9m0dzzvdf6j58m", + "extraData": "" + } + }, + { + "id": "shareledger16lva45nu7vk3z8mpjy655tfrp6zzeszh4q3rrd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16lva45nu7vk3z8mpjy655tfrp6zzeszh4q3rrd", + "ownerAddress": "shareledger16lva45nu7vk3z8mpjy655tfrp6zzeszh4q3rrd", + "extraData": "" + } + }, + { + "id": "shareledger16ngynjsn7ul4qym2mynt4dapljty7nydunjdxf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16ngynjsn7ul4qym2mynt4dapljty7nydunjdxf", + "ownerAddress": "shareledger16ngynjsn7ul4qym2mynt4dapljty7nydunjdxf", + "extraData": "" + } + }, + { + "id": "shareledger16nwaxgvfp8hnhrhyjmcej848r4cezj8jez5t38", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16nwaxgvfp8hnhrhyjmcej848r4cezj8jez5t38", + "ownerAddress": "shareledger16nwaxgvfp8hnhrhyjmcej848r4cezj8jez5t38", + "extraData": "" + } + }, + { + "id": "shareledger16p34gvqs6dum5sc54z8m9uh3n2l0q9885kwvzs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16p34gvqs6dum5sc54z8m9uh3n2l0q9885kwvzs", + "ownerAddress": "shareledger16p34gvqs6dum5sc54z8m9uh3n2l0q9885kwvzs", + "extraData": "" + } + }, + { + "id": "shareledger16p47vcgzm492fgj8z3hz8f7xwdl2kqdkw2jt9y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16p47vcgzm492fgj8z3hz8f7xwdl2kqdkw2jt9y", + "ownerAddress": "shareledger16p47vcgzm492fgj8z3hz8f7xwdl2kqdkw2jt9y", + "extraData": "" + } + }, + { + "id": "shareledger16p4jk47kt977xcc9ma3vnzdmxmjeztuylp35zp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16p4jk47kt977xcc9ma3vnzdmxmjeztuylp35zp", + "ownerAddress": "shareledger16p4jk47kt977xcc9ma3vnzdmxmjeztuylp35zp", + "extraData": "" + } + }, + { + "id": "shareledger16p7wv5dteh8jhq5c3n6e6h8zmhhw9pq4us3du7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16p7wv5dteh8jhq5c3n6e6h8zmhhw9pq4us3du7", + "ownerAddress": "shareledger16p7wv5dteh8jhq5c3n6e6h8zmhhw9pq4us3du7", + "extraData": "" + } + }, + { + "id": "shareledger16q20z3k9zgf7cjq22f6xea75nsw6ve3k2v5flk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16q20z3k9zgf7cjq22f6xea75nsw6ve3k2v5flk", + "ownerAddress": "shareledger16q20z3k9zgf7cjq22f6xea75nsw6ve3k2v5flk", + "extraData": "" + } + }, + { + "id": "shareledger16qptvmf4qhynqdy4yswqtyn20kdpapqx0h0fs9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16qptvmf4qhynqdy4yswqtyn20kdpapqx0h0fs9", + "ownerAddress": "shareledger16qptvmf4qhynqdy4yswqtyn20kdpapqx0h0fs9", + "extraData": "" + } + }, + { + "id": "shareledger16sd6a3qfwpum63yed9c7fcmx9tjq03haglvxnf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16sd6a3qfwpum63yed9c7fcmx9tjq03haglvxnf", + "ownerAddress": "shareledger16sd6a3qfwpum63yed9c7fcmx9tjq03haglvxnf", + "extraData": "" + } + }, + { + "id": "shareledger16shxlqveys5ddy5kzyz2drnsnwj9g5jzx9j35p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16shxlqveys5ddy5kzyz2drnsnwj9g5jzx9j35p", + "ownerAddress": "shareledger16shxlqveys5ddy5kzyz2drnsnwj9g5jzx9j35p", + "extraData": "" + } + }, + { + "id": "shareledger16ssk3gd332pe5uqnzcthx9hdcn6g7uu5wg0r8q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16ssk3gd332pe5uqnzcthx9hdcn6g7uu5wg0r8q", + "ownerAddress": "shareledger16ssk3gd332pe5uqnzcthx9hdcn6g7uu5wg0r8q", + "extraData": "" + } + }, + { + "id": "shareledger16t2fd5ntktk2kuqlkqhrq46fy5xctx4yea7wqx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16t2fd5ntktk2kuqlkqhrq46fy5xctx4yea7wqx", + "ownerAddress": "shareledger16t2fd5ntktk2kuqlkqhrq46fy5xctx4yea7wqx", + "extraData": "" + } + }, + { + "id": "shareledger16uqkxyxlgjndtwjll86832yj8yma2808wllxgw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16uqkxyxlgjndtwjll86832yj8yma2808wllxgw", + "ownerAddress": "shareledger16uqkxyxlgjndtwjll86832yj8yma2808wllxgw", + "extraData": "" + } + }, + { + "id": "shareledger16vjekr6ea9ucdxxkrgfkafnxzwuejq53f8ana9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16vjekr6ea9ucdxxkrgfkafnxzwuejq53f8ana9", + "ownerAddress": "shareledger16vjekr6ea9ucdxxkrgfkafnxzwuejq53f8ana9", + "extraData": "" + } + }, + { + "id": "shareledger16w3d5487pvkj8twkqq4vgqckksa39v8zqre7k5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16w3d5487pvkj8twkqq4vgqckksa39v8zqre7k5", + "ownerAddress": "shareledger16w3d5487pvkj8twkqq4vgqckksa39v8zqre7k5", + "extraData": "" + } + }, + { + "id": "shareledger16wfjsw4tywklnrjzrlhffyrwgcvm073xdek9k9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16wfjsw4tywklnrjzrlhffyrwgcvm073xdek9k9", + "ownerAddress": "shareledger16wfjsw4tywklnrjzrlhffyrwgcvm073xdek9k9", + "extraData": "" + } + }, + { + "id": "shareledger16wlzmackqepxcc70g8qu6aac99wc6s65sqg483", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16wlzmackqepxcc70g8qu6aac99wc6s65sqg483", + "ownerAddress": "shareledger16wlzmackqepxcc70g8qu6aac99wc6s65sqg483", + "extraData": "" + } + }, + { + "id": "shareledger16wrecjupqv9qtd8a8h5yulrn2uwlck53p5m5nt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16wrecjupqv9qtd8a8h5yulrn2uwlck53p5m5nt", + "ownerAddress": "shareledger16wrecjupqv9qtd8a8h5yulrn2uwlck53p5m5nt", + "extraData": "" + } + }, + { + "id": "shareledger16yr2zjcjjq8jw5u7yzmpvrecwlyfrkal8qg28e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16yr2zjcjjq8jw5u7yzmpvrecwlyfrkal8qg28e", + "ownerAddress": "shareledger16yr2zjcjjq8jw5u7yzmpvrecwlyfrkal8qg28e", + "extraData": "" + } + }, + { + "id": "shareledger16z606eer50fv3dm8fzp2545uyrlley9ychzhcm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger16z606eer50fv3dm8fzp2545uyrlley9ychzhcm", + "ownerAddress": "shareledger16z606eer50fv3dm8fzp2545uyrlley9ychzhcm", + "extraData": "" + } + }, + { + "id": "shareledger1709s6z0y49t0skaw6hh9zqqdp6kfetld2rjqeg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1709s6z0y49t0skaw6hh9zqqdp6kfetld2rjqeg", + "ownerAddress": "shareledger1709s6z0y49t0skaw6hh9zqqdp6kfetld2rjqeg", + "extraData": "" + } + }, + { + "id": "shareledger172pw4m4szzcn02raq733hm7l4yku2d4xrw0ql0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger172pw4m4szzcn02raq733hm7l4yku2d4xrw0ql0", + "ownerAddress": "shareledger172pw4m4szzcn02raq733hm7l4yku2d4xrw0ql0", + "extraData": "" + } + }, + { + "id": "shareledger1736vk36q5pvepxjjpr6jq0r7yqws5k98khmgz7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1736vk36q5pvepxjjpr6jq0r7yqws5k98khmgz7", + "ownerAddress": "shareledger1736vk36q5pvepxjjpr6jq0r7yqws5k98khmgz7", + "extraData": "" + } + }, + { + "id": "shareledger17387llf7h0y533syzhvtqaydl0sdx87jgram06", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17387llf7h0y533syzhvtqaydl0sdx87jgram06", + "ownerAddress": "shareledger17387llf7h0y533syzhvtqaydl0sdx87jgram06", + "extraData": "" + } + }, + { + "id": "shareledger173r2gmvzahxvsv5q3k7yygj6clfqthcedeg78f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger173r2gmvzahxvsv5q3k7yygj6clfqthcedeg78f", + "ownerAddress": "shareledger173r2gmvzahxvsv5q3k7yygj6clfqthcedeg78f", + "extraData": "" + } + }, + { + "id": "shareledger174juz5m8vursmfyg6j8jpa9g849sz76px2ym8n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger174juz5m8vursmfyg6j8jpa9g849sz76px2ym8n", + "ownerAddress": "shareledger174juz5m8vursmfyg6j8jpa9g849sz76px2ym8n", + "extraData": "" + } + }, + { + "id": "shareledger176m0pep6src9lafatnfee7fw8f0u37zzsn9ks9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger176m0pep6src9lafatnfee7fw8f0u37zzsn9ks9", + "ownerAddress": "shareledger176m0pep6src9lafatnfee7fw8f0u37zzsn9ks9", + "extraData": "" + } + }, + { + "id": "shareledger176w783dr7x84gpyep6hk8yxttqvk0j2gyekmrg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger176w783dr7x84gpyep6hk8yxttqvk0j2gyekmrg", + "ownerAddress": "shareledger176w783dr7x84gpyep6hk8yxttqvk0j2gyekmrg", + "extraData": "" + } + }, + { + "id": "shareledger177p8300p52yaqxhjtggyfw6fegnrf4wdsm7uj5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger177p8300p52yaqxhjtggyfw6fegnrf4wdsm7uj5", + "ownerAddress": "shareledger177p8300p52yaqxhjtggyfw6fegnrf4wdsm7uj5", + "extraData": "" + } + }, + { + "id": "shareledger178acmgqe8k7vqy4u3f06a3mxk5wwar0zhk3fhz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger178acmgqe8k7vqy4u3f06a3mxk5wwar0zhk3fhz", + "ownerAddress": "shareledger178acmgqe8k7vqy4u3f06a3mxk5wwar0zhk3fhz", + "extraData": "" + } + }, + { + "id": "shareledger178ydqnqg3d3yesf57uh4uvrfzf5xuccl7fjmdv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger178ydqnqg3d3yesf57uh4uvrfzf5xuccl7fjmdv", + "ownerAddress": "shareledger178ydqnqg3d3yesf57uh4uvrfzf5xuccl7fjmdv", + "extraData": "" + } + }, + { + "id": "shareledger178zg5u38cfrwu3qe6lk3exp7pq4ng4s5zuvxzq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger178zg5u38cfrwu3qe6lk3exp7pq4ng4s5zuvxzq", + "ownerAddress": "shareledger178zg5u38cfrwu3qe6lk3exp7pq4ng4s5zuvxzq", + "extraData": "" + } + }, + { + "id": "shareledger179vrxfx6xx2s377va8vu35t2l85c9u8s4u5s8m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger179vrxfx6xx2s377va8vu35t2l85c9u8s4u5s8m", + "ownerAddress": "shareledger179vrxfx6xx2s377va8vu35t2l85c9u8s4u5s8m", + "extraData": "" + } + }, + { + "id": "shareledger179wjceqm9fvfqea3tgfawmt97ykhr52tg65lhf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger179wjceqm9fvfqea3tgfawmt97ykhr52tg65lhf", + "ownerAddress": "shareledger179wjceqm9fvfqea3tgfawmt97ykhr52tg65lhf", + "extraData": "" + } + }, + { + "id": "shareledger17a9pavmccjcrg7wwkz33fftm4vwsj9ml5nh2yn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17a9pavmccjcrg7wwkz33fftm4vwsj9ml5nh2yn", + "ownerAddress": "shareledger17a9pavmccjcrg7wwkz33fftm4vwsj9ml5nh2yn", + "extraData": "" + } + }, + { + "id": "shareledger17aajalc44pnswg0qurv39mf8sf57jqvh30ujs8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17aajalc44pnswg0qurv39mf8sf57jqvh30ujs8", + "ownerAddress": "shareledger17aajalc44pnswg0qurv39mf8sf57jqvh30ujs8", + "extraData": "" + } + }, + { + "id": "shareledger17aw7lwkanec4ehd48s7mdeje04yz8yzs42eswc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17aw7lwkanec4ehd48s7mdeje04yz8yzs42eswc", + "ownerAddress": "shareledger17aw7lwkanec4ehd48s7mdeje04yz8yzs42eswc", + "extraData": "" + } + }, + { + "id": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "ownerAddress": "shareledger17axan720lxfds6k5yjjgadqk67dg49axg0a3m0", + "extraData": "" + } + }, + { + "id": "shareledger17c8nwg5hgtsj6euw6e6ls24lgnfuufs3xawx2f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17c8nwg5hgtsj6euw6e6ls24lgnfuufs3xawx2f", + "ownerAddress": "shareledger17c8nwg5hgtsj6euw6e6ls24lgnfuufs3xawx2f", + "extraData": "" + } + }, + { + "id": "shareledger17cdmmx07qn8wu0480hts6dhgypnymk4gwap9he", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17cdmmx07qn8wu0480hts6dhgypnymk4gwap9he", + "ownerAddress": "shareledger17cdmmx07qn8wu0480hts6dhgypnymk4gwap9he", + "extraData": "" + } + }, + { + "id": "shareledger17ddtnjdy6agtqer234ynsske4tg397x5mus0kx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17ddtnjdy6agtqer234ynsske4tg397x5mus0kx", + "ownerAddress": "shareledger17ddtnjdy6agtqer234ynsske4tg397x5mus0kx", + "extraData": "" + } + }, + { + "id": "shareledger17dkcffch43n3cxupvm6lnfm7fex9y6te3wplcp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17dkcffch43n3cxupvm6lnfm7fex9y6te3wplcp", + "ownerAddress": "shareledger17dkcffch43n3cxupvm6lnfm7fex9y6te3wplcp", + "extraData": "" + } + }, + { + "id": "shareledger17e5rltjxnwkx6sdgkaayvklpj5ksx55mmnc3m5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17e5rltjxnwkx6sdgkaayvklpj5ksx55mmnc3m5", + "ownerAddress": "shareledger17e5rltjxnwkx6sdgkaayvklpj5ksx55mmnc3m5", + "extraData": "" + } + }, + { + "id": "shareledger17enwaz6ntpeur84744u8xzmmqv0huth2j57h0s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17enwaz6ntpeur84744u8xzmmqv0huth2j57h0s", + "ownerAddress": "shareledger17enwaz6ntpeur84744u8xzmmqv0huth2j57h0s", + "extraData": "" + } + }, + { + "id": "shareledger17ew8w8ljctnncwqcf4lxnlty7s972lfe84zw2s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17ew8w8ljctnncwqcf4lxnlty7s972lfe84zw2s", + "ownerAddress": "shareledger17ew8w8ljctnncwqcf4lxnlty7s972lfe84zw2s", + "extraData": "" + } + }, + { + "id": "shareledger17f69y5ml79f3562c3wakud5074kjua278fktrp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17f69y5ml79f3562c3wakud5074kjua278fktrp", + "ownerAddress": "shareledger17f69y5ml79f3562c3wakud5074kjua278fktrp", + "extraData": "" + } + }, + { + "id": "shareledger17fvcqw4xgskrrudx39ezygk4pkdkdn9sdjvmu5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17fvcqw4xgskrrudx39ezygk4pkdkdn9sdjvmu5", + "ownerAddress": "shareledger17fvcqw4xgskrrudx39ezygk4pkdkdn9sdjvmu5", + "extraData": "" + } + }, + { + "id": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "ownerAddress": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "extraData": "" + } + }, + { + "id": "shareledger17jvv3fl0gtxr0g0mukg76nw3c5ssjcklz4nnsp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17jvv3fl0gtxr0g0mukg76nw3c5ssjcklz4nnsp", + "ownerAddress": "shareledger17jvv3fl0gtxr0g0mukg76nw3c5ssjcklz4nnsp", + "extraData": "" + } + }, + { + "id": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "ownerAddress": "shareledger17kwpwqdkvvynxynnp4fe86kmhzjrh0fpt03f97", + "extraData": "" + } + }, + { + "id": "shareledger17leapzvtwhufhm6fu7hdswztnrgmvksngvl2s0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17leapzvtwhufhm6fu7hdswztnrgmvksngvl2s0", + "ownerAddress": "shareledger17leapzvtwhufhm6fu7hdswztnrgmvksngvl2s0", + "extraData": "" + } + }, + { + "id": "shareledger17lpqv2aakev8c3ptsv42w60a90q4wfr8e6g6mx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17lpqv2aakev8c3ptsv42w60a90q4wfr8e6g6mx", + "ownerAddress": "shareledger17lpqv2aakev8c3ptsv42w60a90q4wfr8e6g6mx", + "extraData": "" + } + }, + { + "id": "shareledger17ltatawyp4mcadp4zyameagj84fcduz4n40k7e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17ltatawyp4mcadp4zyameagj84fcduz4n40k7e", + "ownerAddress": "shareledger17ltatawyp4mcadp4zyameagj84fcduz4n40k7e", + "extraData": "" + } + }, + { + "id": "shareledger17ltdq78le34wsh0sumdqugjcm287qqgcpqyk9j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17ltdq78le34wsh0sumdqugjcm287qqgcpqyk9j", + "ownerAddress": "shareledger17ltdq78le34wsh0sumdqugjcm287qqgcpqyk9j", + "extraData": "" + } + }, + { + "id": "shareledger17mudapxns4elmqxzfw2pj0375nmyhydqathxjt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17mudapxns4elmqxzfw2pj0375nmyhydqathxjt", + "ownerAddress": "shareledger17mudapxns4elmqxzfw2pj0375nmyhydqathxjt", + "extraData": "" + } + }, + { + "id": "shareledger17mz2v0g28a3rhljgfhscupzlf423npe6w3ykrn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17mz2v0g28a3rhljgfhscupzlf423npe6w3ykrn", + "ownerAddress": "shareledger17mz2v0g28a3rhljgfhscupzlf423npe6w3ykrn", + "extraData": "" + } + }, + { + "id": "shareledger17ne0dn7mur3x66323u8aarv9enp32yw4fhq5m7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17ne0dn7mur3x66323u8aarv9enp32yw4fhq5m7", + "ownerAddress": "shareledger17ne0dn7mur3x66323u8aarv9enp32yw4fhq5m7", + "extraData": "" + } + }, + { + "id": "shareledger17nq7fd9gux39pj6y292g0w7epfcgrulvzfmx6d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17nq7fd9gux39pj6y292g0w7epfcgrulvzfmx6d", + "ownerAddress": "shareledger17nq7fd9gux39pj6y292g0w7epfcgrulvzfmx6d", + "extraData": "" + } + }, + { + "id": "shareledger17nus2ahwq69pa5dznedzrfur2dczmgdsk6kftm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17nus2ahwq69pa5dznedzrfur2dczmgdsk6kftm", + "ownerAddress": "shareledger17nus2ahwq69pa5dznedzrfur2dczmgdsk6kftm", + "extraData": "" + } + }, + { + "id": "shareledger17p3rg9q5c68rmj0sm5xch2eckxcxgl6s9v2qaz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17p3rg9q5c68rmj0sm5xch2eckxcxgl6s9v2qaz", + "ownerAddress": "shareledger17p3rg9q5c68rmj0sm5xch2eckxcxgl6s9v2qaz", + "extraData": "" + } + }, + { + "id": "shareledger17padzvqe3kuaqdr085djggkhmpka440f2jhyse", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17padzvqe3kuaqdr085djggkhmpka440f2jhyse", + "ownerAddress": "shareledger17padzvqe3kuaqdr085djggkhmpka440f2jhyse", + "extraData": "" + } + }, + { + "id": "shareledger17pnpg0z7uvhzh3jkh7smmj5vuf27slqq7lsnag", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17pnpg0z7uvhzh3jkh7smmj5vuf27slqq7lsnag", + "ownerAddress": "shareledger17pnpg0z7uvhzh3jkh7smmj5vuf27slqq7lsnag", + "extraData": "" + } + }, + { + "id": "shareledger17pre0r0gqgv92rqx3yhss22amtx8ag07xenump", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17pre0r0gqgv92rqx3yhss22amtx8ag07xenump", + "ownerAddress": "shareledger17pre0r0gqgv92rqx3yhss22amtx8ag07xenump", + "extraData": "" + } + }, + { + "id": "shareledger17rzx8l0qtujq0yt96zwd440jfv2x3m2crjq43x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17rzx8l0qtujq0yt96zwd440jfv2x3m2crjq43x", + "ownerAddress": "shareledger17rzx8l0qtujq0yt96zwd440jfv2x3m2crjq43x", + "extraData": "" + } + }, + { + "id": "shareledger17s77z03c97p09w865awhq7vucdjcwszsqp950v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17s77z03c97p09w865awhq7vucdjcwszsqp950v", + "ownerAddress": "shareledger17s77z03c97p09w865awhq7vucdjcwszsqp950v", + "extraData": "" + } + }, + { + "id": "shareledger17susx3ss2tg9920v3e0lpj6gkjxmsrs7dfckpd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17susx3ss2tg9920v3e0lpj6gkjxmsrs7dfckpd", + "ownerAddress": "shareledger17susx3ss2tg9920v3e0lpj6gkjxmsrs7dfckpd", + "extraData": "" + } + }, + { + "id": "shareledger17tyj29w87cm92528efwm7grzqx9tt9s4cekff4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17tyj29w87cm92528efwm7grzqx9tt9s4cekff4", + "ownerAddress": "shareledger17tyj29w87cm92528efwm7grzqx9tt9s4cekff4", + "extraData": "" + } + }, + { + "id": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "ownerAddress": "shareledger17tyrrvsxg3sgmw7vxlzj7t0cxxjx30750338nm", + "extraData": "" + } + }, + { + "id": "shareledger17umu93zd3czc2dt6xfpqflxpt7pcpzh2287zj9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17umu93zd3czc2dt6xfpqflxpt7pcpzh2287zj9", + "ownerAddress": "shareledger17umu93zd3czc2dt6xfpqflxpt7pcpzh2287zj9", + "extraData": "" + } + }, + { + "id": "shareledger17vkn65n7m7e4hpv5ekcqkf24t2zdz387r0mhrp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17vkn65n7m7e4hpv5ekcqkf24t2zdz387r0mhrp", + "ownerAddress": "shareledger17vkn65n7m7e4hpv5ekcqkf24t2zdz387r0mhrp", + "extraData": "" + } + }, + { + "id": "shareledger17vw87kp9p77ykmskyz3xl5a7ug7e2d0vgqgls7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17vw87kp9p77ykmskyz3xl5a7ug7e2d0vgqgls7", + "ownerAddress": "shareledger17vw87kp9p77ykmskyz3xl5a7ug7e2d0vgqgls7", + "extraData": "" + } + }, + { + "id": "shareledger17vwl5v7tgf7lt4335gvmdakfk9ln8xlsz5d48s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17vwl5v7tgf7lt4335gvmdakfk9ln8xlsz5d48s", + "ownerAddress": "shareledger17vwl5v7tgf7lt4335gvmdakfk9ln8xlsz5d48s", + "extraData": "" + } + }, + { + "id": "shareledger17wfm9v9nnpmr82van8ukhfrtvqy63c7n3drsme", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17wfm9v9nnpmr82van8ukhfrtvqy63c7n3drsme", + "ownerAddress": "shareledger17wfm9v9nnpmr82van8ukhfrtvqy63c7n3drsme", + "extraData": "" + } + }, + { + "id": "shareledger17wm777qyjhmvy97pvhvef8zcteec0gsd8ak7f5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17wm777qyjhmvy97pvhvef8zcteec0gsd8ak7f5", + "ownerAddress": "shareledger17wm777qyjhmvy97pvhvef8zcteec0gsd8ak7f5", + "extraData": "" + } + }, + { + "id": "shareledger17wp2jpksatf9m57e4sfcwpmnw0fudj7qsujlcu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17wp2jpksatf9m57e4sfcwpmnw0fudj7qsujlcu", + "ownerAddress": "shareledger17wp2jpksatf9m57e4sfcwpmnw0fudj7qsujlcu", + "extraData": "" + } + }, + { + "id": "shareledger17yan8d6uqm4puursd7qhqhs7lrvh0ga3zr5v2l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17yan8d6uqm4puursd7qhqhs7lrvh0ga3zr5v2l", + "ownerAddress": "shareledger17yan8d6uqm4puursd7qhqhs7lrvh0ga3zr5v2l", + "extraData": "" + } + }, + { + "id": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "ownerAddress": "shareledger17yzsuq5s6ehaau5t3sqsnxmcfm3hyp2c62kx25", + "extraData": "" + } + }, + { + "id": "shareledger17zfuq5lmgusv6kwetj4a2g7ghxpt3k9zpk62sa", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17zfuq5lmgusv6kwetj4a2g7ghxpt3k9zpk62sa", + "ownerAddress": "shareledger17zfuq5lmgusv6kwetj4a2g7ghxpt3k9zpk62sa", + "extraData": "" + } + }, + { + "id": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "ownerAddress": "shareledger17zpcqvze7fxchv4lvsyys44w86uum7k5yaa2pf", + "extraData": "" + } + }, + { + "id": "shareledger180ywww0t9n0f3n0hzv5zwhtmlnd9yz6alymjgl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger180ywww0t9n0f3n0hzv5zwhtmlnd9yz6alymjgl", + "ownerAddress": "shareledger180ywww0t9n0f3n0hzv5zwhtmlnd9yz6alymjgl", + "extraData": "" + } + }, + { + "id": "shareledger182fr02u08a84g22p2thpjmq3svyzj67hjr53ua", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger182fr02u08a84g22p2thpjmq3svyzj67hjr53ua", + "ownerAddress": "shareledger182fr02u08a84g22p2thpjmq3svyzj67hjr53ua", + "extraData": "" + } + }, + { + "id": "shareledger182vxy8udcquclnxvkrsefqemh6v7en9s7muy2f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger182vxy8udcquclnxvkrsefqemh6v7en9s7muy2f", + "ownerAddress": "shareledger182vxy8udcquclnxvkrsefqemh6v7en9s7muy2f", + "extraData": "" + } + }, + { + "id": "shareledger183c2qm3vv7sjr0r45rr6ue8tzjm9axkdhd0qy6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger183c2qm3vv7sjr0r45rr6ue8tzjm9axkdhd0qy6", + "ownerAddress": "shareledger183c2qm3vv7sjr0r45rr6ue8tzjm9axkdhd0qy6", + "extraData": "" + } + }, + { + "id": "shareledger1843efasfcyzj57u6fxn99m0pxec48wdru3h2xd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1843efasfcyzj57u6fxn99m0pxec48wdru3h2xd", + "ownerAddress": "shareledger1843efasfcyzj57u6fxn99m0pxec48wdru3h2xd", + "extraData": "" + } + }, + { + "id": "shareledger186ttw0fatjca53vwr2v77rrnj0qwcdz7k9c3uu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger186ttw0fatjca53vwr2v77rrnj0qwcdz7k9c3uu", + "ownerAddress": "shareledger186ttw0fatjca53vwr2v77rrnj0qwcdz7k9c3uu", + "extraData": "" + } + }, + { + "id": "shareledger187qalkapld3qf23vcka0548ngknygtcn6pxele", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger187qalkapld3qf23vcka0548ngknygtcn6pxele", + "ownerAddress": "shareledger187qalkapld3qf23vcka0548ngknygtcn6pxele", + "extraData": "" + } + }, + { + "id": "shareledger189fzy5h9u858k8rr5r6q427hk069gvaavqg4gh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger189fzy5h9u858k8rr5r6q427hk069gvaavqg4gh", + "ownerAddress": "shareledger189fzy5h9u858k8rr5r6q427hk069gvaavqg4gh", + "extraData": "" + } + }, + { + "id": "shareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "ownerAddress": "shareledger189r8gxcdnxvr2xeklekemv4jt6jwnp8ygpd8j5", + "extraData": "" + } + }, + { + "id": "shareledger189sgzfzrfnnzdwkhnljd4527zuh8tzsdfmx86d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger189sgzfzrfnnzdwkhnljd4527zuh8tzsdfmx86d", + "ownerAddress": "shareledger189sgzfzrfnnzdwkhnljd4527zuh8tzsdfmx86d", + "extraData": "" + } + }, + { + "id": "shareledger189z77wl32h8m4ly8n4jqqly4urpn3msj6t3cl2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger189z77wl32h8m4ly8n4jqqly4urpn3msj6t3cl2", + "ownerAddress": "shareledger189z77wl32h8m4ly8n4jqqly4urpn3msj6t3cl2", + "extraData": "" + } + }, + { + "id": "shareledger18a3d6szdds6898nedu7xn4205yz7pesnfv9v0t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18a3d6szdds6898nedu7xn4205yz7pesnfv9v0t", + "ownerAddress": "shareledger18a3d6szdds6898nedu7xn4205yz7pesnfv9v0t", + "extraData": "" + } + }, + { + "id": "shareledger18a9ys36u50fmmlpyxd7y9e60mv8jca43c3tzxz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18a9ys36u50fmmlpyxd7y9e60mv8jca43c3tzxz", + "ownerAddress": "shareledger18a9ys36u50fmmlpyxd7y9e60mv8jca43c3tzxz", + "extraData": "" + } + }, + { + "id": "shareledger18cmz8vyq7evmrymnkfuys88es69fg6c6r70q0l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18cmz8vyq7evmrymnkfuys88es69fg6c6r70q0l", + "ownerAddress": "shareledger18cmz8vyq7evmrymnkfuys88es69fg6c6r70q0l", + "extraData": "" + } + }, + { + "id": "shareledger18d2twfhrhn4j4dx9423xthc8lmzcp8e580w8k9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18d2twfhrhn4j4dx9423xthc8lmzcp8e580w8k9", + "ownerAddress": "shareledger18d2twfhrhn4j4dx9423xthc8lmzcp8e580w8k9", + "extraData": "" + } + }, + { + "id": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "ownerAddress": "shareledger18d8ut9uq7200862q0lkhjufe363sm48saq4zvk", + "extraData": "" + } + }, + { + "id": "shareledger18d94dlnwdns9t0lsavx8wckdjnu4ygv0v3ptln", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18d94dlnwdns9t0lsavx8wckdjnu4ygv0v3ptln", + "ownerAddress": "shareledger18d94dlnwdns9t0lsavx8wckdjnu4ygv0v3ptln", + "extraData": "" + } + }, + { + "id": "shareledger18dg55agj38x2lwssq6rc69ap3hdj8rcgsa39p4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18dg55agj38x2lwssq6rc69ap3hdj8rcgsa39p4", + "ownerAddress": "shareledger18dg55agj38x2lwssq6rc69ap3hdj8rcgsa39p4", + "extraData": "" + } + }, + { + "id": "shareledger18dl67sulr3rkpka0r2pwntudufsnkn3gl9axj9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18dl67sulr3rkpka0r2pwntudufsnkn3gl9axj9", + "ownerAddress": "shareledger18dl67sulr3rkpka0r2pwntudufsnkn3gl9axj9", + "extraData": "" + } + }, + { + "id": "shareledger18eteskmcz6wseys59p7u6zhqh8vvcva8rtk8rp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18eteskmcz6wseys59p7u6zhqh8vvcva8rtk8rp", + "ownerAddress": "shareledger18eteskmcz6wseys59p7u6zhqh8vvcva8rtk8rp", + "extraData": "" + } + }, + { + "id": "shareledger18evn039tvjnz7lnd294hlwmacf942qvp2vhkuq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18evn039tvjnz7lnd294hlwmacf942qvp2vhkuq", + "ownerAddress": "shareledger18evn039tvjnz7lnd294hlwmacf942qvp2vhkuq", + "extraData": "" + } + }, + { + "id": "shareledger18ewz9t8t9afycwgxrdphmlef0fw04emtdf0ug0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18ewz9t8t9afycwgxrdphmlef0fw04emtdf0ug0", + "ownerAddress": "shareledger18ewz9t8t9afycwgxrdphmlef0fw04emtdf0ug0", + "extraData": "" + } + }, + { + "id": "shareledger18f9kvrqlq6jzvkhjugau8ef5u96cn65dca0205", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18f9kvrqlq6jzvkhjugau8ef5u96cn65dca0205", + "ownerAddress": "shareledger18f9kvrqlq6jzvkhjugau8ef5u96cn65dca0205", + "extraData": "" + } + }, + { + "id": "shareledger18gmx52hfzusxtevmljalxa4jhjamqlwy9dex5t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18gmx52hfzusxtevmljalxa4jhjamqlwy9dex5t", + "ownerAddress": "shareledger18gmx52hfzusxtevmljalxa4jhjamqlwy9dex5t", + "extraData": "" + } + }, + { + "id": "shareledger18h7lyq0l9m9rwvtmmfjljwx06mr7yxd3azut3u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18h7lyq0l9m9rwvtmmfjljwx06mr7yxd3azut3u", + "ownerAddress": "shareledger18h7lyq0l9m9rwvtmmfjljwx06mr7yxd3azut3u", + "extraData": "" + } + }, + { + "id": "shareledger18hsj5xprfxxcg8wr8cjfgdqvh6mrqn8ua3yvhv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18hsj5xprfxxcg8wr8cjfgdqvh6mrqn8ua3yvhv", + "ownerAddress": "shareledger18hsj5xprfxxcg8wr8cjfgdqvh6mrqn8ua3yvhv", + "extraData": "" + } + }, + { + "id": "shareledger18htj0s49d6y9erdu5cjc2h2tuphna8utmh4pzt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18htj0s49d6y9erdu5cjc2h2tuphna8utmh4pzt", + "ownerAddress": "shareledger18htj0s49d6y9erdu5cjc2h2tuphna8utmh4pzt", + "extraData": "" + } + }, + { + "id": "shareledger18htu3fcyfq0hkw0hdjr2r9t0tx0f2qgnvmhw4d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18htu3fcyfq0hkw0hdjr2r9t0tx0f2qgnvmhw4d", + "ownerAddress": "shareledger18htu3fcyfq0hkw0hdjr2r9t0tx0f2qgnvmhw4d", + "extraData": "" + } + }, + { + "id": "shareledger18hwm3qsyenu5z5geqnkspeug7q9k3g6j7km2e2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18hwm3qsyenu5z5geqnkspeug7q9k3g6j7km2e2", + "ownerAddress": "shareledger18hwm3qsyenu5z5geqnkspeug7q9k3g6j7km2e2", + "extraData": "" + } + }, + { + "id": "shareledger18j4n0neg6h2dstpjllgcy3gnhe6hajtyh7juax", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18j4n0neg6h2dstpjllgcy3gnhe6hajtyh7juax", + "ownerAddress": "shareledger18j4n0neg6h2dstpjllgcy3gnhe6hajtyh7juax", + "extraData": "" + } + }, + { + "id": "shareledger18j6l98k9m6ckf480g5nmwqyz392z8yre2tz8nx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18j6l98k9m6ckf480g5nmwqyz392z8yre2tz8nx", + "ownerAddress": "shareledger18j6l98k9m6ckf480g5nmwqyz392z8yre2tz8nx", + "extraData": "" + } + }, + { + "id": "shareledger18jm6fsuhyf4f0nw3z3hx8d3jpwgkc9gqlpymqq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18jm6fsuhyf4f0nw3z3hx8d3jpwgkc9gqlpymqq", + "ownerAddress": "shareledger18jm6fsuhyf4f0nw3z3hx8d3jpwgkc9gqlpymqq", + "extraData": "" + } + }, + { + "id": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "ownerAddress": "shareledger18js8weawd0v8lvf4gye6yv476hww7u5fszes38", + "extraData": "" + } + }, + { + "id": "shareledger18k8e7gfn29qryjcs2yekdknmvsfjpf4pmcp4sc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18k8e7gfn29qryjcs2yekdknmvsfjpf4pmcp4sc", + "ownerAddress": "shareledger18k8e7gfn29qryjcs2yekdknmvsfjpf4pmcp4sc", + "extraData": "" + } + }, + { + "id": "shareledger18lwkjx40w8klf6wtrvdtwk2f685gz8e0pmmymr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18lwkjx40w8klf6wtrvdtwk2f685gz8e0pmmymr", + "ownerAddress": "shareledger18lwkjx40w8klf6wtrvdtwk2f685gz8e0pmmymr", + "extraData": "" + } + }, + { + "id": "shareledger18m4le7qrrhguj5vvfzpejsvrsjzyt46cy40t6m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18m4le7qrrhguj5vvfzpejsvrsjzyt46cy40t6m", + "ownerAddress": "shareledger18m4le7qrrhguj5vvfzpejsvrsjzyt46cy40t6m", + "extraData": "" + } + }, + { + "id": "shareledger18m8ch9x6ejr7yvgx3p3szt8a04wfpemv9ttg3g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18m8ch9x6ejr7yvgx3p3szt8a04wfpemv9ttg3g", + "ownerAddress": "shareledger18m8ch9x6ejr7yvgx3p3szt8a04wfpemv9ttg3g", + "extraData": "" + } + }, + { + "id": "shareledger18mteejsyfxpytwqvurslmpy8nsxv39c7tfykh7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18mteejsyfxpytwqvurslmpy8nsxv39c7tfykh7", + "ownerAddress": "shareledger18mteejsyfxpytwqvurslmpy8nsxv39c7tfykh7", + "extraData": "" + } + }, + { + "id": "shareledger18n0fg4kktxe68h7eljnyek70g8h3kt75s26hlx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18n0fg4kktxe68h7eljnyek70g8h3kt75s26hlx", + "ownerAddress": "shareledger18n0fg4kktxe68h7eljnyek70g8h3kt75s26hlx", + "extraData": "" + } + }, + { + "id": "shareledger18pufllgsethcqry093glfaeuj533h2jvuuj80z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18pufllgsethcqry093glfaeuj533h2jvuuj80z", + "ownerAddress": "shareledger18pufllgsethcqry093glfaeuj533h2jvuuj80z", + "extraData": "" + } + }, + { + "id": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "ownerAddress": "shareledger18pvjzyyeen2d5dcy8zmdqlatss5s2akc0d0uxy", + "extraData": "" + } + }, + { + "id": "shareledger18q69hu4d6mzupgsatm4tjh986fzxhs868ltwsx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18q69hu4d6mzupgsatm4tjh986fzxhs868ltwsx", + "ownerAddress": "shareledger18q69hu4d6mzupgsatm4tjh986fzxhs868ltwsx", + "extraData": "" + } + }, + { + "id": "shareledger18qgt9nkv86zr5kfwlv8pwz5s67r6xlt6nl0q7u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18qgt9nkv86zr5kfwlv8pwz5s67r6xlt6nl0q7u", + "ownerAddress": "shareledger18qgt9nkv86zr5kfwlv8pwz5s67r6xlt6nl0q7u", + "extraData": "" + } + }, + { + "id": "shareledger18r6d0ea7u2f3e7uqrlka0ed90tze429spsuqdd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18r6d0ea7u2f3e7uqrlka0ed90tze429spsuqdd", + "ownerAddress": "shareledger18r6d0ea7u2f3e7uqrlka0ed90tze429spsuqdd", + "extraData": "" + } + }, + { + "id": "shareledger18r6x0u2v2nkr70xefr92ayawjzfxjys4l6qj8y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18r6x0u2v2nkr70xefr92ayawjzfxjys4l6qj8y", + "ownerAddress": "shareledger18r6x0u2v2nkr70xefr92ayawjzfxjys4l6qj8y", + "extraData": "" + } + }, + { + "id": "shareledger18s9e8g52x8h8fjkk6uueyuqwyz890ve5rewypg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18s9e8g52x8h8fjkk6uueyuqwyz890ve5rewypg", + "ownerAddress": "shareledger18s9e8g52x8h8fjkk6uueyuqwyz890ve5rewypg", + "extraData": "" + } + }, + { + "id": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "ownerAddress": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "extraData": "" + } + }, + { + "id": "shareledger18sv0put853yaeqm8a9qz564xh9l7rck328el8l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18sv0put853yaeqm8a9qz564xh9l7rck328el8l", + "ownerAddress": "shareledger18sv0put853yaeqm8a9qz564xh9l7rck328el8l", + "extraData": "" + } + }, + { + "id": "shareledger18t0vyywyqv69trnkjn60f7xnkmzslnenqj74vx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18t0vyywyqv69trnkjn60f7xnkmzslnenqj74vx", + "ownerAddress": "shareledger18t0vyywyqv69trnkjn60f7xnkmzslnenqj74vx", + "extraData": "" + } + }, + { + "id": "shareledger18uu3tgv5c34gaxlm9mkdnuslvfp65gzjkhmccu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18uu3tgv5c34gaxlm9mkdnuslvfp65gzjkhmccu", + "ownerAddress": "shareledger18uu3tgv5c34gaxlm9mkdnuslvfp65gzjkhmccu", + "extraData": "" + } + }, + { + "id": "shareledger18w8xpqh6ke86jkp8tzyyc74uwh4gwfz798w6qp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18w8xpqh6ke86jkp8tzyyc74uwh4gwfz798w6qp", + "ownerAddress": "shareledger18w8xpqh6ke86jkp8tzyyc74uwh4gwfz798w6qp", + "extraData": "" + } + }, + { + "id": "shareledger18wrr0xplpzfrrqwqmvk6mn49zgmlg3nw6lpmg9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18wrr0xplpzfrrqwqmvk6mn49zgmlg3nw6lpmg9", + "ownerAddress": "shareledger18wrr0xplpzfrrqwqmvk6mn49zgmlg3nw6lpmg9", + "extraData": "" + } + }, + { + "id": "shareledger18xdke7ymzl98330ryljhuljy44g66f868s0uxa", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18xdke7ymzl98330ryljhuljy44g66f868s0uxa", + "ownerAddress": "shareledger18xdke7ymzl98330ryljhuljy44g66f868s0uxa", + "extraData": "" + } + }, + { + "id": "shareledger18xgkeuhdmp30dn27lttxe6p58xcl3ea30hhgq9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18xgkeuhdmp30dn27lttxe6p58xcl3ea30hhgq9", + "ownerAddress": "shareledger18xgkeuhdmp30dn27lttxe6p58xcl3ea30hhgq9", + "extraData": "" + } + }, + { + "id": "shareledger18xh7vassac6d0vwyffmtr6cuhm7anwd7lr76u4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18xh7vassac6d0vwyffmtr6cuhm7anwd7lr76u4", + "ownerAddress": "shareledger18xh7vassac6d0vwyffmtr6cuhm7anwd7lr76u4", + "extraData": "" + } + }, + { + "id": "shareledger18xmrfynrt6pr4t0t3xc7x56f5kdh5l7nh8fmjc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18xmrfynrt6pr4t0t3xc7x56f5kdh5l7nh8fmjc", + "ownerAddress": "shareledger18xmrfynrt6pr4t0t3xc7x56f5kdh5l7nh8fmjc", + "extraData": "" + } + }, + { + "id": "shareledger18xr424yy53gj88mqph25hxa65mdt4zhrae0gvn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18xr424yy53gj88mqph25hxa65mdt4zhrae0gvn", + "ownerAddress": "shareledger18xr424yy53gj88mqph25hxa65mdt4zhrae0gvn", + "extraData": "" + } + }, + { + "id": "shareledger18xwztyus5aynnndlwk9qagqhxunvver8ahdr69", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18xwztyus5aynnndlwk9qagqhxunvver8ahdr69", + "ownerAddress": "shareledger18xwztyus5aynnndlwk9qagqhxunvver8ahdr69", + "extraData": "" + } + }, + { + "id": "shareledger18yfzkw4yey9tksqc3tutswn8e70uj2vtmws9aj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18yfzkw4yey9tksqc3tutswn8e70uj2vtmws9aj", + "ownerAddress": "shareledger18yfzkw4yey9tksqc3tutswn8e70uj2vtmws9aj", + "extraData": "" + } + }, + { + "id": "shareledger18z9fhhexxcscl5uetfguqnsn8lyq2n488czy6k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18z9fhhexxcscl5uetfguqnsn8lyq2n488czy6k", + "ownerAddress": "shareledger18z9fhhexxcscl5uetfguqnsn8lyq2n488czy6k", + "extraData": "" + } + }, + { + "id": "shareledger18zkl3nkrvcjjpdfpruv26thrauxdtsaqq9ajl2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18zkl3nkrvcjjpdfpruv26thrauxdtsaqq9ajl2", + "ownerAddress": "shareledger18zkl3nkrvcjjpdfpruv26thrauxdtsaqq9ajl2", + "extraData": "" + } + }, + { + "id": "shareledger18zqy9nsz8lstnvmtt3jm5gcm3l08z2l4v5gfp8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger18zqy9nsz8lstnvmtt3jm5gcm3l08z2l4v5gfp8", + "ownerAddress": "shareledger18zqy9nsz8lstnvmtt3jm5gcm3l08z2l4v5gfp8", + "extraData": "" + } + }, + { + "id": "shareledger192cg6txf8kwnkaat9mmuuc4ynn74yfa22p2mmv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger192cg6txf8kwnkaat9mmuuc4ynn74yfa22p2mmv", + "ownerAddress": "shareledger192cg6txf8kwnkaat9mmuuc4ynn74yfa22p2mmv", + "extraData": "" + } + }, + { + "id": "shareledger193d73qlrugdfhxl7g5y25agegh7emsgf4ewlg2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger193d73qlrugdfhxl7g5y25agegh7emsgf4ewlg2", + "ownerAddress": "shareledger193d73qlrugdfhxl7g5y25agegh7emsgf4ewlg2", + "extraData": "" + } + }, + { + "id": "shareledger1944gdnshe95l5x4u9mgktk5vjmqgpyerphvjpc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1944gdnshe95l5x4u9mgktk5vjmqgpyerphvjpc", + "ownerAddress": "shareledger1944gdnshe95l5x4u9mgktk5vjmqgpyerphvjpc", + "extraData": "" + } + }, + { + "id": "shareledger194qjr5nyk8u42cp90fypsu6npau0wjmtmqurl2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger194qjr5nyk8u42cp90fypsu6npau0wjmtmqurl2", + "ownerAddress": "shareledger194qjr5nyk8u42cp90fypsu6npau0wjmtmqurl2", + "extraData": "" + } + }, + { + "id": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "ownerAddress": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "extraData": "" + } + }, + { + "id": "shareledger1956vre8jk8yzfyy7k6ve70hd0mken705w0ga7d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1956vre8jk8yzfyy7k6ve70hd0mken705w0ga7d", + "ownerAddress": "shareledger1956vre8jk8yzfyy7k6ve70hd0mken705w0ga7d", + "extraData": "" + } + }, + { + "id": "shareledger195l9juj5w70ywty8zs334mc4kqaml6l4dx9ech", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger195l9juj5w70ywty8zs334mc4kqaml6l4dx9ech", + "ownerAddress": "shareledger195l9juj5w70ywty8zs334mc4kqaml6l4dx9ech", + "extraData": "" + } + }, + { + "id": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "ownerAddress": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "extraData": "" + } + }, + { + "id": "shareledger196jy68pzpgappxly3gsft57umtvvh83jsvvrnt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger196jy68pzpgappxly3gsft57umtvvh83jsvvrnt", + "ownerAddress": "shareledger196jy68pzpgappxly3gsft57umtvvh83jsvvrnt", + "extraData": "" + } + }, + { + "id": "shareledger198gmpcferc78h4sk303d6ngedd96dejyla4xs0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger198gmpcferc78h4sk303d6ngedd96dejyla4xs0", + "ownerAddress": "shareledger198gmpcferc78h4sk303d6ngedd96dejyla4xs0", + "extraData": "" + } + }, + { + "id": "shareledger198pvwv7yzgdpqg3sen0r0xmwmuhxq7ffmcsvwu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger198pvwv7yzgdpqg3sen0r0xmwmuhxq7ffmcsvwu", + "ownerAddress": "shareledger198pvwv7yzgdpqg3sen0r0xmwmuhxq7ffmcsvwu", + "extraData": "" + } + }, + { + "id": "shareledger198yd4uuzxhc8d4s9vx40y7t5lunlevanhjvlh8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger198yd4uuzxhc8d4s9vx40y7t5lunlevanhjvlh8", + "ownerAddress": "shareledger198yd4uuzxhc8d4s9vx40y7t5lunlevanhjvlh8", + "extraData": "" + } + }, + { + "id": "shareledger19957h2ek6k2rnnkftlxaf3sduyput4t9y8dvnh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19957h2ek6k2rnnkftlxaf3sduyput4t9y8dvnh", + "ownerAddress": "shareledger19957h2ek6k2rnnkftlxaf3sduyput4t9y8dvnh", + "extraData": "" + } + }, + { + "id": "shareledger199cpkjch5469fsyfq9lrtfnj2mxnf8r37724ae", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger199cpkjch5469fsyfq9lrtfnj2mxnf8r37724ae", + "ownerAddress": "shareledger199cpkjch5469fsyfq9lrtfnj2mxnf8r37724ae", + "extraData": "" + } + }, + { + "id": "shareledger199llequcug9etfjgrs2m5vu3jqvhyzytwm5m92", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger199llequcug9etfjgrs2m5vu3jqvhyzytwm5m92", + "ownerAddress": "shareledger199llequcug9etfjgrs2m5vu3jqvhyzytwm5m92", + "extraData": "" + } + }, + { + "id": "shareledger199prtlqzmm6wqc0pewmxqvz760kpqrd2ze69gk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger199prtlqzmm6wqc0pewmxqvz760kpqrd2ze69gk", + "ownerAddress": "shareledger199prtlqzmm6wqc0pewmxqvz760kpqrd2ze69gk", + "extraData": "" + } + }, + { + "id": "shareledger199x74a69ta9mf9jsj6vmf2fwa702km92krkdze", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger199x74a69ta9mf9jsj6vmf2fwa702km92krkdze", + "ownerAddress": "shareledger199x74a69ta9mf9jsj6vmf2fwa702km92krkdze", + "extraData": "" + } + }, + { + "id": "shareledger19dgjh9quc63zfyrfcr85ry4lfk76utuxtsywa7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19dgjh9quc63zfyrfcr85ry4lfk76utuxtsywa7", + "ownerAddress": "shareledger19dgjh9quc63zfyrfcr85ry4lfk76utuxtsywa7", + "extraData": "" + } + }, + { + "id": "shareledger19dtkp6vqgcuk2ln4q9vpkpt6dcgyg6a8al85ax", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19dtkp6vqgcuk2ln4q9vpkpt6dcgyg6a8al85ax", + "ownerAddress": "shareledger19dtkp6vqgcuk2ln4q9vpkpt6dcgyg6a8al85ax", + "extraData": "" + } + }, + { + "id": "shareledger19fd7lygw8tjw44wnyzm0fmjcmaavrwp7hagphj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19fd7lygw8tjw44wnyzm0fmjcmaavrwp7hagphj", + "ownerAddress": "shareledger19fd7lygw8tjw44wnyzm0fmjcmaavrwp7hagphj", + "extraData": "" + } + }, + { + "id": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "ownerAddress": "shareledger19fhtgpc7rnf7ad2excul5y8w2d5n20hpwm9087", + "extraData": "" + } + }, + { + "id": "shareledger19fj2sz579ad0fs88dttvf42yjw2tg2pwshk4se", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19fj2sz579ad0fs88dttvf42yjw2tg2pwshk4se", + "ownerAddress": "shareledger19fj2sz579ad0fs88dttvf42yjw2tg2pwshk4se", + "extraData": "" + } + }, + { + "id": "shareledger19g76putjt0mwkkykvfmg4qq63zpxg95pm7uvrx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19g76putjt0mwkkykvfmg4qq63zpxg95pm7uvrx", + "ownerAddress": "shareledger19g76putjt0mwkkykvfmg4qq63zpxg95pm7uvrx", + "extraData": "" + } + }, + { + "id": "shareledger19gcvnxpr0m0wxf8hwtzr5hk4sn9nfqdh8zc749", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19gcvnxpr0m0wxf8hwtzr5hk4sn9nfqdh8zc749", + "ownerAddress": "shareledger19gcvnxpr0m0wxf8hwtzr5hk4sn9nfqdh8zc749", + "extraData": "" + } + }, + { + "id": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "ownerAddress": "shareledger19gdg2xmq2u86rcd5xws39ku3f8n3q7kxjyf7pg", + "extraData": "" + } + }, + { + "id": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "ownerAddress": "shareledger19hf3mqhmnk9gp672ucaj6nraldvj9aghepq2j7", + "extraData": "" + } + }, + { + "id": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "ownerAddress": "shareledger19hxuh57le6e9luftxelz3cy2trcp4yv8y6kmq9", + "extraData": "" + } + }, + { + "id": "shareledger19jnw8j0nw2wpze467ygkcgs9chyytgrk3rajq0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19jnw8j0nw2wpze467ygkcgs9chyytgrk3rajq0", + "ownerAddress": "shareledger19jnw8j0nw2wpze467ygkcgs9chyytgrk3rajq0", + "extraData": "" + } + }, + { + "id": "shareledger19l9nzy8az59x2ctq979jnmkrrp5ufkhjn4f7th", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19l9nzy8az59x2ctq979jnmkrrp5ufkhjn4f7th", + "ownerAddress": "shareledger19l9nzy8az59x2ctq979jnmkrrp5ufkhjn4f7th", + "extraData": "" + } + }, + { + "id": "shareledger19lcec3453pzxszvr6yc7s33w94hqpx406cusgu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19lcec3453pzxszvr6yc7s33w94hqpx406cusgu", + "ownerAddress": "shareledger19lcec3453pzxszvr6yc7s33w94hqpx406cusgu", + "extraData": "" + } + }, + { + "id": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "ownerAddress": "shareledger19lrgre90quktgjsnyzhslmc3gw8qr78ptlyul2", + "extraData": "" + } + }, + { + "id": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "ownerAddress": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "extraData": "" + } + }, + { + "id": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "ownerAddress": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "extraData": "" + } + }, + { + "id": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "ownerAddress": "shareledger19mqpeq6cn5536upe5gxkpjvgkg9d0r8rw8nh04", + "extraData": "" + } + }, + { + "id": "shareledger19mwyye4cvn5nx2fw4wn5j9720pm37ym7lgca23", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19mwyye4cvn5nx2fw4wn5j9720pm37ym7lgca23", + "ownerAddress": "shareledger19mwyye4cvn5nx2fw4wn5j9720pm37ym7lgca23", + "extraData": "" + } + }, + { + "id": "shareledger19nvvqfaxtundjpmydf0yk3s3h7tq4kh2s5guxv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19nvvqfaxtundjpmydf0yk3s3h7tq4kh2s5guxv", + "ownerAddress": "shareledger19nvvqfaxtundjpmydf0yk3s3h7tq4kh2s5guxv", + "extraData": "" + } + }, + { + "id": "shareledger19p3ckecgwye4n5cssej73npl8a5wm59qp8ft4w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19p3ckecgwye4n5cssej73npl8a5wm59qp8ft4w", + "ownerAddress": "shareledger19p3ckecgwye4n5cssej73npl8a5wm59qp8ft4w", + "extraData": "" + } + }, + { + "id": "shareledger19p97fwhdcuw6s0w9jmen0wqjkjhcgqk2mp3n98", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19p97fwhdcuw6s0w9jmen0wqjkjhcgqk2mp3n98", + "ownerAddress": "shareledger19p97fwhdcuw6s0w9jmen0wqjkjhcgqk2mp3n98", + "extraData": "" + } + }, + { + "id": "shareledger19przdrzq0kz4cghdgmm0y6v3lknqp6fe0kq6gq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19przdrzq0kz4cghdgmm0y6v3lknqp6fe0kq6gq", + "ownerAddress": "shareledger19przdrzq0kz4cghdgmm0y6v3lknqp6fe0kq6gq", + "extraData": "" + } + }, + { + "id": "shareledger19ptcj3kyfm5ejz9akxwkt20eaauvkftyxnl4cx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19ptcj3kyfm5ejz9akxwkt20eaauvkftyxnl4cx", + "ownerAddress": "shareledger19ptcj3kyfm5ejz9akxwkt20eaauvkftyxnl4cx", + "extraData": "" + } + }, + { + "id": "shareledger19q80xzrf7w40kn96v42gd9akjle0lrnactgxsw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19q80xzrf7w40kn96v42gd9akjle0lrnactgxsw", + "ownerAddress": "shareledger19q80xzrf7w40kn96v42gd9akjle0lrnactgxsw", + "extraData": "" + } + }, + { + "id": "shareledger19r2s989e4s3l8cfdwz89mmcpzr8hquhjpj9k6l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19r2s989e4s3l8cfdwz89mmcpzr8hquhjpj9k6l", + "ownerAddress": "shareledger19r2s989e4s3l8cfdwz89mmcpzr8hquhjpj9k6l", + "extraData": "" + } + }, + { + "id": "shareledger19r977jcv6528v7nw3tp8jrvzffkxsgntknfhhx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19r977jcv6528v7nw3tp8jrvzffkxsgntknfhhx", + "ownerAddress": "shareledger19r977jcv6528v7nw3tp8jrvzffkxsgntknfhhx", + "extraData": "" + } + }, + { + "id": "shareledger19rug3t0sa63k29mn5vc2ngzc2njh2n3pry97ce", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19rug3t0sa63k29mn5vc2ngzc2njh2n3pry97ce", + "ownerAddress": "shareledger19rug3t0sa63k29mn5vc2ngzc2njh2n3pry97ce", + "extraData": "" + } + }, + { + "id": "shareledger19s60d457dn5ld8uzprazqx7e6jf7x2uuxlkw0y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19s60d457dn5ld8uzprazqx7e6jf7x2uuxlkw0y", + "ownerAddress": "shareledger19s60d457dn5ld8uzprazqx7e6jf7x2uuxlkw0y", + "extraData": "" + } + }, + { + "id": "shareledger19swxjqnysaluav809em6he29dkdh37l9ffn6fl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19swxjqnysaluav809em6he29dkdh37l9ffn6fl", + "ownerAddress": "shareledger19swxjqnysaluav809em6he29dkdh37l9ffn6fl", + "extraData": "" + } + }, + { + "id": "shareledger19turf7p7f6pnsgrjy9nnvfl48tjm68c82752ap", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19turf7p7f6pnsgrjy9nnvfl48tjm68c82752ap", + "ownerAddress": "shareledger19turf7p7f6pnsgrjy9nnvfl48tjm68c82752ap", + "extraData": "" + } + }, + { + "id": "shareledger19vpvuykd45vk2frmkgynf4zq09gqpd030r8rcl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19vpvuykd45vk2frmkgynf4zq09gqpd030r8rcl", + "ownerAddress": "shareledger19vpvuykd45vk2frmkgynf4zq09gqpd030r8rcl", + "extraData": "" + } + }, + { + "id": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "ownerAddress": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "extraData": "" + } + }, + { + "id": "shareledger19w3hg4xtdu6e0fe44n4nmappswdz6d5rcl6kfz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19w3hg4xtdu6e0fe44n4nmappswdz6d5rcl6kfz", + "ownerAddress": "shareledger19w3hg4xtdu6e0fe44n4nmappswdz6d5rcl6kfz", + "extraData": "" + } + }, + { + "id": "shareledger19wjzd4l8j05fxwny0a7854dm8euplh627tpsnp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19wjzd4l8j05fxwny0a7854dm8euplh627tpsnp", + "ownerAddress": "shareledger19wjzd4l8j05fxwny0a7854dm8euplh627tpsnp", + "extraData": "" + } + }, + { + "id": "shareledger19wx8zjctwqj5aqqd7n5f8jkptfz7gejzlqqdhg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19wx8zjctwqj5aqqd7n5f8jkptfz7gejzlqqdhg", + "ownerAddress": "shareledger19wx8zjctwqj5aqqd7n5f8jkptfz7gejzlqqdhg", + "extraData": "" + } + }, + { + "id": "shareledger19zaqeqk64w4qay5l5gztuv957cs686xkq96lnh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19zaqeqk64w4qay5l5gztuv957cs686xkq96lnh", + "ownerAddress": "shareledger19zaqeqk64w4qay5l5gztuv957cs686xkq96lnh", + "extraData": "" + } + }, + { + "id": "shareledger19zefpjuumhnhc754fyxz400sr3yp4wm5gnhw42", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19zefpjuumhnhc754fyxz400sr3yp4wm5gnhw42", + "ownerAddress": "shareledger19zefpjuumhnhc754fyxz400sr3yp4wm5gnhw42", + "extraData": "" + } + }, + { + "id": "shareledger19zs9zk4r7m0z4kc7kalurmxpkjk2sa5pxzzajg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger19zs9zk4r7m0z4kc7kalurmxpkjk2sa5pxzzajg", + "ownerAddress": "shareledger19zs9zk4r7m0z4kc7kalurmxpkjk2sa5pxzzajg", + "extraData": "" + } + }, + { + "id": "shareledger1a08rw6ufvw5vf8tw3s6swyjxxekv5q20649r9v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a08rw6ufvw5vf8tw3s6swyjxxekv5q20649r9v", + "ownerAddress": "shareledger1a08rw6ufvw5vf8tw3s6swyjxxekv5q20649r9v", + "extraData": "" + } + }, + { + "id": "shareledger1a24j0028dxr76qu5mmtlrg5egaa67gvd66yte0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a24j0028dxr76qu5mmtlrg5egaa67gvd66yte0", + "ownerAddress": "shareledger1a24j0028dxr76qu5mmtlrg5egaa67gvd66yte0", + "extraData": "" + } + }, + { + "id": "shareledger1a250tz42apwp60qxq7z5fw8uym4dqv3xj8lqvg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a250tz42apwp60qxq7z5fw8uym4dqv3xj8lqvg", + "ownerAddress": "shareledger1a250tz42apwp60qxq7z5fw8uym4dqv3xj8lqvg", + "extraData": "" + } + }, + { + "id": "shareledger1a4g2dxuaendcs3t485grq8pwc9vtu0rsh2jhjx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a4g2dxuaendcs3t485grq8pwc9vtu0rsh2jhjx", + "ownerAddress": "shareledger1a4g2dxuaendcs3t485grq8pwc9vtu0rsh2jhjx", + "extraData": "" + } + }, + { + "id": "shareledger1a4p2pas8s2gff2f6jds8ecrhhgr4km06g55r49", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a4p2pas8s2gff2f6jds8ecrhhgr4km06g55r49", + "ownerAddress": "shareledger1a4p2pas8s2gff2f6jds8ecrhhgr4km06g55r49", + "extraData": "" + } + }, + { + "id": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "ownerAddress": "shareledger1a5vcfjlgzn7p8amgss00u6jhry2tjnpf7fu4nj", + "extraData": "" + } + }, + { + "id": "shareledger1a63e0p98k7pd7sa9uvz6vdqyr0ght5jgey6e3g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a63e0p98k7pd7sa9uvz6vdqyr0ght5jgey6e3g", + "ownerAddress": "shareledger1a63e0p98k7pd7sa9uvz6vdqyr0ght5jgey6e3g", + "extraData": "" + } + }, + { + "id": "shareledger1a63xl6vg54h3hkelkm28qaavhuk5nz82lgwrx3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a63xl6vg54h3hkelkm28qaavhuk5nz82lgwrx3", + "ownerAddress": "shareledger1a63xl6vg54h3hkelkm28qaavhuk5nz82lgwrx3", + "extraData": "" + } + }, + { + "id": "shareledger1a656d3qp20pchzz3xvylte500v5q3x58v2ur9j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a656d3qp20pchzz3xvylte500v5q3x58v2ur9j", + "ownerAddress": "shareledger1a656d3qp20pchzz3xvylte500v5q3x58v2ur9j", + "extraData": "" + } + }, + { + "id": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "ownerAddress": "shareledger1a6695wvmdd2xxmkafs4s2acklru7engjp953ud", + "extraData": "" + } + }, + { + "id": "shareledger1a697sccxpjd3txr85c0cyz759gpvhef50ukn7r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a697sccxpjd3txr85c0cyz759gpvhef50ukn7r", + "ownerAddress": "shareledger1a697sccxpjd3txr85c0cyz759gpvhef50ukn7r", + "extraData": "" + } + }, + { + "id": "shareledger1a736jht6yrmrl2swddnruluhwaxsgt00z270dn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a736jht6yrmrl2swddnruluhwaxsgt00z270dn", + "ownerAddress": "shareledger1a736jht6yrmrl2swddnruluhwaxsgt00z270dn", + "extraData": "" + } + }, + { + "id": "shareledger1a7fffa437alljafl5ad30cq5qgr2d39fulkmts", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a7fffa437alljafl5ad30cq5qgr2d39fulkmts", + "ownerAddress": "shareledger1a7fffa437alljafl5ad30cq5qgr2d39fulkmts", + "extraData": "" + } + }, + { + "id": "shareledger1a8e7en0j3as0jdzhhslt0heajare844fdg6frd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1a8e7en0j3as0jdzhhslt0heajare844fdg6frd", + "ownerAddress": "shareledger1a8e7en0j3as0jdzhhslt0heajare844fdg6frd", + "extraData": "" + } + }, + { + "id": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "ownerAddress": "shareledger1aal9h2e68ldtz2hcf9pgdaaxyw7c69qljh4ujf", + "extraData": "" + } + }, + { + "id": "shareledger1ad7mxc7t7mpu08et2z6a2rfv0l5u69qre0kewd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ad7mxc7t7mpu08et2z6a2rfv0l5u69qre0kewd", + "ownerAddress": "shareledger1ad7mxc7t7mpu08et2z6a2rfv0l5u69qre0kewd", + "extraData": "" + } + }, + { + "id": "shareledger1adc3d6mrhsrncwup7z8tqf9ntdacz7dgze6exl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1adc3d6mrhsrncwup7z8tqf9ntdacz7dgze6exl", + "ownerAddress": "shareledger1adc3d6mrhsrncwup7z8tqf9ntdacz7dgze6exl", + "extraData": "" + } + }, + { + "id": "shareledger1adgt7dr68e97mmwdc2gahsl3d7g4tnnzwtyy22", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1adgt7dr68e97mmwdc2gahsl3d7g4tnnzwtyy22", + "ownerAddress": "shareledger1adgt7dr68e97mmwdc2gahsl3d7g4tnnzwtyy22", + "extraData": "" + } + }, + { + "id": "shareledger1aenny4th75nzklmvrp4mmyn5tn7457y397z3cj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1aenny4th75nzklmvrp4mmyn5tn7457y397z3cj", + "ownerAddress": "shareledger1aenny4th75nzklmvrp4mmyn5tn7457y397z3cj", + "extraData": "" + } + }, + { + "id": "shareledger1af28m3vualru29t5rxe7tv4lr4kezdupvnac5q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1af28m3vualru29t5rxe7tv4lr4kezdupvnac5q", + "ownerAddress": "shareledger1af28m3vualru29t5rxe7tv4lr4kezdupvnac5q", + "extraData": "" + } + }, + { + "id": "shareledger1af30386ncq2p3cl2vg395s78v5m9cpqg0l284z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1af30386ncq2p3cl2vg395s78v5m9cpqg0l284z", + "ownerAddress": "shareledger1af30386ncq2p3cl2vg395s78v5m9cpqg0l284z", + "extraData": "" + } + }, + { + "id": "shareledger1af9nvmwdpp5wrfkm895lr74mxvee8qy30atarz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1af9nvmwdpp5wrfkm895lr74mxvee8qy30atarz", + "ownerAddress": "shareledger1af9nvmwdpp5wrfkm895lr74mxvee8qy30atarz", + "extraData": "" + } + }, + { + "id": "shareledger1afuvr8e9usyx6f97ym0h4fae80f8d6eetnrkqu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1afuvr8e9usyx6f97ym0h4fae80f8d6eetnrkqu", + "ownerAddress": "shareledger1afuvr8e9usyx6f97ym0h4fae80f8d6eetnrkqu", + "extraData": "" + } + }, + { + "id": "shareledger1aglu73jjcyu3e0lnw9qasgqlypew93taadk2gf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1aglu73jjcyu3e0lnw9qasgqlypew93taadk2gf", + "ownerAddress": "shareledger1aglu73jjcyu3e0lnw9qasgqlypew93taadk2gf", + "extraData": "" + } + }, + { + "id": "shareledger1ags224y58x2kgpd0uj3y8q2aqech6ep9c725vn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ags224y58x2kgpd0uj3y8q2aqech6ep9c725vn", + "ownerAddress": "shareledger1ags224y58x2kgpd0uj3y8q2aqech6ep9c725vn", + "extraData": "" + } + }, + { + "id": "shareledger1agupcqv5wsj74l9sd9uzw9s8g849zcw4mffss2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1agupcqv5wsj74l9sd9uzw9s8g849zcw4mffss2", + "ownerAddress": "shareledger1agupcqv5wsj74l9sd9uzw9s8g849zcw4mffss2", + "extraData": "" + } + }, + { + "id": "shareledger1ahr8uqpsmgtmfvhd60ymr3j2ml5vjly90g6vm5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ahr8uqpsmgtmfvhd60ymr3j2ml5vjly90g6vm5", + "ownerAddress": "shareledger1ahr8uqpsmgtmfvhd60ymr3j2ml5vjly90g6vm5", + "extraData": "" + } + }, + { + "id": "shareledger1ajztkec9wud37j334wv3x5zy4vyejmxmks6z9a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ajztkec9wud37j334wv3x5zy4vyejmxmks6z9a", + "ownerAddress": "shareledger1ajztkec9wud37j334wv3x5zy4vyejmxmks6z9a", + "extraData": "" + } + }, + { + "id": "shareledger1ak5jehxxvpqy7mxyv3e6ddrgw8prc3sps2ek4x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ak5jehxxvpqy7mxyv3e6ddrgw8prc3sps2ek4x", + "ownerAddress": "shareledger1ak5jehxxvpqy7mxyv3e6ddrgw8prc3sps2ek4x", + "extraData": "" + } + }, + { + "id": "shareledger1alwe43mqgcl5w03x5y2k73ve7h7gsatg4xznk8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1alwe43mqgcl5w03x5y2k73ve7h7gsatg4xznk8", + "ownerAddress": "shareledger1alwe43mqgcl5w03x5y2k73ve7h7gsatg4xznk8", + "extraData": "" + } + }, + { + "id": "shareledger1apjr3qzw6k5awh2l9z8h3vumttu7lagehql8ww", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1apjr3qzw6k5awh2l9z8h3vumttu7lagehql8ww", + "ownerAddress": "shareledger1apjr3qzw6k5awh2l9z8h3vumttu7lagehql8ww", + "extraData": "" + } + }, + { + "id": "shareledger1arwce7qxhqdqdyzyes65yva6fau5rpw8ucg79k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1arwce7qxhqdqdyzyes65yva6fau5rpw8ucg79k", + "ownerAddress": "shareledger1arwce7qxhqdqdyzyes65yva6fau5rpw8ucg79k", + "extraData": "" + } + }, + { + "id": "shareledger1as8nn6p38ygvuuvdep2h0wd7dqyzg9vs3kl7ae", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1as8nn6p38ygvuuvdep2h0wd7dqyzg9vs3kl7ae", + "ownerAddress": "shareledger1as8nn6p38ygvuuvdep2h0wd7dqyzg9vs3kl7ae", + "extraData": "" + } + }, + { + "id": "shareledger1atek75qqp2dx6xk6jkyvm6q8v52tpas06z3k9s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1atek75qqp2dx6xk6jkyvm6q8v52tpas06z3k9s", + "ownerAddress": "shareledger1atek75qqp2dx6xk6jkyvm6q8v52tpas06z3k9s", + "extraData": "" + } + }, + { + "id": "shareledger1atn4szhhj7r8qv27rvfxn46gxy2j0nmk7uufyh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1atn4szhhj7r8qv27rvfxn46gxy2j0nmk7uufyh", + "ownerAddress": "shareledger1atn4szhhj7r8qv27rvfxn46gxy2j0nmk7uufyh", + "extraData": "" + } + }, + { + "id": "shareledger1aumhy4skv26wh4tvpc9latzq6m8xav9tvwy3pa", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1aumhy4skv26wh4tvpc9latzq6m8xav9tvwy3pa", + "ownerAddress": "shareledger1aumhy4skv26wh4tvpc9latzq6m8xav9tvwy3pa", + "extraData": "" + } + }, + { + "id": "shareledger1auxdxvp5gne0hk3a0zpfqmp0v96w9vnvhrdqrf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1auxdxvp5gne0hk3a0zpfqmp0v96w9vnvhrdqrf", + "ownerAddress": "shareledger1auxdxvp5gne0hk3a0zpfqmp0v96w9vnvhrdqrf", + "extraData": "" + } + }, + { + "id": "shareledger1av8s293xwxuwu4sqan66kt99g3z6f9rp4z2d04", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1av8s293xwxuwu4sqan66kt99g3z6f9rp4z2d04", + "ownerAddress": "shareledger1av8s293xwxuwu4sqan66kt99g3z6f9rp4z2d04", + "extraData": "" + } + }, + { + "id": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "ownerAddress": "shareledger1ave6zfk2v9z2mpwaje36hfflt38skg2nwhqz5f", + "extraData": "" + } + }, + { + "id": "shareledger1avgedl3tm7pu5xpkc3c3c2qrzxj4y8s4sc2j65", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1avgedl3tm7pu5xpkc3c3c2qrzxj4y8s4sc2j65", + "ownerAddress": "shareledger1avgedl3tm7pu5xpkc3c3c2qrzxj4y8s4sc2j65", + "extraData": "" + } + }, + { + "id": "shareledger1azkf66v3c65uu3qwce2amj9tt9avn7jvsat9yf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1azkf66v3c65uu3qwce2amj9tt9avn7jvsat9yf", + "ownerAddress": "shareledger1azkf66v3c65uu3qwce2amj9tt9avn7jvsat9yf", + "extraData": "" + } + }, + { + "id": "shareledger1c0zpy3et8n0dheap6k8ufmaffpcwhqncwu5kk0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c0zpy3et8n0dheap6k8ufmaffpcwhqncwu5kk0", + "ownerAddress": "shareledger1c0zpy3et8n0dheap6k8ufmaffpcwhqncwu5kk0", + "extraData": "" + } + }, + { + "id": "shareledger1c2tv82k7x998pxte2dv8j89uaszgcrnpamntla", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c2tv82k7x998pxte2dv8j89uaszgcrnpamntla", + "ownerAddress": "shareledger1c2tv82k7x998pxte2dv8j89uaszgcrnpamntla", + "extraData": "" + } + }, + { + "id": "shareledger1c3lt0ma5g4f7lr3cxrkvc83cna8xe6f47suysv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c3lt0ma5g4f7lr3cxrkvc83cna8xe6f47suysv", + "ownerAddress": "shareledger1c3lt0ma5g4f7lr3cxrkvc83cna8xe6f47suysv", + "extraData": "" + } + }, + { + "id": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "ownerAddress": "shareledger1c4cwmd4l6glxwpja98ynzktq8404c06hmmvf8z", + "extraData": "" + } + }, + { + "id": "shareledger1c4u662nyqs5a8u00yuzq6xsusnm0lt28cqjrml", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c4u662nyqs5a8u00yuzq6xsusnm0lt28cqjrml", + "ownerAddress": "shareledger1c4u662nyqs5a8u00yuzq6xsusnm0lt28cqjrml", + "extraData": "" + } + }, + { + "id": "shareledger1c624qf93pqweq646h3wwj8h7acxrl93qtf2v2c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c624qf93pqweq646h3wwj8h7acxrl93qtf2v2c", + "ownerAddress": "shareledger1c624qf93pqweq646h3wwj8h7acxrl93qtf2v2c", + "extraData": "" + } + }, + { + "id": "shareledger1c6ntex9lhlddn358ytssnkwmayzkmm3dx7xjy0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c6ntex9lhlddn358ytssnkwmayzkmm3dx7xjy0", + "ownerAddress": "shareledger1c6ntex9lhlddn358ytssnkwmayzkmm3dx7xjy0", + "extraData": "" + } + }, + { + "id": "shareledger1c7c0wmsld6tacttt255rg8mzeqp280weruec00", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c7c0wmsld6tacttt255rg8mzeqp280weruec00", + "ownerAddress": "shareledger1c7c0wmsld6tacttt255rg8mzeqp280weruec00", + "extraData": "" + } + }, + { + "id": "shareledger1c7g4ya34wn4fxl6mvsge3snnm40hj8ckglpzvr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c7g4ya34wn4fxl6mvsge3snnm40hj8ckglpzvr", + "ownerAddress": "shareledger1c7g4ya34wn4fxl6mvsge3snnm40hj8ckglpzvr", + "extraData": "" + } + }, + { + "id": "shareledger1c7r7j423gxhumxcsq6dhtuy29s0ng0xanhlsur", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c7r7j423gxhumxcsq6dhtuy29s0ng0xanhlsur", + "ownerAddress": "shareledger1c7r7j423gxhumxcsq6dhtuy29s0ng0xanhlsur", + "extraData": "" + } + }, + { + "id": "shareledger1c93lw68m2jqyuha8m2af2gjf3725mgwqs2m4ye", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c93lw68m2jqyuha8m2af2gjf3725mgwqs2m4ye", + "ownerAddress": "shareledger1c93lw68m2jqyuha8m2af2gjf3725mgwqs2m4ye", + "extraData": "" + } + }, + { + "id": "shareledger1c9trxsf6c5ftgd7n0ghydjsltpf3a9ctzj9xlz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1c9trxsf6c5ftgd7n0ghydjsltpf3a9ctzj9xlz", + "ownerAddress": "shareledger1c9trxsf6c5ftgd7n0ghydjsltpf3a9ctzj9xlz", + "extraData": "" + } + }, + { + "id": "shareledger1cavyky4aqedw08qmgeelhuk24qaej5h8xa5hds", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cavyky4aqedw08qmgeelhuk24qaej5h8xa5hds", + "ownerAddress": "shareledger1cavyky4aqedw08qmgeelhuk24qaej5h8xa5hds", + "extraData": "" + } + }, + { + "id": "shareledger1ccu065envc8cvsgfcmt6v06ltyx3y48fqyd340", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ccu065envc8cvsgfcmt6v06ltyx3y48fqyd340", + "ownerAddress": "shareledger1ccu065envc8cvsgfcmt6v06ltyx3y48fqyd340", + "extraData": "" + } + }, + { + "id": "shareledger1ccylev3mmhktdcm6njcwsfgdvu4q9xcd2s3kax", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ccylev3mmhktdcm6njcwsfgdvu4q9xcd2s3kax", + "ownerAddress": "shareledger1ccylev3mmhktdcm6njcwsfgdvu4q9xcd2s3kax", + "extraData": "" + } + }, + { + "id": "shareledger1cdg8dvfe89hv96dnnckam9zetftjfqnn2z7t2u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cdg8dvfe89hv96dnnckam9zetftjfqnn2z7t2u", + "ownerAddress": "shareledger1cdg8dvfe89hv96dnnckam9zetftjfqnn2z7t2u", + "extraData": "" + } + }, + { + "id": "shareledger1ce33few3e98tgec63z70yl4uduscrr0fkc9kg8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ce33few3e98tgec63z70yl4uduscrr0fkc9kg8", + "ownerAddress": "shareledger1ce33few3e98tgec63z70yl4uduscrr0fkc9kg8", + "extraData": "" + } + }, + { + "id": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "ownerAddress": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "extraData": "" + } + }, + { + "id": "shareledger1cevruzkcfa8nr5mrelqka5pu6qldxfqdc044mr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cevruzkcfa8nr5mrelqka5pu6qldxfqdc044mr", + "ownerAddress": "shareledger1cevruzkcfa8nr5mrelqka5pu6qldxfqdc044mr", + "extraData": "" + } + }, + { + "id": "shareledger1cf5h2wq4x8en5ytxwt8twe02tc273jlzveu9jk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cf5h2wq4x8en5ytxwt8twe02tc273jlzveu9jk", + "ownerAddress": "shareledger1cf5h2wq4x8en5ytxwt8twe02tc273jlzveu9jk", + "extraData": "" + } + }, + { + "id": "shareledger1cf8n9hzvjryffy9ruevpvylqsyhfewut8vpdn4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cf8n9hzvjryffy9ruevpvylqsyhfewut8vpdn4", + "ownerAddress": "shareledger1cf8n9hzvjryffy9ruevpvylqsyhfewut8vpdn4", + "extraData": "" + } + }, + { + "id": "shareledger1cf9j20llzzc3esd5v57v9uw5m3yzmz3d37u889", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cf9j20llzzc3esd5v57v9uw5m3yzmz3d37u889", + "ownerAddress": "shareledger1cf9j20llzzc3esd5v57v9uw5m3yzmz3d37u889", + "extraData": "" + } + }, + { + "id": "shareledger1cfej5zd5l7yqkl0p5qau5ku2qtycgd2cc2dfkt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cfej5zd5l7yqkl0p5qau5ku2qtycgd2cc2dfkt", + "ownerAddress": "shareledger1cfej5zd5l7yqkl0p5qau5ku2qtycgd2cc2dfkt", + "extraData": "" + } + }, + { + "id": "shareledger1cfrgtgmfesra3zwx4spjqzu452qfmkhewezvpy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cfrgtgmfesra3zwx4spjqzu452qfmkhewezvpy", + "ownerAddress": "shareledger1cfrgtgmfesra3zwx4spjqzu452qfmkhewezvpy", + "extraData": "" + } + }, + { + "id": "shareledger1cfxh3rzjutj4qn5sqa7fhhcl69f93ev4f0hqhv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cfxh3rzjutj4qn5sqa7fhhcl69f93ev4f0hqhv", + "ownerAddress": "shareledger1cfxh3rzjutj4qn5sqa7fhhcl69f93ev4f0hqhv", + "extraData": "" + } + }, + { + "id": "shareledger1cj3lt8mztxmm9cne7gs2c5d3lr2sz6dm65tqld", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cj3lt8mztxmm9cne7gs2c5d3lr2sz6dm65tqld", + "ownerAddress": "shareledger1cj3lt8mztxmm9cne7gs2c5d3lr2sz6dm65tqld", + "extraData": "" + } + }, + { + "id": "shareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "ownerAddress": "shareledger1cjwml7zfxz6f2fcdytvajvhay3t7ud3djg4wnn", + "extraData": "" + } + }, + { + "id": "shareledger1ck68efgryp7lkwj0kjph2gzjqkwcdlm52xkked", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ck68efgryp7lkwj0kjph2gzjqkwcdlm52xkked", + "ownerAddress": "shareledger1ck68efgryp7lkwj0kjph2gzjqkwcdlm52xkked", + "extraData": "" + } + }, + { + "id": "shareledger1cmtwf2yq5u8du7z94wsffhlz8r62cfh2n867pw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cmtwf2yq5u8du7z94wsffhlz8r62cfh2n867pw", + "ownerAddress": "shareledger1cmtwf2yq5u8du7z94wsffhlz8r62cfh2n867pw", + "extraData": "" + } + }, + { + "id": "shareledger1cn2njnvqjpjfu67dan0lvzy8wy2rardkxp2fe3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cn2njnvqjpjfu67dan0lvzy8wy2rardkxp2fe3", + "ownerAddress": "shareledger1cn2njnvqjpjfu67dan0lvzy8wy2rardkxp2fe3", + "extraData": "" + } + }, + { + "id": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "ownerAddress": "shareledger1cn5uwur0yhsv5em8zfvfg495axn9v4sdkah3n5", + "extraData": "" + } + }, + { + "id": "shareledger1cpdlcfkvzz64lll6nem0d0fnxp2pkvathhrdxe", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cpdlcfkvzz64lll6nem0d0fnxp2pkvathhrdxe", + "ownerAddress": "shareledger1cpdlcfkvzz64lll6nem0d0fnxp2pkvathhrdxe", + "extraData": "" + } + }, + { + "id": "shareledger1cprw9u8h86dm46wywxm93tghmud9ndjkqsgecq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cprw9u8h86dm46wywxm93tghmud9ndjkqsgecq", + "ownerAddress": "shareledger1cprw9u8h86dm46wywxm93tghmud9ndjkqsgecq", + "extraData": "" + } + }, + { + "id": "shareledger1cr7y9s44rxcgzpqgznn9ylnlswt73w7l2khx6y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cr7y9s44rxcgzpqgznn9ylnlswt73w7l2khx6y", + "ownerAddress": "shareledger1cr7y9s44rxcgzpqgznn9ylnlswt73w7l2khx6y", + "extraData": "" + } + }, + { + "id": "shareledger1crm7w5rfpr4zugjvzv0ww6sr06e0qm4c37krq6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1crm7w5rfpr4zugjvzv0ww6sr06e0qm4c37krq6", + "ownerAddress": "shareledger1crm7w5rfpr4zugjvzv0ww6sr06e0qm4c37krq6", + "extraData": "" + } + }, + { + "id": "shareledger1crvl42fvj0qafxxac6c2apkwzu5a0u9m37dzkx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1crvl42fvj0qafxxac6c2apkwzu5a0u9m37dzkx", + "ownerAddress": "shareledger1crvl42fvj0qafxxac6c2apkwzu5a0u9m37dzkx", + "extraData": "" + } + }, + { + "id": "shareledger1cs3uwml3flwlnh07m00yfcqp64yfgl8edxkc44", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cs3uwml3flwlnh07m00yfcqp64yfgl8edxkc44", + "ownerAddress": "shareledger1cs3uwml3flwlnh07m00yfcqp64yfgl8edxkc44", + "extraData": "" + } + }, + { + "id": "shareledger1cs6uar4x0heq7h7xg686ypkew2d42xhy2jztfs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cs6uar4x0heq7h7xg686ypkew2d42xhy2jztfs", + "ownerAddress": "shareledger1cs6uar4x0heq7h7xg686ypkew2d42xhy2jztfs", + "extraData": "" + } + }, + { + "id": "shareledger1csx7ww4f74fm2pdtmnw67lqjrv5qrp8wlfkj6w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1csx7ww4f74fm2pdtmnw67lqjrv5qrp8wlfkj6w", + "ownerAddress": "shareledger1csx7ww4f74fm2pdtmnw67lqjrv5qrp8wlfkj6w", + "extraData": "" + } + }, + { + "id": "shareledger1cu2cxeepe34c9y8kfvj6qazwzewgy67slhq50u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cu2cxeepe34c9y8kfvj6qazwzewgy67slhq50u", + "ownerAddress": "shareledger1cu2cxeepe34c9y8kfvj6qazwzewgy67slhq50u", + "extraData": "" + } + }, + { + "id": "shareledger1cu5u934c0nx2ala0ukxra93qkx65afwkmj4zn3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cu5u934c0nx2ala0ukxra93qkx65afwkmj4zn3", + "ownerAddress": "shareledger1cu5u934c0nx2ala0ukxra93qkx65afwkmj4zn3", + "extraData": "" + } + }, + { + "id": "shareledger1cuqqfeapulwgtysswnh2vejat6sjjgetqzgwl4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cuqqfeapulwgtysswnh2vejat6sjjgetqzgwl4", + "ownerAddress": "shareledger1cuqqfeapulwgtysswnh2vejat6sjjgetqzgwl4", + "extraData": "" + } + }, + { + "id": "shareledger1cv8ev7hp7xhvp3cuscz6vs94y835cx7520njm2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cv8ev7hp7xhvp3cuscz6vs94y835cx7520njm2", + "ownerAddress": "shareledger1cv8ev7hp7xhvp3cuscz6vs94y835cx7520njm2", + "extraData": "" + } + }, + { + "id": "shareledger1cva0z6slqepxtu0r5tpu9ej4tx08pzl9yz32vh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cva0z6slqepxtu0r5tpu9ej4tx08pzl9yz32vh", + "ownerAddress": "shareledger1cva0z6slqepxtu0r5tpu9ej4tx08pzl9yz32vh", + "extraData": "" + } + }, + { + "id": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "ownerAddress": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "extraData": "" + } + }, + { + "id": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "ownerAddress": "shareledger1cw3k03j28l8whtl50qdhtyh9yncq2hgqr742ku", + "extraData": "" + } + }, + { + "id": "shareledger1cwsprztqfetrcnlg8s6q35yxfrmcr53z28r6da", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cwsprztqfetrcnlg8s6q35yxfrmcr53z28r6da", + "ownerAddress": "shareledger1cwsprztqfetrcnlg8s6q35yxfrmcr53z28r6da", + "extraData": "" + } + }, + { + "id": "shareledger1cxtmh7jd43xx2qdkkr8e425txaeena259snhxk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cxtmh7jd43xx2qdkkr8e425txaeena259snhxk", + "ownerAddress": "shareledger1cxtmh7jd43xx2qdkkr8e425txaeena259snhxk", + "extraData": "" + } + }, + { + "id": "shareledger1cyc5su6qv4f0qh4k858cjkl9qlx48mpdaujcw8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cyc5su6qv4f0qh4k858cjkl9qlx48mpdaujcw8", + "ownerAddress": "shareledger1cyc5su6qv4f0qh4k858cjkl9qlx48mpdaujcw8", + "extraData": "" + } + }, + { + "id": "shareledger1cz2e5e4kwg67v6gz29yh8638yag8euvuapqwkd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1cz2e5e4kwg67v6gz29yh8638yag8euvuapqwkd", + "ownerAddress": "shareledger1cz2e5e4kwg67v6gz29yh8638yag8euvuapqwkd", + "extraData": "" + } + }, + { + "id": "shareledger1d04ndacnztpegynjk48hlaxq094jga3zjn2lkf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d04ndacnztpegynjk48hlaxq094jga3zjn2lkf", + "ownerAddress": "shareledger1d04ndacnztpegynjk48hlaxq094jga3zjn2lkf", + "extraData": "" + } + }, + { + "id": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "ownerAddress": "shareledger1d26xmdym74888m6tkj059hzp0n7hj0r4ucxj0q", + "extraData": "" + } + }, + { + "id": "shareledger1d2a8vng5yua3p4dk30ms34djknftgwlyhalfm8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d2a8vng5yua3p4dk30ms34djknftgwlyhalfm8", + "ownerAddress": "shareledger1d2a8vng5yua3p4dk30ms34djknftgwlyhalfm8", + "extraData": "" + } + }, + { + "id": "shareledger1d2zsc3jmmk7anxgc2x4pzk8ptxan3artvp9pdt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d2zsc3jmmk7anxgc2x4pzk8ptxan3artvp9pdt", + "ownerAddress": "shareledger1d2zsc3jmmk7anxgc2x4pzk8ptxan3artvp9pdt", + "extraData": "" + } + }, + { + "id": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "ownerAddress": "shareledger1d3xv9ww9crlzfaqukq85gmw5mwefaf8hr2hxf4", + "extraData": "" + } + }, + { + "id": "shareledger1d45zpreyej2d7qnjsvrnpf634p763ywjea067c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d45zpreyej2d7qnjsvrnpf634p763ywjea067c", + "ownerAddress": "shareledger1d45zpreyej2d7qnjsvrnpf634p763ywjea067c", + "extraData": "" + } + }, + { + "id": "shareledger1d47d4eg7l6dna6z9g7d7rtxa2etfpfne278y5d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d47d4eg7l6dna6z9g7d7rtxa2etfpfne278y5d", + "ownerAddress": "shareledger1d47d4eg7l6dna6z9g7d7rtxa2etfpfne278y5d", + "extraData": "" + } + }, + { + "id": "shareledger1d50zn0avlrjnnzz0lcyr785ac7hpsfpgwv8y4g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d50zn0avlrjnnzz0lcyr785ac7hpsfpgwv8y4g", + "ownerAddress": "shareledger1d50zn0avlrjnnzz0lcyr785ac7hpsfpgwv8y4g", + "extraData": "" + } + }, + { + "id": "shareledger1d5avwf97tzt22fe047nmr6uw32a5wxdyel4pdk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d5avwf97tzt22fe047nmr6uw32a5wxdyel4pdk", + "ownerAddress": "shareledger1d5avwf97tzt22fe047nmr6uw32a5wxdyel4pdk", + "extraData": "" + } + }, + { + "id": "shareledger1d5k6pp9jnl3tlxljqn2klzpq4teflnvh3e98xl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d5k6pp9jnl3tlxljqn2klzpq4teflnvh3e98xl", + "ownerAddress": "shareledger1d5k6pp9jnl3tlxljqn2klzpq4teflnvh3e98xl", + "extraData": "" + } + }, + { + "id": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "ownerAddress": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "extraData": "" + } + }, + { + "id": "shareledger1d8umvrhzujduppr4pqrg5vesumhseavq0yr0t0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d8umvrhzujduppr4pqrg5vesumhseavq0yr0t0", + "ownerAddress": "shareledger1d8umvrhzujduppr4pqrg5vesumhseavq0yr0t0", + "extraData": "" + } + }, + { + "id": "shareledger1d9e3nvqhnarynksef4d08fmdg4vawpf82mze9u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1d9e3nvqhnarynksef4d08fmdg4vawpf82mze9u", + "ownerAddress": "shareledger1d9e3nvqhnarynksef4d08fmdg4vawpf82mze9u", + "extraData": "" + } + }, + { + "id": "shareledger1daxr559k3z8yat8utdk20jufu0ypqspkw4y88q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1daxr559k3z8yat8utdk20jufu0ypqspkw4y88q", + "ownerAddress": "shareledger1daxr559k3z8yat8utdk20jufu0ypqspkw4y88q", + "extraData": "" + } + }, + { + "id": "shareledger1dd8ejewd46fstud0msagf5yy6ychj2fnjtnsv8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dd8ejewd46fstud0msagf5yy6ychj2fnjtnsv8", + "ownerAddress": "shareledger1dd8ejewd46fstud0msagf5yy6ychj2fnjtnsv8", + "extraData": "" + } + }, + { + "id": "shareledger1ddlumfyynadpalspcn79y298r8fry0tchtc4fm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ddlumfyynadpalspcn79y298r8fry0tchtc4fm", + "ownerAddress": "shareledger1ddlumfyynadpalspcn79y298r8fry0tchtc4fm", + "extraData": "" + } + }, + { + "id": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "ownerAddress": "shareledger1deg4ff9huegece2jj4078d36xz7435u9pg995s", + "extraData": "" + } + }, + { + "id": "shareledger1dfdr90xqr0lletwsw324nszp0m7rugqqklz7hq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dfdr90xqr0lletwsw324nszp0m7rugqqklz7hq", + "ownerAddress": "shareledger1dfdr90xqr0lletwsw324nszp0m7rugqqklz7hq", + "extraData": "" + } + }, + { + "id": "shareledger1dftwzahmeq4eq3ut5d40qkzucars3cd84pz9va", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dftwzahmeq4eq3ut5d40qkzucars3cd84pz9va", + "ownerAddress": "shareledger1dftwzahmeq4eq3ut5d40qkzucars3cd84pz9va", + "extraData": "" + } + }, + { + "id": "shareledger1dgcjatp98rfywq34ytx3zum7sjy4my8xtrtxhp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dgcjatp98rfywq34ytx3zum7sjy4my8xtrtxhp", + "ownerAddress": "shareledger1dgcjatp98rfywq34ytx3zum7sjy4my8xtrtxhp", + "extraData": "" + } + }, + { + "id": "shareledger1dh4ms8ang3txzs79xkeywsk3lpclx399thkgpn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dh4ms8ang3txzs79xkeywsk3lpclx399thkgpn", + "ownerAddress": "shareledger1dh4ms8ang3txzs79xkeywsk3lpclx399thkgpn", + "extraData": "" + } + }, + { + "id": "shareledger1djlpkq88n96ly8tjn8h2nyuzz9k0r4we8du95k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1djlpkq88n96ly8tjn8h2nyuzz9k0r4we8du95k", + "ownerAddress": "shareledger1djlpkq88n96ly8tjn8h2nyuzz9k0r4we8du95k", + "extraData": "" + } + }, + { + "id": "shareledger1dk0dezfzp9p9z8uudvfqqeftceskj2kgmny7y8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dk0dezfzp9p9z8uudvfqqeftceskj2kgmny7y8", + "ownerAddress": "shareledger1dk0dezfzp9p9z8uudvfqqeftceskj2kgmny7y8", + "extraData": "" + } + }, + { + "id": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "ownerAddress": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "extraData": "" + } + }, + { + "id": "shareledger1dk6mdjqaqh6ej493zjucgpvmvhex8c68ndafrg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dk6mdjqaqh6ej493zjucgpvmvhex8c68ndafrg", + "ownerAddress": "shareledger1dk6mdjqaqh6ej493zjucgpvmvhex8c68ndafrg", + "extraData": "" + } + }, + { + "id": "shareledger1dkcqyc6ka2wrs65h25kwk87a69wmxrg4kx9aum", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dkcqyc6ka2wrs65h25kwk87a69wmxrg4kx9aum", + "ownerAddress": "shareledger1dkcqyc6ka2wrs65h25kwk87a69wmxrg4kx9aum", + "extraData": "" + } + }, + { + "id": "shareledger1dlnzq5c5al38dq0tn6lu23n6h66wurp4l2yvz6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dlnzq5c5al38dq0tn6lu23n6h66wurp4l2yvz6", + "ownerAddress": "shareledger1dlnzq5c5al38dq0tn6lu23n6h66wurp4l2yvz6", + "extraData": "" + } + }, + { + "id": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "ownerAddress": "shareledger1dm40dxsd2hynmhhpj24y6f5g2tj6yzpgyjlnrr", + "extraData": "" + } + }, + { + "id": "shareledger1dmepl0nk5yh7tj37vxya7qs9n2t8x6k9562vsz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dmepl0nk5yh7tj37vxya7qs9n2t8x6k9562vsz", + "ownerAddress": "shareledger1dmepl0nk5yh7tj37vxya7qs9n2t8x6k9562vsz", + "extraData": "" + } + }, + { + "id": "shareledger1dmvjtm905vj9jxutf630q3fkw76ar3hwy3n8vw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dmvjtm905vj9jxutf630q3fkw76ar3hwy3n8vw", + "ownerAddress": "shareledger1dmvjtm905vj9jxutf630q3fkw76ar3hwy3n8vw", + "extraData": "" + } + }, + { + "id": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "ownerAddress": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "extraData": "" + } + }, + { + "id": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "ownerAddress": "shareledger1dn5lmsw3m9nnxs63vc9s6p93eldrnm96xa39wh", + "extraData": "" + } + }, + { + "id": "shareledger1dndvmtw3q28m482ufg4h0d8me3a7fraeu88akw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dndvmtw3q28m482ufg4h0d8me3a7fraeu88akw", + "ownerAddress": "shareledger1dndvmtw3q28m482ufg4h0d8me3a7fraeu88akw", + "extraData": "" + } + }, + { + "id": "shareledger1dptc0wylhgnfmacz4ptrx9uwe7hy2s0c5kmp23", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dptc0wylhgnfmacz4ptrx9uwe7hy2s0c5kmp23", + "ownerAddress": "shareledger1dptc0wylhgnfmacz4ptrx9uwe7hy2s0c5kmp23", + "extraData": "" + } + }, + { + "id": "shareledger1dpu5xperkpnzdcjew99sphz0sup5vjm5lyp9xn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dpu5xperkpnzdcjew99sphz0sup5vjm5lyp9xn", + "ownerAddress": "shareledger1dpu5xperkpnzdcjew99sphz0sup5vjm5lyp9xn", + "extraData": "" + } + }, + { + "id": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "ownerAddress": "shareledger1dq5lqzpawfvutj7h0pasavxssujmm0dctpg9mp", + "extraData": "" + } + }, + { + "id": "shareledger1drx5ahhcr99ev5fwf0xj347d8nuuwm6wc2lj5x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1drx5ahhcr99ev5fwf0xj347d8nuuwm6wc2lj5x", + "ownerAddress": "shareledger1drx5ahhcr99ev5fwf0xj347d8nuuwm6wc2lj5x", + "extraData": "" + } + }, + { + "id": "shareledger1dsq6dj3p776hwnfwnn85kcjcamhdfpczz6qh6c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dsq6dj3p776hwnfwnn85kcjcamhdfpczz6qh6c", + "ownerAddress": "shareledger1dsq6dj3p776hwnfwnn85kcjcamhdfpczz6qh6c", + "extraData": "" + } + }, + { + "id": "shareledger1dt3gexu9xlrqygmxx5ex8hfqerut4rtjx8g5q0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dt3gexu9xlrqygmxx5ex8hfqerut4rtjx8g5q0", + "ownerAddress": "shareledger1dt3gexu9xlrqygmxx5ex8hfqerut4rtjx8g5q0", + "extraData": "" + } + }, + { + "id": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "ownerAddress": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "extraData": "" + } + }, + { + "id": "shareledger1duv8kyclgr3z4p67j3d6mk69ykdmhe2hc9glpj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1duv8kyclgr3z4p67j3d6mk69ykdmhe2hc9glpj", + "ownerAddress": "shareledger1duv8kyclgr3z4p67j3d6mk69ykdmhe2hc9glpj", + "extraData": "" + } + }, + { + "id": "shareledger1dvp3q2r2guuv3yef83lze7w9w24gkdujnq2nec", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dvp3q2r2guuv3yef83lze7w9w24gkdujnq2nec", + "ownerAddress": "shareledger1dvp3q2r2guuv3yef83lze7w9w24gkdujnq2nec", + "extraData": "" + } + }, + { + "id": "shareledger1dx8pj8ncxte36hv4ekvmekmk6q7v0q6dr8u22s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dx8pj8ncxte36hv4ekvmekmk6q7v0q6dr8u22s", + "ownerAddress": "shareledger1dx8pj8ncxte36hv4ekvmekmk6q7v0q6dr8u22s", + "extraData": "" + } + }, + { + "id": "shareledger1dxa047vddglrzufuuxnmsnhmga6hckfg9znyzg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dxa047vddglrzufuuxnmsnhmga6hckfg9znyzg", + "ownerAddress": "shareledger1dxa047vddglrzufuuxnmsnhmga6hckfg9znyzg", + "extraData": "" + } + }, + { + "id": "shareledger1dy9qu3cmfuuu80klcdlcwyvr8s54av7mp0susw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dy9qu3cmfuuu80klcdlcwyvr8s54av7mp0susw", + "ownerAddress": "shareledger1dy9qu3cmfuuu80klcdlcwyvr8s54av7mp0susw", + "extraData": "" + } + }, + { + "id": "shareledger1dyp32w9kq0f0ee8qygfh8m79q49ldap0f5rn22", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dyp32w9kq0f0ee8qygfh8m79q49ldap0f5rn22", + "ownerAddress": "shareledger1dyp32w9kq0f0ee8qygfh8m79q49ldap0f5rn22", + "extraData": "" + } + }, + { + "id": "shareledger1dywutlpf93ghkf2k07p6du73uae6hcknll5wuu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dywutlpf93ghkf2k07p6du73uae6hcknll5wuu", + "ownerAddress": "shareledger1dywutlpf93ghkf2k07p6du73uae6hcknll5wuu", + "extraData": "" + } + }, + { + "id": "shareledger1dyzz5nertryc6c7h5kaqml5wde5hcnjxprlpap", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dyzz5nertryc6c7h5kaqml5wde5hcnjxprlpap", + "ownerAddress": "shareledger1dyzz5nertryc6c7h5kaqml5wde5hcnjxprlpap", + "extraData": "" + } + }, + { + "id": "shareledger1dz0mvxvh38wqcu4jcc3a4av5qdmlv3rmtv6hhs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1dz0mvxvh38wqcu4jcc3a4av5qdmlv3rmtv6hhs", + "ownerAddress": "shareledger1dz0mvxvh38wqcu4jcc3a4av5qdmlv3rmtv6hhs", + "extraData": "" + } + }, + { + "id": "shareledger1e0fj88e0uxjvqtyd9ext6m67mh2m0c9qul7peq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e0fj88e0uxjvqtyd9ext6m67mh2m0c9qul7peq", + "ownerAddress": "shareledger1e0fj88e0uxjvqtyd9ext6m67mh2m0c9qul7peq", + "extraData": "" + } + }, + { + "id": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "ownerAddress": "shareledger1e43t528nzusvw8we4d4rq5q0273p97wuep6qwc", + "extraData": "" + } + }, + { + "id": "shareledger1e4ha9junyjl6yfmasjp8q77luxdn83xk9ya8gr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e4ha9junyjl6yfmasjp8q77luxdn83xk9ya8gr", + "ownerAddress": "shareledger1e4ha9junyjl6yfmasjp8q77luxdn83xk9ya8gr", + "extraData": "" + } + }, + { + "id": "shareledger1e4zj2xtxa9ltxk56e4nvqa3j68gsuhcu0plqsk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e4zj2xtxa9ltxk56e4nvqa3j68gsuhcu0plqsk", + "ownerAddress": "shareledger1e4zj2xtxa9ltxk56e4nvqa3j68gsuhcu0plqsk", + "extraData": "" + } + }, + { + "id": "shareledger1e55arqejj5m0ztnr6v3dtv494a89ncrg8d0rc2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e55arqejj5m0ztnr6v3dtv494a89ncrg8d0rc2", + "ownerAddress": "shareledger1e55arqejj5m0ztnr6v3dtv494a89ncrg8d0rc2", + "extraData": "" + } + }, + { + "id": "shareledger1e55j35wvwwvxyguwslhgjahv5f3guvaruvc26j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e55j35wvwwvxyguwslhgjahv5f3guvaruvc26j", + "ownerAddress": "shareledger1e55j35wvwwvxyguwslhgjahv5f3guvaruvc26j", + "extraData": "" + } + }, + { + "id": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "ownerAddress": "shareledger1e5lz5n0nfkana2lc0gqh7wartkqrc4akqyg46z", + "extraData": "" + } + }, + { + "id": "shareledger1e5n7gvsx6yhlkw4ya63lhhy7585c7m4xwajvse", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e5n7gvsx6yhlkw4ya63lhhy7585c7m4xwajvse", + "ownerAddress": "shareledger1e5n7gvsx6yhlkw4ya63lhhy7585c7m4xwajvse", + "extraData": "" + } + }, + { + "id": "shareledger1e752nanwe9cl43ydd6he68cq8xv9f2wwgf0law", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e752nanwe9cl43ydd6he68cq8xv9f2wwgf0law", + "ownerAddress": "shareledger1e752nanwe9cl43ydd6he68cq8xv9f2wwgf0law", + "extraData": "" + } + }, + { + "id": "shareledger1e7wdm9qp67sj77dfdh6z7fnjgf3nggeckx89az", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e7wdm9qp67sj77dfdh6z7fnjgf3nggeckx89az", + "ownerAddress": "shareledger1e7wdm9qp67sj77dfdh6z7fnjgf3nggeckx89az", + "extraData": "" + } + }, + { + "id": "shareledger1e862qw7jpcu2352q77jcz43uwvkn3nyqcumq96", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e862qw7jpcu2352q77jcz43uwvkn3nyqcumq96", + "ownerAddress": "shareledger1e862qw7jpcu2352q77jcz43uwvkn3nyqcumq96", + "extraData": "" + } + }, + { + "id": "shareledger1e8u34rnyzkhxgtqq8svntsrkt9zkd005kn47ag", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e8u34rnyzkhxgtqq8svntsrkt9zkd005kn47ag", + "ownerAddress": "shareledger1e8u34rnyzkhxgtqq8svntsrkt9zkd005kn47ag", + "extraData": "" + } + }, + { + "id": "shareledger1e9zl2prtfkjd96ll9xsk0mk7az296jlzpvpawp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1e9zl2prtfkjd96ll9xsk0mk7az296jlzpvpawp", + "ownerAddress": "shareledger1e9zl2prtfkjd96ll9xsk0mk7az296jlzpvpawp", + "extraData": "" + } + }, + { + "id": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "ownerAddress": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "extraData": "" + } + }, + { + "id": "shareledger1eap36qghw76uwslmek9m8k28r075we6ne9s3q0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eap36qghw76uwslmek9m8k28r075we6ne9s3q0", + "ownerAddress": "shareledger1eap36qghw76uwslmek9m8k28r075we6ne9s3q0", + "extraData": "" + } + }, + { + "id": "shareledger1edvsfjt5myclmpakd3u0a3ajkk2e727hpyv8x3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1edvsfjt5myclmpakd3u0a3ajkk2e727hpyv8x3", + "ownerAddress": "shareledger1edvsfjt5myclmpakd3u0a3ajkk2e727hpyv8x3", + "extraData": "" + } + }, + { + "id": "shareledger1eesatknptncztquwjmw2lppcmygc08m02z9huz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eesatknptncztquwjmw2lppcmygc08m02z9huz", + "ownerAddress": "shareledger1eesatknptncztquwjmw2lppcmygc08m02z9huz", + "extraData": "" + } + }, + { + "id": "shareledger1effv3rjgzm2x96uhku5ew8s5narh24s2m0szk9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1effv3rjgzm2x96uhku5ew8s5narh24s2m0szk9", + "ownerAddress": "shareledger1effv3rjgzm2x96uhku5ew8s5narh24s2m0szk9", + "extraData": "" + } + }, + { + "id": "shareledger1eh3fwxyqgvjeuum85wue6qraylm6sj6pqwtakl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eh3fwxyqgvjeuum85wue6qraylm6sj6pqwtakl", + "ownerAddress": "shareledger1eh3fwxyqgvjeuum85wue6qraylm6sj6pqwtakl", + "extraData": "" + } + }, + { + "id": "shareledger1eh799wrnwe6f53hgtq94lwhecf8kxumh8dgp6u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eh799wrnwe6f53hgtq94lwhecf8kxumh8dgp6u", + "ownerAddress": "shareledger1eh799wrnwe6f53hgtq94lwhecf8kxumh8dgp6u", + "extraData": "" + } + }, + { + "id": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "ownerAddress": "shareledger1ehu7qscpjy5ee7h90qyy55kh3nwgyvhaqc5r2n", + "extraData": "" + } + }, + { + "id": "shareledger1ehzv7d5nw5rs5ndvs22j35jrl6ry67auknd7zn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ehzv7d5nw5rs5ndvs22j35jrl6ry67auknd7zn", + "ownerAddress": "shareledger1ehzv7d5nw5rs5ndvs22j35jrl6ry67auknd7zn", + "extraData": "" + } + }, + { + "id": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "ownerAddress": "shareledger1ejqk6ta9m7zkre38tzf3q6qngfskvshqdy74cj", + "extraData": "" + } + }, + { + "id": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "ownerAddress": "shareledger1elj66pu79md4fw0flgdu8sptxvzjnp0ccm02vh", + "extraData": "" + } + }, + { + "id": "shareledger1elt76zuxa6zc4en37a4s2kavegnvpzaw9c7zyy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1elt76zuxa6zc4en37a4s2kavegnvpzaw9c7zyy", + "ownerAddress": "shareledger1elt76zuxa6zc4en37a4s2kavegnvpzaw9c7zyy", + "extraData": "" + } + }, + { + "id": "shareledger1eltrrp8mk5muj5p97df2zefhuy4sy5l250kcfk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eltrrp8mk5muj5p97df2zefhuy4sy5l250kcfk", + "ownerAddress": "shareledger1eltrrp8mk5muj5p97df2zefhuy4sy5l250kcfk", + "extraData": "" + } + }, + { + "id": "shareledger1enmk464hnqw7n75z7jx0r5lzdvrdt29ehr4ypl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1enmk464hnqw7n75z7jx0r5lzdvrdt29ehr4ypl", + "ownerAddress": "shareledger1enmk464hnqw7n75z7jx0r5lzdvrdt29ehr4ypl", + "extraData": "" + } + }, + { + "id": "shareledger1enp68eyhxtgk4hfa4qeg2zlzv4ak4usqas7x8u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1enp68eyhxtgk4hfa4qeg2zlzv4ak4usqas7x8u", + "ownerAddress": "shareledger1enp68eyhxtgk4hfa4qeg2zlzv4ak4usqas7x8u", + "extraData": "" + } + }, + { + "id": "shareledger1ep99t53asvqx7ycp8kex339q4drrrnw2n9zagn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ep99t53asvqx7ycp8kex339q4drrrnw2n9zagn", + "ownerAddress": "shareledger1ep99t53asvqx7ycp8kex339q4drrrnw2n9zagn", + "extraData": "" + } + }, + { + "id": "shareledger1eq6f4pjnf0j9sdzjssg06spllve7m6af48tjnd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eq6f4pjnf0j9sdzjssg06spllve7m6af48tjnd", + "ownerAddress": "shareledger1eq6f4pjnf0j9sdzjssg06spllve7m6af48tjnd", + "extraData": "" + } + }, + { + "id": "shareledger1er7d98vg8fdkw5fcmxklx4mj78u8j3syl95ah9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1er7d98vg8fdkw5fcmxklx4mj78u8j3syl95ah9", + "ownerAddress": "shareledger1er7d98vg8fdkw5fcmxklx4mj78u8j3syl95ah9", + "extraData": "" + } + }, + { + "id": "shareledger1es8d9tsn62yq8n2yes0wmn3ksv9ycsqhv4geev", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1es8d9tsn62yq8n2yes0wmn3ksv9ycsqhv4geev", + "ownerAddress": "shareledger1es8d9tsn62yq8n2yes0wmn3ksv9ycsqhv4geev", + "extraData": "" + } + }, + { + "id": "shareledger1esfl5frt5kh0580xq4wlrtk9hckp8te588xvtz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1esfl5frt5kh0580xq4wlrtk9hckp8te588xvtz", + "ownerAddress": "shareledger1esfl5frt5kh0580xq4wlrtk9hckp8te588xvtz", + "extraData": "" + } + }, + { + "id": "shareledger1etcgtwvetqnwt702dza45lppnswpdc2eu8pz7z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1etcgtwvetqnwt702dza45lppnswpdc2eu8pz7z", + "ownerAddress": "shareledger1etcgtwvetqnwt702dza45lppnswpdc2eu8pz7z", + "extraData": "" + } + }, + { + "id": "shareledger1etvqvn9as0z7w7spde8hftcx2v7tg28en2dyd0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1etvqvn9as0z7w7spde8hftcx2v7tg28en2dyd0", + "ownerAddress": "shareledger1etvqvn9as0z7w7spde8hftcx2v7tg28en2dyd0", + "extraData": "" + } + }, + { + "id": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "ownerAddress": "shareledger1eua0pen4k8uhpcucuez9x4dg0wavr8ynf6deey", + "extraData": "" + } + }, + { + "id": "shareledger1eumnx9snam44uevr435t8vhdzr0y7y2x50v39u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eumnx9snam44uevr435t8vhdzr0y7y2x50v39u", + "ownerAddress": "shareledger1eumnx9snam44uevr435t8vhdzr0y7y2x50v39u", + "extraData": "" + } + }, + { + "id": "shareledger1evltp0x2lp3h67wkt7lyzqgye62d5xlrenm8le", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1evltp0x2lp3h67wkt7lyzqgye62d5xlrenm8le", + "ownerAddress": "shareledger1evltp0x2lp3h67wkt7lyzqgye62d5xlrenm8le", + "extraData": "" + } + }, + { + "id": "shareledger1evvqh6v6928gjtuvm9mrd96cc52ftt6qsf9hlg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1evvqh6v6928gjtuvm9mrd96cc52ftt6qsf9hlg", + "ownerAddress": "shareledger1evvqh6v6928gjtuvm9mrd96cc52ftt6qsf9hlg", + "extraData": "" + } + }, + { + "id": "shareledger1ext59l6l80wtezhscn7v47238z5kufh36ch9p2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ext59l6l80wtezhscn7v47238z5kufh36ch9p2", + "ownerAddress": "shareledger1ext59l6l80wtezhscn7v47238z5kufh36ch9p2", + "extraData": "" + } + }, + { + "id": "shareledger1exup3zycyrc2r7v3uqet5dc4dmuhtcgjkpxwke", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1exup3zycyrc2r7v3uqet5dc4dmuhtcgjkpxwke", + "ownerAddress": "shareledger1exup3zycyrc2r7v3uqet5dc4dmuhtcgjkpxwke", + "extraData": "" + } + }, + { + "id": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "ownerAddress": "shareledger1exvpz0mtd73h0pv36fewy5nye82fmmaesu5sx6", + "extraData": "" + } + }, + { + "id": "shareledger1eys0dgm2s5jq4lh0gk63fcsev7yfd4whmrn2wq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1eys0dgm2s5jq4lh0gk63fcsev7yfd4whmrn2wq", + "ownerAddress": "shareledger1eys0dgm2s5jq4lh0gk63fcsev7yfd4whmrn2wq", + "extraData": "" + } + }, + { + "id": "shareledger1ez4a6ugccj9gpvlcdrxmdlh55jsu9c9cz60va5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ez4a6ugccj9gpvlcdrxmdlh55jsu9c9cz60va5", + "ownerAddress": "shareledger1ez4a6ugccj9gpvlcdrxmdlh55jsu9c9cz60va5", + "extraData": "" + } + }, + { + "id": "shareledger1ez5yyt89h8unqm9g6l68rnqzyhxar69em227dh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ez5yyt89h8unqm9g6l68rnqzyhxar69em227dh", + "ownerAddress": "shareledger1ez5yyt89h8unqm9g6l68rnqzyhxar69em227dh", + "extraData": "" + } + }, + { + "id": "shareledger1ezz3gtut7hhrkdt9td32s5lmfmmxfjtgzn5ztt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ezz3gtut7hhrkdt9td32s5lmfmmxfjtgzn5ztt", + "ownerAddress": "shareledger1ezz3gtut7hhrkdt9td32s5lmfmmxfjtgzn5ztt", + "extraData": "" + } + }, + { + "id": "shareledger1f0662jtkdy3ynf02szgc2yutq42yhugsg3fzvw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f0662jtkdy3ynf02szgc2yutq42yhugsg3fzvw", + "ownerAddress": "shareledger1f0662jtkdy3ynf02szgc2yutq42yhugsg3fzvw", + "extraData": "" + } + }, + { + "id": "shareledger1f0n3h02pa73adrq6y6sx9dyrelfhv6l73jp979", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f0n3h02pa73adrq6y6sx9dyrelfhv6l73jp979", + "ownerAddress": "shareledger1f0n3h02pa73adrq6y6sx9dyrelfhv6l73jp979", + "extraData": "" + } + }, + { + "id": "shareledger1f2fmlwdj4wgew8znz8fyusyaym2hze2cstsgxp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f2fmlwdj4wgew8znz8fyusyaym2hze2cstsgxp", + "ownerAddress": "shareledger1f2fmlwdj4wgew8znz8fyusyaym2hze2cstsgxp", + "extraData": "" + } + }, + { + "id": "shareledger1f357pjwck9dzf7ketg66dd5qsynw3sfdsjz6mq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f357pjwck9dzf7ketg66dd5qsynw3sfdsjz6mq", + "ownerAddress": "shareledger1f357pjwck9dzf7ketg66dd5qsynw3sfdsjz6mq", + "extraData": "" + } + }, + { + "id": "shareledger1f43ht458g5vrnn3z6n5mxl2hw92qfeklhk7sy0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f43ht458g5vrnn3z6n5mxl2hw92qfeklhk7sy0", + "ownerAddress": "shareledger1f43ht458g5vrnn3z6n5mxl2hw92qfeklhk7sy0", + "extraData": "" + } + }, + { + "id": "shareledger1f4vaa53esz880huj4hc8wgyxaun9jm0arxtxf0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f4vaa53esz880huj4hc8wgyxaun9jm0arxtxf0", + "ownerAddress": "shareledger1f4vaa53esz880huj4hc8wgyxaun9jm0arxtxf0", + "extraData": "" + } + }, + { + "id": "shareledger1f5pxqwlhgs8n6j6ecarp5ewgs78000u7gcy77p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f5pxqwlhgs8n6j6ecarp5ewgs78000u7gcy77p", + "ownerAddress": "shareledger1f5pxqwlhgs8n6j6ecarp5ewgs78000u7gcy77p", + "extraData": "" + } + }, + { + "id": "shareledger1f6a55c8ut9uktnc3qzesqld6z3536q5w4degak", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f6a55c8ut9uktnc3qzesqld6z3536q5w4degak", + "ownerAddress": "shareledger1f6a55c8ut9uktnc3qzesqld6z3536q5w4degak", + "extraData": "" + } + }, + { + "id": "shareledger1f6aj3qpmh392hd449acvkgfl2yh64hlxpjfphm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f6aj3qpmh392hd449acvkgfl2yh64hlxpjfphm", + "ownerAddress": "shareledger1f6aj3qpmh392hd449acvkgfl2yh64hlxpjfphm", + "extraData": "" + } + }, + { + "id": "shareledger1f6zq7txxsn3p35clyztwral4dvaujzy0xmntxx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f6zq7txxsn3p35clyztwral4dvaujzy0xmntxx", + "ownerAddress": "shareledger1f6zq7txxsn3p35clyztwral4dvaujzy0xmntxx", + "extraData": "" + } + }, + { + "id": "shareledger1f75eqhu2ml0kavmc3y57037sa853tcq8ve8ylm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f75eqhu2ml0kavmc3y57037sa853tcq8ve8ylm", + "ownerAddress": "shareledger1f75eqhu2ml0kavmc3y57037sa853tcq8ve8ylm", + "extraData": "" + } + }, + { + "id": "shareledger1f7cekkf93sc4wtv4ae8uhsmas2gq6c6jxfqfc8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f7cekkf93sc4wtv4ae8uhsmas2gq6c6jxfqfc8", + "ownerAddress": "shareledger1f7cekkf93sc4wtv4ae8uhsmas2gq6c6jxfqfc8", + "extraData": "" + } + }, + { + "id": "shareledger1f7qnknewf9e32kax6u4pczk7py2acpmmymgvmm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f7qnknewf9e32kax6u4pczk7py2acpmmymgvmm", + "ownerAddress": "shareledger1f7qnknewf9e32kax6u4pczk7py2acpmmymgvmm", + "extraData": "" + } + }, + { + "id": "shareledger1f8nl3hp7qmpsvycze2fhm2re2h7tm2w5jz37z4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f8nl3hp7qmpsvycze2fhm2re2h7tm2w5jz37z4", + "ownerAddress": "shareledger1f8nl3hp7qmpsvycze2fhm2re2h7tm2w5jz37z4", + "extraData": "" + } + }, + { + "id": "shareledger1f99nefjn8dmc69ypvr3usej6tjg5w790tj689z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f99nefjn8dmc69ypvr3usej6tjg5w790tj689z", + "ownerAddress": "shareledger1f99nefjn8dmc69ypvr3usej6tjg5w790tj689z", + "extraData": "" + } + }, + { + "id": "shareledger1f9kgzl2clf64rpvuru2jml2q62lcwjyrpjtm8r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1f9kgzl2clf64rpvuru2jml2q62lcwjyrpjtm8r", + "ownerAddress": "shareledger1f9kgzl2clf64rpvuru2jml2q62lcwjyrpjtm8r", + "extraData": "" + } + }, + { + "id": "shareledger1fa463af5l85pa5umlsm09hrm3e522n0r34dwv8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fa463af5l85pa5umlsm09hrm3e522n0r34dwv8", + "ownerAddress": "shareledger1fa463af5l85pa5umlsm09hrm3e522n0r34dwv8", + "extraData": "" + } + }, + { + "id": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "ownerAddress": "shareledger1fa7eptl0spghgzp2czzle7lv356kh36c0n5raz", + "extraData": "" + } + }, + { + "id": "shareledger1fau02ddafxr6hqytrlaynzag76jdpchg90s4ku", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fau02ddafxr6hqytrlaynzag76jdpchg90s4ku", + "ownerAddress": "shareledger1fau02ddafxr6hqytrlaynzag76jdpchg90s4ku", + "extraData": "" + } + }, + { + "id": "shareledger1faze50asxnrn7mryxl3cgjnhrlw5kp9cd399sq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1faze50asxnrn7mryxl3cgjnhrlw5kp9cd399sq", + "ownerAddress": "shareledger1faze50asxnrn7mryxl3cgjnhrlw5kp9cd399sq", + "extraData": "" + } + }, + { + "id": "shareledger1fc8yc4uy78p8pwl8r4z5k09yrec4sqwwtectwm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fc8yc4uy78p8pwl8r4z5k09yrec4sqwwtectwm", + "ownerAddress": "shareledger1fc8yc4uy78p8pwl8r4z5k09yrec4sqwwtectwm", + "extraData": "" + } + }, + { + "id": "shareledger1fchtvze63eqddhuna5ggv7ajc3m3fysh025qfd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fchtvze63eqddhuna5ggv7ajc3m3fysh025qfd", + "ownerAddress": "shareledger1fchtvze63eqddhuna5ggv7ajc3m3fysh025qfd", + "extraData": "" + } + }, + { + "id": "shareledger1fd6vkych3ky3alykvvz7xh8hw4yvuaxppsdntj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fd6vkych3ky3alykvvz7xh8hw4yvuaxppsdntj", + "ownerAddress": "shareledger1fd6vkych3ky3alykvvz7xh8hw4yvuaxppsdntj", + "extraData": "" + } + }, + { + "id": "shareledger1fdyk2uqzu2km955en3hfah6uqves5a260arjpm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fdyk2uqzu2km955en3hfah6uqves5a260arjpm", + "ownerAddress": "shareledger1fdyk2uqzu2km955en3hfah6uqves5a260arjpm", + "extraData": "" + } + }, + { + "id": "shareledger1fe5y0k0khy26ky3htce0q7eut0snglhkq527et", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fe5y0k0khy26ky3htce0q7eut0snglhkq527et", + "ownerAddress": "shareledger1fe5y0k0khy26ky3htce0q7eut0snglhkq527et", + "extraData": "" + } + }, + { + "id": "shareledger1ff9msgzp8yra8973cux9kr764s6dx676edadk5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ff9msgzp8yra8973cux9kr764s6dx676edadk5", + "ownerAddress": "shareledger1ff9msgzp8yra8973cux9kr764s6dx676edadk5", + "extraData": "" + } + }, + { + "id": "shareledger1ffemhrlkvsvagcf3096l6w85uvdpgcpxmthxm0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ffemhrlkvsvagcf3096l6w85uvdpgcpxmthxm0", + "ownerAddress": "shareledger1ffemhrlkvsvagcf3096l6w85uvdpgcpxmthxm0", + "extraData": "" + } + }, + { + "id": "shareledger1ffmzee203hqnuagl327gxu28w68le379fj6j36", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ffmzee203hqnuagl327gxu28w68le379fj6j36", + "ownerAddress": "shareledger1ffmzee203hqnuagl327gxu28w68le379fj6j36", + "extraData": "" + } + }, + { + "id": "shareledger1ffp8puaqk2ejh7kmg8jhf65ygt0aepfg4s3l49", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ffp8puaqk2ejh7kmg8jhf65ygt0aepfg4s3l49", + "ownerAddress": "shareledger1ffp8puaqk2ejh7kmg8jhf65ygt0aepfg4s3l49", + "extraData": "" + } + }, + { + "id": "shareledger1fg8nt2el6vwwhflqxeq3hz9qn5k2etzed0jljl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fg8nt2el6vwwhflqxeq3hz9qn5k2etzed0jljl", + "ownerAddress": "shareledger1fg8nt2el6vwwhflqxeq3hz9qn5k2etzed0jljl", + "extraData": "" + } + }, + { + "id": "shareledger1fg9q59tdxc7dn5c7el60qkareauq7tdk02pv04", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fg9q59tdxc7dn5c7el60qkareauq7tdk02pv04", + "ownerAddress": "shareledger1fg9q59tdxc7dn5c7el60qkareauq7tdk02pv04", + "extraData": "" + } + }, + { + "id": "shareledger1fg9x3fp4g479fk00xs6g8lw6atdzc0y4auh7fk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fg9x3fp4g479fk00xs6g8lw6atdzc0y4auh7fk", + "ownerAddress": "shareledger1fg9x3fp4g479fk00xs6g8lw6atdzc0y4auh7fk", + "extraData": "" + } + }, + { + "id": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "ownerAddress": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "extraData": "" + } + }, + { + "id": "shareledger1fk0urvk4ks9hz22cfplc0f9pse0elcacq3q264", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fk0urvk4ks9hz22cfplc0f9pse0elcacq3q264", + "ownerAddress": "shareledger1fk0urvk4ks9hz22cfplc0f9pse0elcacq3q264", + "extraData": "" + } + }, + { + "id": "shareledger1fkrjw9kczsnymg0627d5vxkkrg2qagf7uzhs20", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fkrjw9kczsnymg0627d5vxkkrg2qagf7uzhs20", + "ownerAddress": "shareledger1fkrjw9kczsnymg0627d5vxkkrg2qagf7uzhs20", + "extraData": "" + } + }, + { + "id": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "ownerAddress": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "extraData": "" + } + }, + { + "id": "shareledger1flezzaeu05yau2mz7k3t7qqepptut2vwn2s5lz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1flezzaeu05yau2mz7k3t7qqepptut2vwn2s5lz", + "ownerAddress": "shareledger1flezzaeu05yau2mz7k3t7qqepptut2vwn2s5lz", + "extraData": "" + } + }, + { + "id": "shareledger1fmwvlmdptp82yvr37thnuf3k8n4hwj356xtafs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fmwvlmdptp82yvr37thnuf3k8n4hwj356xtafs", + "ownerAddress": "shareledger1fmwvlmdptp82yvr37thnuf3k8n4hwj356xtafs", + "extraData": "" + } + }, + { + "id": "shareledger1fpgfhrc4yfcrwq4263kvw6ed364wwlrfuxs28m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fpgfhrc4yfcrwq4263kvw6ed364wwlrfuxs28m", + "ownerAddress": "shareledger1fpgfhrc4yfcrwq4263kvw6ed364wwlrfuxs28m", + "extraData": "" + } + }, + { + "id": "shareledger1fpu34mtlnz7lyy2v5qus75z0saj0pvvual9l03", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fpu34mtlnz7lyy2v5qus75z0saj0pvvual9l03", + "ownerAddress": "shareledger1fpu34mtlnz7lyy2v5qus75z0saj0pvvual9l03", + "extraData": "" + } + }, + { + "id": "shareledger1fqapyng9u9h4czztc5qanmlcvctuw5v8393j5k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fqapyng9u9h4czztc5qanmlcvctuw5v8393j5k", + "ownerAddress": "shareledger1fqapyng9u9h4czztc5qanmlcvctuw5v8393j5k", + "extraData": "" + } + }, + { + "id": "shareledger1fqsvyxpxtyyjfwuxzhzagxnj36em0x2tmgn7u7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fqsvyxpxtyyjfwuxzhzagxnj36em0x2tmgn7u7", + "ownerAddress": "shareledger1fqsvyxpxtyyjfwuxzhzagxnj36em0x2tmgn7u7", + "extraData": "" + } + }, + { + "id": "shareledger1fqypgm3rl3f8fx5hjltvk47f8uxlf06q6vwt9g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fqypgm3rl3f8fx5hjltvk47f8uxlf06q6vwt9g", + "ownerAddress": "shareledger1fqypgm3rl3f8fx5hjltvk47f8uxlf06q6vwt9g", + "extraData": "" + } + }, + { + "id": "shareledger1fr4ltkq9qdcl54dgfqm44clmg7mkumwdp5jra6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fr4ltkq9qdcl54dgfqm44clmg7mkumwdp5jra6", + "ownerAddress": "shareledger1fr4ltkq9qdcl54dgfqm44clmg7mkumwdp5jra6", + "extraData": "" + } + }, + { + "id": "shareledger1frd765gkpc33rczsndzapg47dklfng6cchzu3c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1frd765gkpc33rczsndzapg47dklfng6cchzu3c", + "ownerAddress": "shareledger1frd765gkpc33rczsndzapg47dklfng6cchzu3c", + "extraData": "" + } + }, + { + "id": "shareledger1frp4ah7ah8pjalphav8g6m2mha6g6jnhx9ecyw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1frp4ah7ah8pjalphav8g6m2mha6g6jnhx9ecyw", + "ownerAddress": "shareledger1frp4ah7ah8pjalphav8g6m2mha6g6jnhx9ecyw", + "extraData": "" + } + }, + { + "id": "shareledger1frpvh5wwygr0jtk4c0qzz2r46tkgm38g95uf4d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1frpvh5wwygr0jtk4c0qzz2r46tkgm38g95uf4d", + "ownerAddress": "shareledger1frpvh5wwygr0jtk4c0qzz2r46tkgm38g95uf4d", + "extraData": "" + } + }, + { + "id": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "ownerAddress": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "extraData": "" + } + }, + { + "id": "shareledger1fs38mrjasjp4vshf6lmgjzk3myk3rpydwtv9rs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fs38mrjasjp4vshf6lmgjzk3myk3rpydwtv9rs", + "ownerAddress": "shareledger1fs38mrjasjp4vshf6lmgjzk3myk3rpydwtv9rs", + "extraData": "" + } + }, + { + "id": "shareledger1fs3vakvwz3hepyls3z3xwkxs49n97576eaxjzh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fs3vakvwz3hepyls3z3xwkxs49n97576eaxjzh", + "ownerAddress": "shareledger1fs3vakvwz3hepyls3z3xwkxs49n97576eaxjzh", + "extraData": "" + } + }, + { + "id": "shareledger1fs7lua36v22d6caksfl4tg7nazvz0tkl743dkw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fs7lua36v22d6caksfl4tg7nazvz0tkl743dkw", + "ownerAddress": "shareledger1fs7lua36v22d6caksfl4tg7nazvz0tkl743dkw", + "extraData": "" + } + }, + { + "id": "shareledger1fscvkazpkda9x4tnld2yg85jvgwdplcykvuqee", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fscvkazpkda9x4tnld2yg85jvgwdplcykvuqee", + "ownerAddress": "shareledger1fscvkazpkda9x4tnld2yg85jvgwdplcykvuqee", + "extraData": "" + } + }, + { + "id": "shareledger1fspxrs9y77hwwt4sa0vjnlae2hlwegefhag2a9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fspxrs9y77hwwt4sa0vjnlae2hlwegefhag2a9", + "ownerAddress": "shareledger1fspxrs9y77hwwt4sa0vjnlae2hlwegefhag2a9", + "extraData": "" + } + }, + { + "id": "shareledger1ftxjrd4hhdrmf2nseatagm7f2sqcp032rwt8kx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ftxjrd4hhdrmf2nseatagm7f2sqcp032rwt8kx", + "ownerAddress": "shareledger1ftxjrd4hhdrmf2nseatagm7f2sqcp032rwt8kx", + "extraData": "" + } + }, + { + "id": "shareledger1fuef677js5cn76k0tdjtrdw9mu3zc8rxtk3prg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fuef677js5cn76k0tdjtrdw9mu3zc8rxtk3prg", + "ownerAddress": "shareledger1fuef677js5cn76k0tdjtrdw9mu3zc8rxtk3prg", + "extraData": "" + } + }, + { + "id": "shareledger1fuqqgvxyrgwn2epcvtv93vc2gmqjx8707td284", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fuqqgvxyrgwn2epcvtv93vc2gmqjx8707td284", + "ownerAddress": "shareledger1fuqqgvxyrgwn2epcvtv93vc2gmqjx8707td284", + "extraData": "" + } + }, + { + "id": "shareledger1futfcfwqvn86sqgt267rls9m0rfgje9q8xqy8x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1futfcfwqvn86sqgt267rls9m0rfgje9q8xqy8x", + "ownerAddress": "shareledger1futfcfwqvn86sqgt267rls9m0rfgje9q8xqy8x", + "extraData": "" + } + }, + { + "id": "shareledger1fv2wz3sfwtyfvxmfzk8zx63s4aqved5dnjlka0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fv2wz3sfwtyfvxmfzk8zx63s4aqved5dnjlka0", + "ownerAddress": "shareledger1fv2wz3sfwtyfvxmfzk8zx63s4aqved5dnjlka0", + "extraData": "" + } + }, + { + "id": "shareledger1fv9scnp6jhhxdxuayt9zpqmr98205s8ej8tcrk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fv9scnp6jhhxdxuayt9zpqmr98205s8ej8tcrk", + "ownerAddress": "shareledger1fv9scnp6jhhxdxuayt9zpqmr98205s8ej8tcrk", + "extraData": "" + } + }, + { + "id": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "ownerAddress": "shareledger1fvugt4lt9rccsywlxxhfkvkpw7twww04zxc7uh", + "extraData": "" + } + }, + { + "id": "shareledger1fx9q4kjc3knh3mh33eae0rd5n6ejtuxmadwqc4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fx9q4kjc3knh3mh33eae0rd5n6ejtuxmadwqc4", + "ownerAddress": "shareledger1fx9q4kjc3knh3mh33eae0rd5n6ejtuxmadwqc4", + "extraData": "" + } + }, + { + "id": "shareledger1fyft706egyy8kwyzq4xccasysty0v56vuu52sl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fyft706egyy8kwyzq4xccasysty0v56vuu52sl", + "ownerAddress": "shareledger1fyft706egyy8kwyzq4xccasysty0v56vuu52sl", + "extraData": "" + } + }, + { + "id": "shareledger1fygljsm5mh4rnvnx06d7st7cseeda05qyh6u6e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1fygljsm5mh4rnvnx06d7st7cseeda05qyh6u6e", + "ownerAddress": "shareledger1fygljsm5mh4rnvnx06d7st7cseeda05qyh6u6e", + "extraData": "" + } + }, + { + "id": "shareledger1g0k2ff8hte0e22ge8fre7tepsmcr3dwe5m4n2v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g0k2ff8hte0e22ge8fre7tepsmcr3dwe5m4n2v", + "ownerAddress": "shareledger1g0k2ff8hte0e22ge8fre7tepsmcr3dwe5m4n2v", + "extraData": "" + } + }, + { + "id": "shareledger1g0rnxxr770emtw9mvmxmqde44ezh2cqdfzhkj7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g0rnxxr770emtw9mvmxmqde44ezh2cqdfzhkj7", + "ownerAddress": "shareledger1g0rnxxr770emtw9mvmxmqde44ezh2cqdfzhkj7", + "extraData": "" + } + }, + { + "id": "shareledger1g0x3mam8mzq9xcyqpf6vd33jvs0m92n48a572t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g0x3mam8mzq9xcyqpf6vd33jvs0m92n48a572t", + "ownerAddress": "shareledger1g0x3mam8mzq9xcyqpf6vd33jvs0m92n48a572t", + "extraData": "" + } + }, + { + "id": "shareledger1g24238cf3fmym5gexf6ldcvcwn9symer30awz3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g24238cf3fmym5gexf6ldcvcwn9symer30awz3", + "ownerAddress": "shareledger1g24238cf3fmym5gexf6ldcvcwn9symer30awz3", + "extraData": "" + } + }, + { + "id": "shareledger1g287pu6034c0jcp9n2dvfu85w8fgjjdlvjywhh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g287pu6034c0jcp9n2dvfu85w8fgjjdlvjywhh", + "ownerAddress": "shareledger1g287pu6034c0jcp9n2dvfu85w8fgjjdlvjywhh", + "extraData": "" + } + }, + { + "id": "shareledger1g2a7cdqa0kn87dygwm5wvmtyu3mtgw8dlfnnp9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g2a7cdqa0kn87dygwm5wvmtyu3mtgw8dlfnnp9", + "ownerAddress": "shareledger1g2a7cdqa0kn87dygwm5wvmtyu3mtgw8dlfnnp9", + "extraData": "" + } + }, + { + "id": "shareledger1g2aattwcw5dm8e5vlskxrtvyrfnzvdkptt6puk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g2aattwcw5dm8e5vlskxrtvyrfnzvdkptt6puk", + "ownerAddress": "shareledger1g2aattwcw5dm8e5vlskxrtvyrfnzvdkptt6puk", + "extraData": "" + } + }, + { + "id": "shareledger1g2vcxm0trhqn6qdk3z7ht484gwr2cwrwj7jfhw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g2vcxm0trhqn6qdk3z7ht484gwr2cwrwj7jfhw", + "ownerAddress": "shareledger1g2vcxm0trhqn6qdk3z7ht484gwr2cwrwj7jfhw", + "extraData": "" + } + }, + { + "id": "shareledger1g32cny0vcchpc0hpgs8y2gyzuk8xqu6v6q7l5m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g32cny0vcchpc0hpgs8y2gyzuk8xqu6v6q7l5m", + "ownerAddress": "shareledger1g32cny0vcchpc0hpgs8y2gyzuk8xqu6v6q7l5m", + "extraData": "" + } + }, + { + "id": "shareledger1g3q5erxrnajqqadpnxzp4nwelcpcr7qzkwspm9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g3q5erxrnajqqadpnxzp4nwelcpcr7qzkwspm9", + "ownerAddress": "shareledger1g3q5erxrnajqqadpnxzp4nwelcpcr7qzkwspm9", + "extraData": "" + } + }, + { + "id": "shareledger1g3rzqc8rjjhq25r5fcyr4n3metm6czc6n48tw9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g3rzqc8rjjhq25r5fcyr4n3metm6czc6n48tw9", + "ownerAddress": "shareledger1g3rzqc8rjjhq25r5fcyr4n3metm6czc6n48tw9", + "extraData": "" + } + }, + { + "id": "shareledger1g5jjm4pr5q6sz4tlhd2hn888uxn56ku67fceyj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g5jjm4pr5q6sz4tlhd2hn888uxn56ku67fceyj", + "ownerAddress": "shareledger1g5jjm4pr5q6sz4tlhd2hn888uxn56ku67fceyj", + "extraData": "" + } + }, + { + "id": "shareledger1g69cmz3jqmwsqk8cc7pt0k4s3p8me9v9pxpgz2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g69cmz3jqmwsqk8cc7pt0k4s3p8me9v9pxpgz2", + "ownerAddress": "shareledger1g69cmz3jqmwsqk8cc7pt0k4s3p8me9v9pxpgz2", + "extraData": "" + } + }, + { + "id": "shareledger1g8us0vgpgdzcg27lj26e3mvf0u62en8hjccqzs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g8us0vgpgdzcg27lj26e3mvf0u62en8hjccqzs", + "ownerAddress": "shareledger1g8us0vgpgdzcg27lj26e3mvf0u62en8hjccqzs", + "extraData": "" + } + }, + { + "id": "shareledger1g9cl36hx2dg3mmlr2c00uuerlaaf0knq6x0fw8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1g9cl36hx2dg3mmlr2c00uuerlaaf0knq6x0fw8", + "ownerAddress": "shareledger1g9cl36hx2dg3mmlr2c00uuerlaaf0knq6x0fw8", + "extraData": "" + } + }, + { + "id": "shareledger1gamwcft8j59qg5r8xjpe04gp9hgeppwpv8n9r4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gamwcft8j59qg5r8xjpe04gp9hgeppwpv8n9r4", + "ownerAddress": "shareledger1gamwcft8j59qg5r8xjpe04gp9hgeppwpv8n9r4", + "extraData": "" + } + }, + { + "id": "shareledger1gd27ny9wr7m3ych0m603j3je5u6ratp0w387zu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gd27ny9wr7m3ych0m603j3je5u6ratp0w387zu", + "ownerAddress": "shareledger1gd27ny9wr7m3ych0m603j3je5u6ratp0w387zu", + "extraData": "" + } + }, + { + "id": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "ownerAddress": "shareledger1gd4aykje28nhx0vtlwt7e8r5k4scq3ycpr6mzn", + "extraData": "" + } + }, + { + "id": "shareledger1gd5smprt82w54tqurcz67k76xgwemay0teeq4f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gd5smprt82w54tqurcz67k76xgwemay0teeq4f", + "ownerAddress": "shareledger1gd5smprt82w54tqurcz67k76xgwemay0teeq4f", + "extraData": "" + } + }, + { + "id": "shareledger1gdfn9dhnsw06xsyxr2p7k0fnk8qs0c3cgk6h3q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gdfn9dhnsw06xsyxr2p7k0fnk8qs0c3cgk6h3q", + "ownerAddress": "shareledger1gdfn9dhnsw06xsyxr2p7k0fnk8qs0c3cgk6h3q", + "extraData": "" + } + }, + { + "id": "shareledger1gdpw7dgw8v78mlkutqwefsnyfjun89d5gxn02d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gdpw7dgw8v78mlkutqwefsnyfjun89d5gxn02d", + "ownerAddress": "shareledger1gdpw7dgw8v78mlkutqwefsnyfjun89d5gxn02d", + "extraData": "" + } + }, + { + "id": "shareledger1gfagajzkac06l9qzkeu76qx3y87at740czvjhd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gfagajzkac06l9qzkeu76qx3y87at740czvjhd", + "ownerAddress": "shareledger1gfagajzkac06l9qzkeu76qx3y87at740czvjhd", + "extraData": "" + } + }, + { + "id": "shareledger1gfutwat9vt0cynepm0huus6vujysa8e07uz892", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gfutwat9vt0cynepm0huus6vujysa8e07uz892", + "ownerAddress": "shareledger1gfutwat9vt0cynepm0huus6vujysa8e07uz892", + "extraData": "" + } + }, + { + "id": "shareledger1gh4ztnlulcfytlu9uv33a3vpkga2lrqe2ztv7w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gh4ztnlulcfytlu9uv33a3vpkga2lrqe2ztv7w", + "ownerAddress": "shareledger1gh4ztnlulcfytlu9uv33a3vpkga2lrqe2ztv7w", + "extraData": "" + } + }, + { + "id": "shareledger1ghu8p243thvw49e2m37ydmhl09ur3lmexj8uwv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ghu8p243thvw49e2m37ydmhl09ur3lmexj8uwv", + "ownerAddress": "shareledger1ghu8p243thvw49e2m37ydmhl09ur3lmexj8uwv", + "extraData": "" + } + }, + { + "id": "shareledger1gjjek4eamndlnpp32d6xdyxcgt8dec2a65y8r5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gjjek4eamndlnpp32d6xdyxcgt8dec2a65y8r5", + "ownerAddress": "shareledger1gjjek4eamndlnpp32d6xdyxcgt8dec2a65y8r5", + "extraData": "" + } + }, + { + "id": "shareledger1gk8jn6n0u46zd943fpcu0uan2tfrr7uvxpru5e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gk8jn6n0u46zd943fpcu0uan2tfrr7uvxpru5e", + "ownerAddress": "shareledger1gk8jn6n0u46zd943fpcu0uan2tfrr7uvxpru5e", + "extraData": "" + } + }, + { + "id": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "ownerAddress": "shareledger1gldm02ccsljdl42f4smprekzvr2qh7s98jc9t5", + "extraData": "" + } + }, + { + "id": "shareledger1gleetu49dee9aqtygfsc62ls6awzu4u56845h8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gleetu49dee9aqtygfsc62ls6awzu4u56845h8", + "ownerAddress": "shareledger1gleetu49dee9aqtygfsc62ls6awzu4u56845h8", + "extraData": "" + } + }, + { + "id": "shareledger1glfhct4xs07ajcmsljfmzvdp5vl7aq57lm4xh4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1glfhct4xs07ajcmsljfmzvdp5vl7aq57lm4xh4", + "ownerAddress": "shareledger1glfhct4xs07ajcmsljfmzvdp5vl7aq57lm4xh4", + "extraData": "" + } + }, + { + "id": "shareledger1glhkmm6p68ep8reqj5z2jaslkku8t7zfqhjhnc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1glhkmm6p68ep8reqj5z2jaslkku8t7zfqhjhnc", + "ownerAddress": "shareledger1glhkmm6p68ep8reqj5z2jaslkku8t7zfqhjhnc", + "extraData": "" + } + }, + { + "id": "shareledger1glht5psdxacnvdl04g4unm0hkjwfqdx4nnczqr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1glht5psdxacnvdl04g4unm0hkjwfqdx4nnczqr", + "ownerAddress": "shareledger1glht5psdxacnvdl04g4unm0hkjwfqdx4nnczqr", + "extraData": "" + } + }, + { + "id": "shareledger1glk2gzuwpvgl20scun8z9fp26aured2vj7dvzc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1glk2gzuwpvgl20scun8z9fp26aured2vj7dvzc", + "ownerAddress": "shareledger1glk2gzuwpvgl20scun8z9fp26aured2vj7dvzc", + "extraData": "" + } + }, + { + "id": "shareledger1gm0lwz34mgf3vgc24kzduea98fng3793zvjwm5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gm0lwz34mgf3vgc24kzduea98fng3793zvjwm5", + "ownerAddress": "shareledger1gm0lwz34mgf3vgc24kzduea98fng3793zvjwm5", + "extraData": "" + } + }, + { + "id": "shareledger1gm6yczatz04qf0hacryq6w2qzlsrs2ereqpftr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gm6yczatz04qf0hacryq6w2qzlsrs2ereqpftr", + "ownerAddress": "shareledger1gm6yczatz04qf0hacryq6w2qzlsrs2ereqpftr", + "extraData": "" + } + }, + { + "id": "shareledger1gn2p0dymxeuganqd3msfx6ggk5qtdjf3uu08qr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gn2p0dymxeuganqd3msfx6ggk5qtdjf3uu08qr", + "ownerAddress": "shareledger1gn2p0dymxeuganqd3msfx6ggk5qtdjf3uu08qr", + "extraData": "" + } + }, + { + "id": "shareledger1gn8selg50zuxg9e4y03qh5zuzljdn63uu5wd46", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gn8selg50zuxg9e4y03qh5zuzljdn63uu5wd46", + "ownerAddress": "shareledger1gn8selg50zuxg9e4y03qh5zuzljdn63uu5wd46", + "extraData": "" + } + }, + { + "id": "shareledger1gq076m3vzfavschw9hytremylkneld4lh2fnp0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gq076m3vzfavschw9hytremylkneld4lh2fnp0", + "ownerAddress": "shareledger1gq076m3vzfavschw9hytremylkneld4lh2fnp0", + "extraData": "" + } + }, + { + "id": "shareledger1gqfet5flp7lwjwmleca8khr6g9rtetm2r8krm3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gqfet5flp7lwjwmleca8khr6g9rtetm2r8krm3", + "ownerAddress": "shareledger1gqfet5flp7lwjwmleca8khr6g9rtetm2r8krm3", + "extraData": "" + } + }, + { + "id": "shareledger1graql9c857sj0xg7gw260c440n0t4qfjvyndy2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1graql9c857sj0xg7gw260c440n0t4qfjvyndy2", + "ownerAddress": "shareledger1graql9c857sj0xg7gw260c440n0t4qfjvyndy2", + "extraData": "" + } + }, + { + "id": "shareledger1grp743gsjkgc283ch9c6s2qr2kevv3k79t3eu7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1grp743gsjkgc283ch9c6s2qr2kevv3k79t3eu7", + "ownerAddress": "shareledger1grp743gsjkgc283ch9c6s2qr2kevv3k79t3eu7", + "extraData": "" + } + }, + { + "id": "shareledger1gsmnqe4a028fp35aqcjnmdaqttyswnsyughrv9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gsmnqe4a028fp35aqcjnmdaqttyswnsyughrv9", + "ownerAddress": "shareledger1gsmnqe4a028fp35aqcjnmdaqttyswnsyughrv9", + "extraData": "" + } + }, + { + "id": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "ownerAddress": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "extraData": "" + } + }, + { + "id": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "ownerAddress": "shareledger1gt9ac7qvz7qk7ds594dw9g9rzamrsvg4fx4amr", + "extraData": "" + } + }, + { + "id": "shareledger1gtlr2za505w8rl3sc8ywfwj9qekkxzaw826ntg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gtlr2za505w8rl3sc8ywfwj9qekkxzaw826ntg", + "ownerAddress": "shareledger1gtlr2za505w8rl3sc8ywfwj9qekkxzaw826ntg", + "extraData": "" + } + }, + { + "id": "shareledger1gumvhljecrgdl6vqz8d5w3wzskafjy7qx7n5ht", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gumvhljecrgdl6vqz8d5w3wzskafjy7qx7n5ht", + "ownerAddress": "shareledger1gumvhljecrgdl6vqz8d5w3wzskafjy7qx7n5ht", + "extraData": "" + } + }, + { + "id": "shareledger1gwcwy2xgulqzr5xt0a82gzzk35mn2e8y5tjvmn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gwcwy2xgulqzr5xt0a82gzzk35mn2e8y5tjvmn", + "ownerAddress": "shareledger1gwcwy2xgulqzr5xt0a82gzzk35mn2e8y5tjvmn", + "extraData": "" + } + }, + { + "id": "shareledger1gwkm9nqjwyn6camzvejherfx67mmmwg5kpjjt8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gwkm9nqjwyn6camzvejherfx67mmmwg5kpjjt8", + "ownerAddress": "shareledger1gwkm9nqjwyn6camzvejherfx67mmmwg5kpjjt8", + "extraData": "" + } + }, + { + "id": "shareledger1gwwzgsyesqmt3z0y0aa0n4z0d54c3mtghs3hy8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gwwzgsyesqmt3z0y0aa0n4z0d54c3mtghs3hy8", + "ownerAddress": "shareledger1gwwzgsyesqmt3z0y0aa0n4z0d54c3mtghs3hy8", + "extraData": "" + } + }, + { + "id": "shareledger1gx5j06u9zqczetkae0eh8j4x549fr9crcwg9dg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gx5j06u9zqczetkae0eh8j4x549fr9crcwg9dg", + "ownerAddress": "shareledger1gx5j06u9zqczetkae0eh8j4x549fr9crcwg9dg", + "extraData": "" + } + }, + { + "id": "shareledger1gxsgcksa3glk6v49g73x4lqlrhmjxlq7qnuus4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gxsgcksa3glk6v49g73x4lqlrhmjxlq7qnuus4", + "ownerAddress": "shareledger1gxsgcksa3glk6v49g73x4lqlrhmjxlq7qnuus4", + "extraData": "" + } + }, + { + "id": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "ownerAddress": "shareledger1gxsqy4mapt2x47txvn6yaqht26yknftmz89k8r", + "extraData": "" + } + }, + { + "id": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "ownerAddress": "shareledger1gxz9x6jj9edkz00jtuhsg3dlveetdq5caknvcq", + "extraData": "" + } + }, + { + "id": "shareledger1gy34qe6z9zqfj4w22ele3rzdyhnufna869j4qd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gy34qe6z9zqfj4w22ele3rzdyhnufna869j4qd", + "ownerAddress": "shareledger1gy34qe6z9zqfj4w22ele3rzdyhnufna869j4qd", + "extraData": "" + } + }, + { + "id": "shareledger1gynugddmzln5yksjhf48d09698mgcjdl8jt6x2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gynugddmzln5yksjhf48d09698mgcjdl8jt6x2", + "ownerAddress": "shareledger1gynugddmzln5yksjhf48d09698mgcjdl8jt6x2", + "extraData": "" + } + }, + { + "id": "shareledger1gzgcwcgkw67zhn9537p38shjnpnwm7crqus9mn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1gzgcwcgkw67zhn9537p38shjnpnwm7crqus9mn", + "ownerAddress": "shareledger1gzgcwcgkw67zhn9537p38shjnpnwm7crqus9mn", + "extraData": "" + } + }, + { + "id": "shareledger1h0cdz2q0fp8c5unsumv80ew84mw44k3htclxz3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h0cdz2q0fp8c5unsumv80ew84mw44k3htclxz3", + "ownerAddress": "shareledger1h0cdz2q0fp8c5unsumv80ew84mw44k3htclxz3", + "extraData": "" + } + }, + { + "id": "shareledger1h2g36smx7l24cphmc2dpu3edeqc4jwux2htp28", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h2g36smx7l24cphmc2dpu3edeqc4jwux2htp28", + "ownerAddress": "shareledger1h2g36smx7l24cphmc2dpu3edeqc4jwux2htp28", + "extraData": "" + } + }, + { + "id": "shareledger1h2xeaqncks3uxcrs927awd5x7x53rj89l4wryv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h2xeaqncks3uxcrs927awd5x7x53rj89l4wryv", + "ownerAddress": "shareledger1h2xeaqncks3uxcrs927awd5x7x53rj89l4wryv", + "extraData": "" + } + }, + { + "id": "shareledger1h3p0rwsgz9suru9lv0aveyzgcfnnglqeg7k6ag", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h3p0rwsgz9suru9lv0aveyzgcfnnglqeg7k6ag", + "ownerAddress": "shareledger1h3p0rwsgz9suru9lv0aveyzgcfnnglqeg7k6ag", + "extraData": "" + } + }, + { + "id": "shareledger1h3pl3lxqx7vv8ux6r4ddvyq9xpljfuvzt0gfx0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h3pl3lxqx7vv8ux6r4ddvyq9xpljfuvzt0gfx0", + "ownerAddress": "shareledger1h3pl3lxqx7vv8ux6r4ddvyq9xpljfuvzt0gfx0", + "extraData": "" + } + }, + { + "id": "shareledger1h42290afmvf5mhdy70hew8m3295qhdg2vw95eq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h42290afmvf5mhdy70hew8m3295qhdg2vw95eq", + "ownerAddress": "shareledger1h42290afmvf5mhdy70hew8m3295qhdg2vw95eq", + "extraData": "" + } + }, + { + "id": "shareledger1h44ypkwa62fnkukjxqj9nzhk6m2p9mpzjn6t7w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h44ypkwa62fnkukjxqj9nzhk6m2p9mpzjn6t7w", + "ownerAddress": "shareledger1h44ypkwa62fnkukjxqj9nzhk6m2p9mpzjn6t7w", + "extraData": "" + } + }, + { + "id": "shareledger1h452s6jlmmggxrmx8lc80xhykj4l2d4jqf3ka9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h452s6jlmmggxrmx8lc80xhykj4l2d4jqf3ka9", + "ownerAddress": "shareledger1h452s6jlmmggxrmx8lc80xhykj4l2d4jqf3ka9", + "extraData": "" + } + }, + { + "id": "shareledger1h4gzceye6qz82q4dse0rzt23dtnew6nuu5l5jq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h4gzceye6qz82q4dse0rzt23dtnew6nuu5l5jq", + "ownerAddress": "shareledger1h4gzceye6qz82q4dse0rzt23dtnew6nuu5l5jq", + "extraData": "" + } + }, + { + "id": "shareledger1h4m2mwdjlmjnuwalxj40ham7yfp5y4r0yhpcpd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h4m2mwdjlmjnuwalxj40ham7yfp5y4r0yhpcpd", + "ownerAddress": "shareledger1h4m2mwdjlmjnuwalxj40ham7yfp5y4r0yhpcpd", + "extraData": "" + } + }, + { + "id": "shareledger1h4nd8ep78jny4hv95q2xjpc7u3k6fra5yry4px", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h4nd8ep78jny4hv95q2xjpc7u3k6fra5yry4px", + "ownerAddress": "shareledger1h4nd8ep78jny4hv95q2xjpc7u3k6fra5yry4px", + "extraData": "" + } + }, + { + "id": "shareledger1h5cu6yyd0pse6szd3vpjcmqmwdgzf8kf7mgksv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h5cu6yyd0pse6szd3vpjcmqmwdgzf8kf7mgksv", + "ownerAddress": "shareledger1h5cu6yyd0pse6szd3vpjcmqmwdgzf8kf7mgksv", + "extraData": "" + } + }, + { + "id": "shareledger1h5vzpsmzpmfcu2t7sfwgp6gp3tqg0563wf0yu9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h5vzpsmzpmfcu2t7sfwgp6gp3tqg0563wf0yu9", + "ownerAddress": "shareledger1h5vzpsmzpmfcu2t7sfwgp6gp3tqg0563wf0yu9", + "extraData": "" + } + }, + { + "id": "shareledger1h6lzpt0rpgh2aae8sv7xmt664gwl89ap6ewhxu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h6lzpt0rpgh2aae8sv7xmt664gwl89ap6ewhxu", + "ownerAddress": "shareledger1h6lzpt0rpgh2aae8sv7xmt664gwl89ap6ewhxu", + "extraData": "" + } + }, + { + "id": "shareledger1h7j4cytmrqxvnhx8hnl0kx6tuwzqz73up2ld4v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h7j4cytmrqxvnhx8hnl0kx6tuwzqz73up2ld4v", + "ownerAddress": "shareledger1h7j4cytmrqxvnhx8hnl0kx6tuwzqz73up2ld4v", + "extraData": "" + } + }, + { + "id": "shareledger1h88xf5kd40mffx7vnx3lzwqxc7xefecuvxsahz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h88xf5kd40mffx7vnx3lzwqxc7xefecuvxsahz", + "ownerAddress": "shareledger1h88xf5kd40mffx7vnx3lzwqxc7xefecuvxsahz", + "extraData": "" + } + }, + { + "id": "shareledger1h89u875swgudumyftaluttyh3c6a005a4r03l8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h89u875swgudumyftaluttyh3c6a005a4r03l8", + "ownerAddress": "shareledger1h89u875swgudumyftaluttyh3c6a005a4r03l8", + "extraData": "" + } + }, + { + "id": "shareledger1h89xskjzsqqsqdmywzxkdqp3gqjjjwzvh8y0mr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h89xskjzsqqsqdmywzxkdqp3gqjjjwzvh8y0mr", + "ownerAddress": "shareledger1h89xskjzsqqsqdmywzxkdqp3gqjjjwzvh8y0mr", + "extraData": "" + } + }, + { + "id": "shareledger1h9g7a3avevs6uyk6alaqcduz6vm2htr57fpwua", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h9g7a3avevs6uyk6alaqcduz6vm2htr57fpwua", + "ownerAddress": "shareledger1h9g7a3avevs6uyk6alaqcduz6vm2htr57fpwua", + "extraData": "" + } + }, + { + "id": "shareledger1h9hxztp8khk5jyss0tg9zdsy8j2lsegmkf4cr0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1h9hxztp8khk5jyss0tg9zdsy8j2lsegmkf4cr0", + "ownerAddress": "shareledger1h9hxztp8khk5jyss0tg9zdsy8j2lsegmkf4cr0", + "extraData": "" + } + }, + { + "id": "shareledger1hcmvhp0jrgh4yqj3ucwsu8ae5s0m2agsw3k9d6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hcmvhp0jrgh4yqj3ucwsu8ae5s0m2agsw3k9d6", + "ownerAddress": "shareledger1hcmvhp0jrgh4yqj3ucwsu8ae5s0m2agsw3k9d6", + "extraData": "" + } + }, + { + "id": "shareledger1hd7uhk8z3s2x28532zk02acynh4rlqxs7z5k9h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hd7uhk8z3s2x28532zk02acynh4rlqxs7z5k9h", + "ownerAddress": "shareledger1hd7uhk8z3s2x28532zk02acynh4rlqxs7z5k9h", + "extraData": "" + } + }, + { + "id": "shareledger1hd8nkskhn6kh5ellrjwed5q9qergry9h6pujqr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hd8nkskhn6kh5ellrjwed5q9qergry9h6pujqr", + "ownerAddress": "shareledger1hd8nkskhn6kh5ellrjwed5q9qergry9h6pujqr", + "extraData": "" + } + }, + { + "id": "shareledger1hdw8cw253shp8rf4qa6s20jnt82lcknq5684fk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hdw8cw253shp8rf4qa6s20jnt82lcknq5684fk", + "ownerAddress": "shareledger1hdw8cw253shp8rf4qa6s20jnt82lcknq5684fk", + "extraData": "" + } + }, + { + "id": "shareledger1he4gsp58am2qx03ky8rxwajp2dg90jvxkwyp7f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1he4gsp58am2qx03ky8rxwajp2dg90jvxkwyp7f", + "ownerAddress": "shareledger1he4gsp58am2qx03ky8rxwajp2dg90jvxkwyp7f", + "extraData": "" + } + }, + { + "id": "shareledger1he95dga4ascs0n97zwq0dpq7de7h907p5sm7w2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1he95dga4ascs0n97zwq0dpq7de7h907p5sm7w2", + "ownerAddress": "shareledger1he95dga4ascs0n97zwq0dpq7de7h907p5sm7w2", + "extraData": "" + } + }, + { + "id": "shareledger1hfaa00g0wtfxm98ykpumwy3592jknrkd85czc6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hfaa00g0wtfxm98ykpumwy3592jknrkd85czc6", + "ownerAddress": "shareledger1hfaa00g0wtfxm98ykpumwy3592jknrkd85czc6", + "extraData": "" + } + }, + { + "id": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "ownerAddress": "shareledger1hfxn0fynfngkyuzjf8q0lf9r0cyeh3w482kjg7", + "extraData": "" + } + }, + { + "id": "shareledger1hgcswdfwduhr5rvg2rpxkgunhpys7t6696yl3k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hgcswdfwduhr5rvg2rpxkgunhpys7t6696yl3k", + "ownerAddress": "shareledger1hgcswdfwduhr5rvg2rpxkgunhpys7t6696yl3k", + "extraData": "" + } + }, + { + "id": "shareledger1hgkv7s8hypu5ul9kvdljev6gnyywdkfqlg9ep7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hgkv7s8hypu5ul9kvdljev6gnyywdkfqlg9ep7", + "ownerAddress": "shareledger1hgkv7s8hypu5ul9kvdljev6gnyywdkfqlg9ep7", + "extraData": "" + } + }, + { + "id": "shareledger1hgqnk8r7s95la55wptk6t5xt3pj08kg2xp4lpt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hgqnk8r7s95la55wptk6t5xt3pj08kg2xp4lpt", + "ownerAddress": "shareledger1hgqnk8r7s95la55wptk6t5xt3pj08kg2xp4lpt", + "extraData": "" + } + }, + { + "id": "shareledger1hgxv2a4sqskmxu6ynh3prs6kynhzscly8nghxg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hgxv2a4sqskmxu6ynh3prs6kynhzscly8nghxg", + "ownerAddress": "shareledger1hgxv2a4sqskmxu6ynh3prs6kynhzscly8nghxg", + "extraData": "" + } + }, + { + "id": "shareledger1hhp3tm5cxhalqwtanh37v3dvyjmegwrer27a76", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hhp3tm5cxhalqwtanh37v3dvyjmegwrer27a76", + "ownerAddress": "shareledger1hhp3tm5cxhalqwtanh37v3dvyjmegwrer27a76", + "extraData": "" + } + }, + { + "id": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "ownerAddress": "shareledger1hhttd6uqs3fxgnes2qee6xd0gd0j70qgk3cf9k", + "extraData": "" + } + }, + { + "id": "shareledger1hjcp5u39mtx75m85slpk3rgplyt3wt5p5wl76c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hjcp5u39mtx75m85slpk3rgplyt3wt5p5wl76c", + "ownerAddress": "shareledger1hjcp5u39mtx75m85slpk3rgplyt3wt5p5wl76c", + "extraData": "" + } + }, + { + "id": "shareledger1hjg3a7jpx4u9pdghsqp4udrex8n09z03ptksd5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hjg3a7jpx4u9pdghsqp4udrex8n09z03ptksd5", + "ownerAddress": "shareledger1hjg3a7jpx4u9pdghsqp4udrex8n09z03ptksd5", + "extraData": "" + } + }, + { + "id": "shareledger1hkj2jcjs7unszmjl7e9qmp429d4zedstz4200r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hkj2jcjs7unszmjl7e9qmp429d4zedstz4200r", + "ownerAddress": "shareledger1hkj2jcjs7unszmjl7e9qmp429d4zedstz4200r", + "extraData": "" + } + }, + { + "id": "shareledger1hkmp0ldnm4chlfxxjka2wxmcdtzstpj3y3gukq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hkmp0ldnm4chlfxxjka2wxmcdtzstpj3y3gukq", + "ownerAddress": "shareledger1hkmp0ldnm4chlfxxjka2wxmcdtzstpj3y3gukq", + "extraData": "" + } + }, + { + "id": "shareledger1hkvf0j6cqu4anec52et4rymys5yuf7lrlhznle", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hkvf0j6cqu4anec52et4rymys5yuf7lrlhznle", + "ownerAddress": "shareledger1hkvf0j6cqu4anec52et4rymys5yuf7lrlhznle", + "extraData": "" + } + }, + { + "id": "shareledger1hkvqnzq5gghl4hzf09m797nk2gl9ft5ccl8h7k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hkvqnzq5gghl4hzf09m797nk2gl9ft5ccl8h7k", + "ownerAddress": "shareledger1hkvqnzq5gghl4hzf09m797nk2gl9ft5ccl8h7k", + "extraData": "" + } + }, + { + "id": "shareledger1hl0wxra5yh2gaamah693q8pff6tk56tz9zhu0c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hl0wxra5yh2gaamah693q8pff6tk56tz9zhu0c", + "ownerAddress": "shareledger1hl0wxra5yh2gaamah693q8pff6tk56tz9zhu0c", + "extraData": "" + } + }, + { + "id": "shareledger1hlnemen22xndn60c3lssc8pdj4yds370k09f6s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hlnemen22xndn60c3lssc8pdj4yds370k09f6s", + "ownerAddress": "shareledger1hlnemen22xndn60c3lssc8pdj4yds370k09f6s", + "extraData": "" + } + }, + { + "id": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "ownerAddress": "shareledger1hm7udpn28dyjljvd4j4fks6ef5rqfp49xhdw3y", + "extraData": "" + } + }, + { + "id": "shareledger1hmpatlm9na5j6h3pxluv3ah4zd4fxhjpq9236u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hmpatlm9na5j6h3pxluv3ah4zd4fxhjpq9236u", + "ownerAddress": "shareledger1hmpatlm9na5j6h3pxluv3ah4zd4fxhjpq9236u", + "extraData": "" + } + }, + { + "id": "shareledger1hn6xepsvk4y3ajcwjljwzsjffgewy2p9amzm9z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hn6xepsvk4y3ajcwjljwzsjffgewy2p9amzm9z", + "ownerAddress": "shareledger1hn6xepsvk4y3ajcwjljwzsjffgewy2p9amzm9z", + "extraData": "" + } + }, + { + "id": "shareledger1hnme7z4l9gkldvqqu4ntzn75rdz37w24azv94s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hnme7z4l9gkldvqqu4ntzn75rdz37w24azv94s", + "ownerAddress": "shareledger1hnme7z4l9gkldvqqu4ntzn75rdz37w24azv94s", + "extraData": "" + } + }, + { + "id": "shareledger1hpsj0jezaf3j3cd0m8u6q2egusf2r9gqajv5sr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hpsj0jezaf3j3cd0m8u6q2egusf2r9gqajv5sr", + "ownerAddress": "shareledger1hpsj0jezaf3j3cd0m8u6q2egusf2r9gqajv5sr", + "extraData": "" + } + }, + { + "id": "shareledger1hq9hz2jqv0tf73lxkre867t8cn77t6h4wtvn52", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hq9hz2jqv0tf73lxkre867t8cn77t6h4wtvn52", + "ownerAddress": "shareledger1hq9hz2jqv0tf73lxkre867t8cn77t6h4wtvn52", + "extraData": "" + } + }, + { + "id": "shareledger1hr06x6zweg85rugylz090feu5rqkwethmr0sna", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hr06x6zweg85rugylz090feu5rqkwethmr0sna", + "ownerAddress": "shareledger1hr06x6zweg85rugylz090feu5rqkwethmr0sna", + "extraData": "" + } + }, + { + "id": "shareledger1hrfwm9qx0ga98xrjf6xenak8ey0jsam059ltyj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hrfwm9qx0ga98xrjf6xenak8ey0jsam059ltyj", + "ownerAddress": "shareledger1hrfwm9qx0ga98xrjf6xenak8ey0jsam059ltyj", + "extraData": "" + } + }, + { + "id": "shareledger1hsj0688d7nsm6dnlcrtce8av277mdw5gcwcla2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hsj0688d7nsm6dnlcrtce8av277mdw5gcwcla2", + "ownerAddress": "shareledger1hsj0688d7nsm6dnlcrtce8av277mdw5gcwcla2", + "extraData": "" + } + }, + { + "id": "shareledger1hspzxw3sam6hut0kn4fhkfn037te2c3hm2pdh5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hspzxw3sam6hut0kn4fhkfn037te2c3hm2pdh5", + "ownerAddress": "shareledger1hspzxw3sam6hut0kn4fhkfn037te2c3hm2pdh5", + "extraData": "" + } + }, + { + "id": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "ownerAddress": "shareledger1htg7ctjx340w053h57hwxsaepa3p4nq62f7vzx", + "extraData": "" + } + }, + { + "id": "shareledger1hvg2w8dfzlpnl3ececprzalug4wj636n9xxxe4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hvg2w8dfzlpnl3ececprzalug4wj636n9xxxe4", + "ownerAddress": "shareledger1hvg2w8dfzlpnl3ececprzalug4wj636n9xxxe4", + "extraData": "" + } + }, + { + "id": "shareledger1hwqnl5l2gvel96cjwlccd9tqdle48mp5hffehp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hwqnl5l2gvel96cjwlccd9tqdle48mp5hffehp", + "ownerAddress": "shareledger1hwqnl5l2gvel96cjwlccd9tqdle48mp5hffehp", + "extraData": "" + } + }, + { + "id": "shareledger1hx4xtxw6x4fd4xr6cdmtgqyw50yqaa87z7atcs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hx4xtxw6x4fd4xr6cdmtgqyw50yqaa87z7atcs", + "ownerAddress": "shareledger1hx4xtxw6x4fd4xr6cdmtgqyw50yqaa87z7atcs", + "extraData": "" + } + }, + { + "id": "shareledger1hx8lxgphyclaf885gxyuhvk56rjle3cyh0mv3h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hx8lxgphyclaf885gxyuhvk56rjle3cyh0mv3h", + "ownerAddress": "shareledger1hx8lxgphyclaf885gxyuhvk56rjle3cyh0mv3h", + "extraData": "" + } + }, + { + "id": "shareledger1hx9pzwh77cw256xmn2tuhjzy8kppjf895c772c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hx9pzwh77cw256xmn2tuhjzy8kppjf895c772c", + "ownerAddress": "shareledger1hx9pzwh77cw256xmn2tuhjzy8kppjf895c772c", + "extraData": "" + } + }, + { + "id": "shareledger1hxhuahg9a7k52y2lu95cd2avf3at94sj8ad9t2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hxhuahg9a7k52y2lu95cd2avf3at94sj8ad9t2", + "ownerAddress": "shareledger1hxhuahg9a7k52y2lu95cd2avf3at94sj8ad9t2", + "extraData": "" + } + }, + { + "id": "shareledger1hxy95eyrrswy6sl0qtx50y0uvhqajxz5xzc6kw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hxy95eyrrswy6sl0qtx50y0uvhqajxz5xzc6kw", + "ownerAddress": "shareledger1hxy95eyrrswy6sl0qtx50y0uvhqajxz5xzc6kw", + "extraData": "" + } + }, + { + "id": "shareledger1hy4tlhzl9wcq2eyyu7z6nfwrd6wzrj8jlh689v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hy4tlhzl9wcq2eyyu7z6nfwrd6wzrj8jlh689v", + "ownerAddress": "shareledger1hy4tlhzl9wcq2eyyu7z6nfwrd6wzrj8jlh689v", + "extraData": "" + } + }, + { + "id": "shareledger1hyauy9l5f5ekax5m6c5wts35skurywexg036z5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hyauy9l5f5ekax5m6c5wts35skurywexg036z5", + "ownerAddress": "shareledger1hyauy9l5f5ekax5m6c5wts35skurywexg036z5", + "extraData": "" + } + }, + { + "id": "shareledger1hzqyf0n52z28a48ju0n0zxf84yf8ydu43c6czj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1hzqyf0n52z28a48ju0n0zxf84yf8ydu43c6czj", + "ownerAddress": "shareledger1hzqyf0n52z28a48ju0n0zxf84yf8ydu43c6czj", + "extraData": "" + } + }, + { + "id": "shareledger1j049r07vnrydlsgv4f5lgv7ctg05cs0f2edsr7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j049r07vnrydlsgv4f5lgv7ctg05cs0f2edsr7", + "ownerAddress": "shareledger1j049r07vnrydlsgv4f5lgv7ctg05cs0f2edsr7", + "extraData": "" + } + }, + { + "id": "shareledger1j24quyytqvgs5zthcvx4chc582p5229uv06knv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j24quyytqvgs5zthcvx4chc582p5229uv06knv", + "ownerAddress": "shareledger1j24quyytqvgs5zthcvx4chc582p5229uv06knv", + "extraData": "" + } + }, + { + "id": "shareledger1j2f0qkgyh4ef8kx5wmnysaf8c6p6u5chlmf677", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j2f0qkgyh4ef8kx5wmnysaf8c6p6u5chlmf677", + "ownerAddress": "shareledger1j2f0qkgyh4ef8kx5wmnysaf8c6p6u5chlmf677", + "extraData": "" + } + }, + { + "id": "shareledger1j32eznvs2755dxut8vejpmnetdwyqzlg346hyk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j32eznvs2755dxut8vejpmnetdwyqzlg346hyk", + "ownerAddress": "shareledger1j32eznvs2755dxut8vejpmnetdwyqzlg346hyk", + "extraData": "" + } + }, + { + "id": "shareledger1j35u82clpsftpwkwx8skn9pm902n6fa29njs69", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j35u82clpsftpwkwx8skn9pm902n6fa29njs69", + "ownerAddress": "shareledger1j35u82clpsftpwkwx8skn9pm902n6fa29njs69", + "extraData": "" + } + }, + { + "id": "shareledger1j3dcykmjzpdmzqtf7gwtzl3846u62kzlt9hf2r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j3dcykmjzpdmzqtf7gwtzl3846u62kzlt9hf2r", + "ownerAddress": "shareledger1j3dcykmjzpdmzqtf7gwtzl3846u62kzlt9hf2r", + "extraData": "" + } + }, + { + "id": "shareledger1j3jdray89zcng5ctnya7zwpcje0nsz530g4dtj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j3jdray89zcng5ctnya7zwpcje0nsz530g4dtj", + "ownerAddress": "shareledger1j3jdray89zcng5ctnya7zwpcje0nsz530g4dtj", + "extraData": "" + } + }, + { + "id": "shareledger1j46u7h89jw75gzcvht5ltca3hupspfj95tz3w0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j46u7h89jw75gzcvht5ltca3hupspfj95tz3w0", + "ownerAddress": "shareledger1j46u7h89jw75gzcvht5ltca3hupspfj95tz3w0", + "extraData": "" + } + }, + { + "id": "shareledger1j4ny6tqhnr69fwmjauk44majtc5r5nuvqu9ju9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j4ny6tqhnr69fwmjauk44majtc5r5nuvqu9ju9", + "ownerAddress": "shareledger1j4ny6tqhnr69fwmjauk44majtc5r5nuvqu9ju9", + "extraData": "" + } + }, + { + "id": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "ownerAddress": "shareledger1j4qhaav3smmgcgt8z6ykv0c7xg5gh3g53qvvxm", + "extraData": "" + } + }, + { + "id": "shareledger1j7eh95a4n6pln9yph8r3vnj3ejtxm5eyzusckn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j7eh95a4n6pln9yph8r3vnj3ejtxm5eyzusckn", + "ownerAddress": "shareledger1j7eh95a4n6pln9yph8r3vnj3ejtxm5eyzusckn", + "extraData": "" + } + }, + { + "id": "shareledger1j83t0wy507q4gyg92z8pt594dp9jp75q8kk2na", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j83t0wy507q4gyg92z8pt594dp9jp75q8kk2na", + "ownerAddress": "shareledger1j83t0wy507q4gyg92z8pt594dp9jp75q8kk2na", + "extraData": "" + } + }, + { + "id": "shareledger1j8d80c8tnypyzwhd9y34hx48svn7dlw0ek64c9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j8d80c8tnypyzwhd9y34hx48svn7dlw0ek64c9", + "ownerAddress": "shareledger1j8d80c8tnypyzwhd9y34hx48svn7dlw0ek64c9", + "extraData": "" + } + }, + { + "id": "shareledger1j92ex0xwc52j7j5x5jglqzgqqrxewkqe7647l7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j92ex0xwc52j7j5x5jglqzgqqrxewkqe7647l7", + "ownerAddress": "shareledger1j92ex0xwc52j7j5x5jglqzgqqrxewkqe7647l7", + "extraData": "" + } + }, + { + "id": "shareledger1j9gd3j3puq3cvw3vmvd3az6pkfz4m8dh8mw9qp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j9gd3j3puq3cvw3vmvd3az6pkfz4m8dh8mw9qp", + "ownerAddress": "shareledger1j9gd3j3puq3cvw3vmvd3az6pkfz4m8dh8mw9qp", + "extraData": "" + } + }, + { + "id": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "ownerAddress": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "extraData": "" + } + }, + { + "id": "shareledger1j9x5hd40g3p3efwujgcnsf7wzgcgzp4e9cwck5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1j9x5hd40g3p3efwujgcnsf7wzgcgzp4e9cwck5", + "ownerAddress": "shareledger1j9x5hd40g3p3efwujgcnsf7wzgcgzp4e9cwck5", + "extraData": "" + } + }, + { + "id": "shareledger1jc8cet6wmwa5awrsha9ww4yaeg0ad6zwrgpqed", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jc8cet6wmwa5awrsha9ww4yaeg0ad6zwrgpqed", + "ownerAddress": "shareledger1jc8cet6wmwa5awrsha9ww4yaeg0ad6zwrgpqed", + "extraData": "" + } + }, + { + "id": "shareledger1jcp254aznazz02g0060k9ysjr3vzmncdcppt0a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jcp254aznazz02g0060k9ysjr3vzmncdcppt0a", + "ownerAddress": "shareledger1jcp254aznazz02g0060k9ysjr3vzmncdcppt0a", + "extraData": "" + } + }, + { + "id": "shareledger1je36hvgxxt6gqke57fk2nmru3jmn99zkz70vvd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1je36hvgxxt6gqke57fk2nmru3jmn99zkz70vvd", + "ownerAddress": "shareledger1je36hvgxxt6gqke57fk2nmru3jmn99zkz70vvd", + "extraData": "" + } + }, + { + "id": "shareledger1je6s207y386c8t65kkc4asmura76mgrn5ldkpl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1je6s207y386c8t65kkc4asmura76mgrn5ldkpl", + "ownerAddress": "shareledger1je6s207y386c8t65kkc4asmura76mgrn5ldkpl", + "extraData": "" + } + }, + { + "id": "shareledger1jf26ava7c5h49etcrn6s23hwd33y9txwf62pm5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jf26ava7c5h49etcrn6s23hwd33y9txwf62pm5", + "ownerAddress": "shareledger1jf26ava7c5h49etcrn6s23hwd33y9txwf62pm5", + "extraData": "" + } + }, + { + "id": "shareledger1jfh9vfkmlk4wxr875z3yhsz0hyccqd9szmg6e0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jfh9vfkmlk4wxr875z3yhsz0hyccqd9szmg6e0", + "ownerAddress": "shareledger1jfh9vfkmlk4wxr875z3yhsz0hyccqd9szmg6e0", + "extraData": "" + } + }, + { + "id": "shareledger1jfmd6smyrfsqjw0gs9zyc880rfyg69r3rj3yx9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jfmd6smyrfsqjw0gs9zyc880rfyg69r3rj3yx9", + "ownerAddress": "shareledger1jfmd6smyrfsqjw0gs9zyc880rfyg69r3rj3yx9", + "extraData": "" + } + }, + { + "id": "shareledger1jh3fxpg42yfkchlwpuxhndfeftqrtd6xtx4eds", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jh3fxpg42yfkchlwpuxhndfeftqrtd6xtx4eds", + "ownerAddress": "shareledger1jh3fxpg42yfkchlwpuxhndfeftqrtd6xtx4eds", + "extraData": "" + } + }, + { + "id": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "ownerAddress": "shareledger1jk6gd66fsy7h2f8g9pa0mr2lah6u5y7y4j23r2", + "extraData": "" + } + }, + { + "id": "shareledger1jk7rpjxax9v9sv4zhnpy3cqm3qtn4yscmuy52j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jk7rpjxax9v9sv4zhnpy3cqm3qtn4yscmuy52j", + "ownerAddress": "shareledger1jk7rpjxax9v9sv4zhnpy3cqm3qtn4yscmuy52j", + "extraData": "" + } + }, + { + "id": "shareledger1jkpze4etxvh7c8k8m00elzc7nktwdrt3cdteq3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jkpze4etxvh7c8k8m00elzc7nktwdrt3cdteq3", + "ownerAddress": "shareledger1jkpze4etxvh7c8k8m00elzc7nktwdrt3cdteq3", + "extraData": "" + } + }, + { + "id": "shareledger1jl9vdytuax4ph640lc5axry0z6qq2n39zadyla", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jl9vdytuax4ph640lc5axry0z6qq2n39zadyla", + "ownerAddress": "shareledger1jl9vdytuax4ph640lc5axry0z6qq2n39zadyla", + "extraData": "" + } + }, + { + "id": "shareledger1jld6f8rwvxlzw8q36f3r9g77tg88uzv6q87f9p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jld6f8rwvxlzw8q36f3r9g77tg88uzv6q87f9p", + "ownerAddress": "shareledger1jld6f8rwvxlzw8q36f3r9g77tg88uzv6q87f9p", + "extraData": "" + } + }, + { + "id": "shareledger1jlf4ngcegmmjdqer6yd6xxa0l0z6mxstnry5nv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jlf4ngcegmmjdqer6yd6xxa0l0z6mxstnry5nv", + "ownerAddress": "shareledger1jlf4ngcegmmjdqer6yd6xxa0l0z6mxstnry5nv", + "extraData": "" + } + }, + { + "id": "shareledger1jlpqvcv6f3jpazlt8plkqm62w3kmpgpdkp39d8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jlpqvcv6f3jpazlt8plkqm62w3kmpgpdkp39d8", + "ownerAddress": "shareledger1jlpqvcv6f3jpazlt8plkqm62w3kmpgpdkp39d8", + "extraData": "" + } + }, + { + "id": "shareledger1jm6p8g99uzz3anzwpj3gzls4wwhjfy3erftmyr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jm6p8g99uzz3anzwpj3gzls4wwhjfy3erftmyr", + "ownerAddress": "shareledger1jm6p8g99uzz3anzwpj3gzls4wwhjfy3erftmyr", + "extraData": "" + } + }, + { + "id": "shareledger1jn9ccxlguaeaulpzjem5tsn4y9fyfcjjwu6evq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jn9ccxlguaeaulpzjem5tsn4y9fyfcjjwu6evq", + "ownerAddress": "shareledger1jn9ccxlguaeaulpzjem5tsn4y9fyfcjjwu6evq", + "extraData": "" + } + }, + { + "id": "shareledger1jndvtupapy5mk8yj6sn5ap55xrj7wtd53v0vuf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jndvtupapy5mk8yj6sn5ap55xrj7wtd53v0vuf", + "ownerAddress": "shareledger1jndvtupapy5mk8yj6sn5ap55xrj7wtd53v0vuf", + "extraData": "" + } + }, + { + "id": "shareledger1jqjm8panlfm9k0vndkjqj4ljneltcpjxerthkh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jqjm8panlfm9k0vndkjqj4ljneltcpjxerthkh", + "ownerAddress": "shareledger1jqjm8panlfm9k0vndkjqj4ljneltcpjxerthkh", + "extraData": "" + } + }, + { + "id": "shareledger1jsqk9fwyv7q6ggrxvvfe85fd5l73ct92gvw45h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jsqk9fwyv7q6ggrxvvfe85fd5l73ct92gvw45h", + "ownerAddress": "shareledger1jsqk9fwyv7q6ggrxvvfe85fd5l73ct92gvw45h", + "extraData": "" + } + }, + { + "id": "shareledger1jsqv0yhlkjeqtltsuvp2up7zty50mhpn7hcc46", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jsqv0yhlkjeqtltsuvp2up7zty50mhpn7hcc46", + "ownerAddress": "shareledger1jsqv0yhlkjeqtltsuvp2up7zty50mhpn7hcc46", + "extraData": "" + } + }, + { + "id": "shareledger1jsrdm2g7zm7acyjd59hevhn3dj3fvzydrxvx3s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jsrdm2g7zm7acyjd59hevhn3dj3fvzydrxvx3s", + "ownerAddress": "shareledger1jsrdm2g7zm7acyjd59hevhn3dj3fvzydrxvx3s", + "extraData": "" + } + }, + { + "id": "shareledger1jta06q8j9nragu7nss5c2lvurdd88t6rny7v5e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jta06q8j9nragu7nss5c2lvurdd88t6rny7v5e", + "ownerAddress": "shareledger1jta06q8j9nragu7nss5c2lvurdd88t6rny7v5e", + "extraData": "" + } + }, + { + "id": "shareledger1jtz2qklzehsdl96z6cc4xxx367g0lh38yh4e3q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jtz2qklzehsdl96z6cc4xxx367g0lh38yh4e3q", + "ownerAddress": "shareledger1jtz2qklzehsdl96z6cc4xxx367g0lh38yh4e3q", + "extraData": "" + } + }, + { + "id": "shareledger1juq390fgr72uududej4u9ea35sql6lzqpnt6jl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1juq390fgr72uududej4u9ea35sql6lzqpnt6jl", + "ownerAddress": "shareledger1juq390fgr72uududej4u9ea35sql6lzqpnt6jl", + "extraData": "" + } + }, + { + "id": "shareledger1jxuymr6df2faqm3y8n924s5dsmnl72tzctm5zd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jxuymr6df2faqm3y8n924s5dsmnl72tzctm5zd", + "ownerAddress": "shareledger1jxuymr6df2faqm3y8n924s5dsmnl72tzctm5zd", + "extraData": "" + } + }, + { + "id": "shareledger1jy72gy5mvye4y2ggngufzc9zwygxwvndufvs8s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jy72gy5mvye4y2ggngufzc9zwygxwvndufvs8s", + "ownerAddress": "shareledger1jy72gy5mvye4y2ggngufzc9zwygxwvndufvs8s", + "extraData": "" + } + }, + { + "id": "shareledger1jyywy7qa3lvm3lkw4vjtnje8d8sgdsly75804m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1jyywy7qa3lvm3lkw4vjtnje8d8sgdsly75804m", + "ownerAddress": "shareledger1jyywy7qa3lvm3lkw4vjtnje8d8sgdsly75804m", + "extraData": "" + } + }, + { + "id": "shareledger1k099clwpg6w8epcufjauetyd47tncnyk7580g4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k099clwpg6w8epcufjauetyd47tncnyk7580g4", + "ownerAddress": "shareledger1k099clwpg6w8epcufjauetyd47tncnyk7580g4", + "extraData": "" + } + }, + { + "id": "shareledger1k0me8v64k74mns42hl8jncfn58g6uectd8hm32", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k0me8v64k74mns42hl8jncfn58g6uectd8hm32", + "ownerAddress": "shareledger1k0me8v64k74mns42hl8jncfn58g6uectd8hm32", + "extraData": "" + } + }, + { + "id": "shareledger1k369l3d0ncpgfxt0cwdf8p9lu5jt7u4k4mp9rv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k369l3d0ncpgfxt0cwdf8p9lu5jt7u4k4mp9rv", + "ownerAddress": "shareledger1k369l3d0ncpgfxt0cwdf8p9lu5jt7u4k4mp9rv", + "extraData": "" + } + }, + { + "id": "shareledger1k3x4tg32h7c85r4s8ue964mcpfutvkf05gcy8n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k3x4tg32h7c85r4s8ue964mcpfutvkf05gcy8n", + "ownerAddress": "shareledger1k3x4tg32h7c85r4s8ue964mcpfutvkf05gcy8n", + "extraData": "" + } + }, + { + "id": "shareledger1k4sdmwfqk90g9r8y5kyh25ce3jprvhccy7uj4n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k4sdmwfqk90g9r8y5kyh25ce3jprvhccy7uj4n", + "ownerAddress": "shareledger1k4sdmwfqk90g9r8y5kyh25ce3jprvhccy7uj4n", + "extraData": "" + } + }, + { + "id": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "ownerAddress": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "extraData": "" + } + }, + { + "id": "shareledger1k5cytf3ava6gz3f6xfrmk93hr4pehw0ckcqaql", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k5cytf3ava6gz3f6xfrmk93hr4pehw0ckcqaql", + "ownerAddress": "shareledger1k5cytf3ava6gz3f6xfrmk93hr4pehw0ckcqaql", + "extraData": "" + } + }, + { + "id": "shareledger1k5duk457jzqrftl98pjfhfqg99wtdvq7s02k7r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k5duk457jzqrftl98pjfhfqg99wtdvq7s02k7r", + "ownerAddress": "shareledger1k5duk457jzqrftl98pjfhfqg99wtdvq7s02k7r", + "extraData": "" + } + }, + { + "id": "shareledger1k5e29cdv8v0cnc90hs4x4uwpfwjgpqdgcf94ae", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k5e29cdv8v0cnc90hs4x4uwpfwjgpqdgcf94ae", + "ownerAddress": "shareledger1k5e29cdv8v0cnc90hs4x4uwpfwjgpqdgcf94ae", + "extraData": "" + } + }, + { + "id": "shareledger1k5ylqq8nqu5ddptw7k7q30em7zf685vsrfynd5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k5ylqq8nqu5ddptw7k7q30em7zf685vsrfynd5", + "ownerAddress": "shareledger1k5ylqq8nqu5ddptw7k7q30em7zf685vsrfynd5", + "extraData": "" + } + }, + { + "id": "shareledger1k67rv96hmkns94z8t2v6ycjw5eqrcdzglrelmm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k67rv96hmkns94z8t2v6ycjw5eqrcdzglrelmm", + "ownerAddress": "shareledger1k67rv96hmkns94z8t2v6ycjw5eqrcdzglrelmm", + "extraData": "" + } + }, + { + "id": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "ownerAddress": "shareledger1k6ham8m3yxwngafczuk8eqvsuuj4xsrvwqc25g", + "extraData": "" + } + }, + { + "id": "shareledger1k7clqj0zffcaj9wwvdfm5ryxzpg7vhe7q437v4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k7clqj0zffcaj9wwvdfm5ryxzpg7vhe7q437v4", + "ownerAddress": "shareledger1k7clqj0zffcaj9wwvdfm5ryxzpg7vhe7q437v4", + "extraData": "" + } + }, + { + "id": "shareledger1k88ysfs40qwtlg5a9hsdw0gpu6vfu8rdac8tqx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k88ysfs40qwtlg5a9hsdw0gpu6vfu8rdac8tqx", + "ownerAddress": "shareledger1k88ysfs40qwtlg5a9hsdw0gpu6vfu8rdac8tqx", + "extraData": "" + } + }, + { + "id": "shareledger1k8qlsycyf9wcdten7l85nhd0px6whr297v4m57", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k8qlsycyf9wcdten7l85nhd0px6whr297v4m57", + "ownerAddress": "shareledger1k8qlsycyf9wcdten7l85nhd0px6whr297v4m57", + "extraData": "" + } + }, + { + "id": "shareledger1k8u5g6xsc96kauenn2gdacrcsdgy9x6sklmjej", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k8u5g6xsc96kauenn2gdacrcsdgy9x6sklmjej", + "ownerAddress": "shareledger1k8u5g6xsc96kauenn2gdacrcsdgy9x6sklmjej", + "extraData": "" + } + }, + { + "id": "shareledger1k93kpvs7jhv433g62htax0xdsc8jq848zww4l8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k93kpvs7jhv433g62htax0xdsc8jq848zww4l8", + "ownerAddress": "shareledger1k93kpvs7jhv433g62htax0xdsc8jq848zww4l8", + "extraData": "" + } + }, + { + "id": "shareledger1k9arlr74tgc5d5hhvjmtm9v9yd7lv67z289tfz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k9arlr74tgc5d5hhvjmtm9v9yd7lv67z289tfz", + "ownerAddress": "shareledger1k9arlr74tgc5d5hhvjmtm9v9yd7lv67z289tfz", + "extraData": "" + } + }, + { + "id": "shareledger1k9fgwx5z3s62cykh0v6c9kddtzuz089uh94w2t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k9fgwx5z3s62cykh0v6c9kddtzuz089uh94w2t", + "ownerAddress": "shareledger1k9fgwx5z3s62cykh0v6c9kddtzuz089uh94w2t", + "extraData": "" + } + }, + { + "id": "shareledger1k9nyxff72g56zjtl7nx2ysv4tm3wmv8aakat0y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1k9nyxff72g56zjtl7nx2ysv4tm3wmv8aakat0y", + "ownerAddress": "shareledger1k9nyxff72g56zjtl7nx2ysv4tm3wmv8aakat0y", + "extraData": "" + } + }, + { + "id": "shareledger1kahhs8clt5j8szpywgpkswnjal0fvgcd2frs37", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kahhs8clt5j8szpywgpkswnjal0fvgcd2frs37", + "ownerAddress": "shareledger1kahhs8clt5j8szpywgpkswnjal0fvgcd2frs37", + "extraData": "" + } + }, + { + "id": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "ownerAddress": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "extraData": "" + } + }, + { + "id": "shareledger1kd4yqtmykkl4ce6vfy57fslhd0qm7vd8s2jf27", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kd4yqtmykkl4ce6vfy57fslhd0qm7vd8s2jf27", + "ownerAddress": "shareledger1kd4yqtmykkl4ce6vfy57fslhd0qm7vd8s2jf27", + "extraData": "" + } + }, + { + "id": "shareledger1kelj4e9dwlwflhn97hmytffk6juu5gf0gwrrfw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kelj4e9dwlwflhn97hmytffk6juu5gf0gwrrfw", + "ownerAddress": "shareledger1kelj4e9dwlwflhn97hmytffk6juu5gf0gwrrfw", + "extraData": "" + } + }, + { + "id": "shareledger1ket6385r7eqdqvsd33q86hzta2qer7rj8s6key", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ket6385r7eqdqvsd33q86hzta2qer7rj8s6key", + "ownerAddress": "shareledger1ket6385r7eqdqvsd33q86hzta2qer7rj8s6key", + "extraData": "" + } + }, + { + "id": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "ownerAddress": "shareledger1kexjuy5q57w3r6xv0lmhap7vltqcnrq63rks6c", + "extraData": "" + } + }, + { + "id": "shareledger1kgw5a4vxekfjaklue0kaaafmwkvuqtstl9rq2v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kgw5a4vxekfjaklue0kaaafmwkvuqtstl9rq2v", + "ownerAddress": "shareledger1kgw5a4vxekfjaklue0kaaafmwkvuqtstl9rq2v", + "extraData": "" + } + }, + { + "id": "shareledger1kh3qqae4v8hhpvzt74nxp560pwaw4vtn7murls", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kh3qqae4v8hhpvzt74nxp560pwaw4vtn7murls", + "ownerAddress": "shareledger1kh3qqae4v8hhpvzt74nxp560pwaw4vtn7murls", + "extraData": "" + } + }, + { + "id": "shareledger1kklaq9x52pz9m69gvt7alju7728fuefv7zyt6d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kklaq9x52pz9m69gvt7alju7728fuefv7zyt6d", + "ownerAddress": "shareledger1kklaq9x52pz9m69gvt7alju7728fuefv7zyt6d", + "extraData": "" + } + }, + { + "id": "shareledger1kl325943dmtwud3vfu4f24dzx6atts66ng4lfj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kl325943dmtwud3vfu4f24dzx6atts66ng4lfj", + "ownerAddress": "shareledger1kl325943dmtwud3vfu4f24dzx6atts66ng4lfj", + "extraData": "" + } + }, + { + "id": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "ownerAddress": "shareledger1klnmfyj9vz8p0wltu9qtf26w924vgv8zpxcvwx", + "extraData": "" + } + }, + { + "id": "shareledger1kly4hdknr0am6cznh476ut80va32trxqg6jeft", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kly4hdknr0am6cznh476ut80va32trxqg6jeft", + "ownerAddress": "shareledger1kly4hdknr0am6cznh476ut80va32trxqg6jeft", + "extraData": "" + } + }, + { + "id": "shareledger1kmcwljqthxypzy7jx69yr56gq0a9p7vdxu6xvf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kmcwljqthxypzy7jx69yr56gq0a9p7vdxu6xvf", + "ownerAddress": "shareledger1kmcwljqthxypzy7jx69yr56gq0a9p7vdxu6xvf", + "extraData": "" + } + }, + { + "id": "shareledger1kmzfhk9uvuvttswzuf6nh864udrfrhadny34lw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kmzfhk9uvuvttswzuf6nh864udrfrhadny34lw", + "ownerAddress": "shareledger1kmzfhk9uvuvttswzuf6nh864udrfrhadny34lw", + "extraData": "" + } + }, + { + "id": "shareledger1knqh6v2pfwdur4087xhwfsta5d0u4lmg8ms7x2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1knqh6v2pfwdur4087xhwfsta5d0u4lmg8ms7x2", + "ownerAddress": "shareledger1knqh6v2pfwdur4087xhwfsta5d0u4lmg8ms7x2", + "extraData": "" + } + }, + { + "id": "shareledger1kqdld07e96a40f4e53zpjygwsfz26xae8c7kex", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kqdld07e96a40f4e53zpjygwsfz26xae8c7kex", + "ownerAddress": "shareledger1kqdld07e96a40f4e53zpjygwsfz26xae8c7kex", + "extraData": "" + } + }, + { + "id": "shareledger1kqf0na9h8y8tqe03l40yamc295jh6nhxr5d5za", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kqf0na9h8y8tqe03l40yamc295jh6nhxr5d5za", + "ownerAddress": "shareledger1kqf0na9h8y8tqe03l40yamc295jh6nhxr5d5za", + "extraData": "" + } + }, + { + "id": "shareledger1kquz8s0savxgxjgdhenv6tk00pzxalxyyx9egz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kquz8s0savxgxjgdhenv6tk00pzxalxyyx9egz", + "ownerAddress": "shareledger1kquz8s0savxgxjgdhenv6tk00pzxalxyyx9egz", + "extraData": "" + } + }, + { + "id": "shareledger1krs7xpdeee2u6tqxvn9ztrhkcxllnqqk3djrmp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1krs7xpdeee2u6tqxvn9ztrhkcxllnqqk3djrmp", + "ownerAddress": "shareledger1krs7xpdeee2u6tqxvn9ztrhkcxllnqqk3djrmp", + "extraData": "" + } + }, + { + "id": "shareledger1krzg490cxflsu89phcqz5dvh78sjnrlduhsrtl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1krzg490cxflsu89phcqz5dvh78sjnrlduhsrtl", + "ownerAddress": "shareledger1krzg490cxflsu89phcqz5dvh78sjnrlduhsrtl", + "extraData": "" + } + }, + { + "id": "shareledger1ks3f4qwdvqjahzugkk7zmn73pxnrwm9xmrqly6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ks3f4qwdvqjahzugkk7zmn73pxnrwm9xmrqly6", + "ownerAddress": "shareledger1ks3f4qwdvqjahzugkk7zmn73pxnrwm9xmrqly6", + "extraData": "" + } + }, + { + "id": "shareledger1ks3yd8auw055zudszfkq62unklpg94kxyhw9vy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ks3yd8auw055zudszfkq62unklpg94kxyhw9vy", + "ownerAddress": "shareledger1ks3yd8auw055zudszfkq62unklpg94kxyhw9vy", + "extraData": "" + } + }, + { + "id": "shareledger1ks4u6s4lp9m7z4pgkujcc3hu0fmdevnk2t6rt9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ks4u6s4lp9m7z4pgkujcc3hu0fmdevnk2t6rt9", + "ownerAddress": "shareledger1ks4u6s4lp9m7z4pgkujcc3hu0fmdevnk2t6rt9", + "extraData": "" + } + }, + { + "id": "shareledger1kuhjmp03zqh9dv0akfch84vd6xy4g479pe6euq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kuhjmp03zqh9dv0akfch84vd6xy4g479pe6euq", + "ownerAddress": "shareledger1kuhjmp03zqh9dv0akfch84vd6xy4g479pe6euq", + "extraData": "" + } + }, + { + "id": "shareledger1kum3qqy8f4nx8mgyt45tsmu7c28we2grkdevkr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kum3qqy8f4nx8mgyt45tsmu7c28we2grkdevkr", + "ownerAddress": "shareledger1kum3qqy8f4nx8mgyt45tsmu7c28we2grkdevkr", + "extraData": "" + } + }, + { + "id": "shareledger1kusxd85wppp7sc6t00r43h4gs9aa6rjj3ftr2n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kusxd85wppp7sc6t00r43h4gs9aa6rjj3ftr2n", + "ownerAddress": "shareledger1kusxd85wppp7sc6t00r43h4gs9aa6rjj3ftr2n", + "extraData": "" + } + }, + { + "id": "shareledger1kuylm43gjc5d9vyrqhhx2ug8cvulh2smxxxm2j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kuylm43gjc5d9vyrqhhx2ug8cvulh2smxxxm2j", + "ownerAddress": "shareledger1kuylm43gjc5d9vyrqhhx2ug8cvulh2smxxxm2j", + "extraData": "" + } + }, + { + "id": "shareledger1kuylw2fzmmwardk5y95qr0m3vda8nhresce2pp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kuylw2fzmmwardk5y95qr0m3vda8nhresce2pp", + "ownerAddress": "shareledger1kuylw2fzmmwardk5y95qr0m3vda8nhresce2pp", + "extraData": "" + } + }, + { + "id": "shareledger1kvd9lesm8nkkvxf4lugnlrs28zc0qxv4je6y5f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kvd9lesm8nkkvxf4lugnlrs28zc0qxv4je6y5f", + "ownerAddress": "shareledger1kvd9lesm8nkkvxf4lugnlrs28zc0qxv4je6y5f", + "extraData": "" + } + }, + { + "id": "shareledger1kvr899mjmfuq8vhs76jwvsscgqzmh5td28q8sm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kvr899mjmfuq8vhs76jwvsscgqzmh5td28q8sm", + "ownerAddress": "shareledger1kvr899mjmfuq8vhs76jwvsscgqzmh5td28q8sm", + "extraData": "" + } + }, + { + "id": "shareledger1kwfdff5a0jhjfp7nfd03u6zlvcy4a7ktv0kqd9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kwfdff5a0jhjfp7nfd03u6zlvcy4a7ktv0kqd9", + "ownerAddress": "shareledger1kwfdff5a0jhjfp7nfd03u6zlvcy4a7ktv0kqd9", + "extraData": "" + } + }, + { + "id": "shareledger1kwgwyqm9cezvc6rulhvw94ftx6vsddpu6rty0g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kwgwyqm9cezvc6rulhvw94ftx6vsddpu6rty0g", + "ownerAddress": "shareledger1kwgwyqm9cezvc6rulhvw94ftx6vsddpu6rty0g", + "extraData": "" + } + }, + { + "id": "shareledger1kwm0h6y3qjydh6wkmz4cggnqs6kgj7gjj2j629", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kwm0h6y3qjydh6wkmz4cggnqs6kgj7gjj2j629", + "ownerAddress": "shareledger1kwm0h6y3qjydh6wkmz4cggnqs6kgj7gjj2j629", + "extraData": "" + } + }, + { + "id": "shareledger1ky9l7nm03p8365s3fm85p2y5tulx4jry4yactw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ky9l7nm03p8365s3fm85p2y5tulx4jry4yactw", + "ownerAddress": "shareledger1ky9l7nm03p8365s3fm85p2y5tulx4jry4yactw", + "extraData": "" + } + }, + { + "id": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "ownerAddress": "shareledger1kye4gexv4y28050djpcvccqvltwjjja36rgr83", + "extraData": "" + } + }, + { + "id": "shareledger1kz35w2mhnevned566h0w4dyygdhllvyx5zrjp7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kz35w2mhnevned566h0w4dyygdhllvyx5zrjp7", + "ownerAddress": "shareledger1kz35w2mhnevned566h0w4dyygdhllvyx5zrjp7", + "extraData": "" + } + }, + { + "id": "shareledger1kz4c9p7vwu97s7ph3xcp55ycd97ep3llln4hjt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1kz4c9p7vwu97s7ph3xcp55ycd97ep3llln4hjt", + "ownerAddress": "shareledger1kz4c9p7vwu97s7ph3xcp55ycd97ep3llln4hjt", + "extraData": "" + } + }, + { + "id": "shareledger1l0mtd9n9rsq0yc9850eqdemdlpq94z73pkzf7u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l0mtd9n9rsq0yc9850eqdemdlpq94z73pkzf7u", + "ownerAddress": "shareledger1l0mtd9n9rsq0yc9850eqdemdlpq94z73pkzf7u", + "extraData": "" + } + }, + { + "id": "shareledger1l0u5gx6456x6yehrqljmxskjjgynlk6w67hw23", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l0u5gx6456x6yehrqljmxskjjgynlk6w67hw23", + "ownerAddress": "shareledger1l0u5gx6456x6yehrqljmxskjjgynlk6w67hw23", + "extraData": "" + } + }, + { + "id": "shareledger1l2j6rj2ntxgaqa6txkkpsavx803y587kl0v5nk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l2j6rj2ntxgaqa6txkkpsavx803y587kl0v5nk", + "ownerAddress": "shareledger1l2j6rj2ntxgaqa6txkkpsavx803y587kl0v5nk", + "extraData": "" + } + }, + { + "id": "shareledger1l2pnttwrv8yt5hd44qnhvpxmvv7rh6pkqd4hp5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l2pnttwrv8yt5hd44qnhvpxmvv7rh6pkqd4hp5", + "ownerAddress": "shareledger1l2pnttwrv8yt5hd44qnhvpxmvv7rh6pkqd4hp5", + "extraData": "" + } + }, + { + "id": "shareledger1l2r2y4tuwjvu29zf9yhx86fzauecsekyprqsse", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l2r2y4tuwjvu29zf9yhx86fzauecsekyprqsse", + "ownerAddress": "shareledger1l2r2y4tuwjvu29zf9yhx86fzauecsekyprqsse", + "extraData": "" + } + }, + { + "id": "shareledger1l4m3w2qruq67scu0y3aqyjx2pq4zy7geyjs654", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l4m3w2qruq67scu0y3aqyjx2pq4zy7geyjs654", + "ownerAddress": "shareledger1l4m3w2qruq67scu0y3aqyjx2pq4zy7geyjs654", + "extraData": "" + } + }, + { + "id": "shareledger1l4n8m6ajpk4vp0np53jzhsjxnpyywm9z6q0pqq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l4n8m6ajpk4vp0np53jzhsjxnpyywm9z6q0pqq", + "ownerAddress": "shareledger1l4n8m6ajpk4vp0np53jzhsjxnpyywm9z6q0pqq", + "extraData": "" + } + }, + { + "id": "shareledger1l4u2ym2t32su4tace0yaj5myppq26tr5efevtq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l4u2ym2t32su4tace0yaj5myppq26tr5efevtq", + "ownerAddress": "shareledger1l4u2ym2t32su4tace0yaj5myppq26tr5efevtq", + "extraData": "" + } + }, + { + "id": "shareledger1l4uvkhr80lmrgsadnap8eqm6t6f26sy69lp76s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l4uvkhr80lmrgsadnap8eqm6t6f26sy69lp76s", + "ownerAddress": "shareledger1l4uvkhr80lmrgsadnap8eqm6t6f26sy69lp76s", + "extraData": "" + } + }, + { + "id": "shareledger1l5jr2hl5yt74y0klwl87g29gghqwyp8sjuxlql", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l5jr2hl5yt74y0klwl87g29gghqwyp8sjuxlql", + "ownerAddress": "shareledger1l5jr2hl5yt74y0klwl87g29gghqwyp8sjuxlql", + "extraData": "" + } + }, + { + "id": "shareledger1l5vcq2tzdzw78kuwdlze3xhwuecscqskagwm8g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l5vcq2tzdzw78kuwdlze3xhwuecscqskagwm8g", + "ownerAddress": "shareledger1l5vcq2tzdzw78kuwdlze3xhwuecscqskagwm8g", + "extraData": "" + } + }, + { + "id": "shareledger1l67al5hkwxkt4fwh0krrkxqxxxxwvnqadng0k9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l67al5hkwxkt4fwh0krrkxqxxxxwvnqadng0k9", + "ownerAddress": "shareledger1l67al5hkwxkt4fwh0krrkxqxxxxwvnqadng0k9", + "extraData": "" + } + }, + { + "id": "shareledger1l6fuvlra3alzaztucfgn9u4ss552j5ntjvjl3w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l6fuvlra3alzaztucfgn9u4ss552j5ntjvjl3w", + "ownerAddress": "shareledger1l6fuvlra3alzaztucfgn9u4ss552j5ntjvjl3w", + "extraData": "" + } + }, + { + "id": "shareledger1l797dfsdgu5fl3uetzgpjcw46y4aw26vu5vcxe", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l797dfsdgu5fl3uetzgpjcw46y4aw26vu5vcxe", + "ownerAddress": "shareledger1l797dfsdgu5fl3uetzgpjcw46y4aw26vu5vcxe", + "extraData": "" + } + }, + { + "id": "shareledger1l7pn8yslht70aedlgtsnh5cx9a6c3zk2clhr7y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l7pn8yslht70aedlgtsnh5cx9a6c3zk2clhr7y", + "ownerAddress": "shareledger1l7pn8yslht70aedlgtsnh5cx9a6c3zk2clhr7y", + "extraData": "" + } + }, + { + "id": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "ownerAddress": "shareledger1l86v48hpfyesyetqx2q6vzkvvlraeahurh2cf4", + "extraData": "" + } + }, + { + "id": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "ownerAddress": "shareledger1l8yk3jqncw2xlksfqhegedtmgrx6afmkvnmvtg", + "extraData": "" + } + }, + { + "id": "shareledger1l9mlwnlevz792vc8sf6td2004stpp5v0l0e93n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l9mlwnlevz792vc8sf6td2004stpp5v0l0e93n", + "ownerAddress": "shareledger1l9mlwnlevz792vc8sf6td2004stpp5v0l0e93n", + "extraData": "" + } + }, + { + "id": "shareledger1l9zp9yqaf9zt48mgktql80efexz2ht4yzz6tq7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1l9zp9yqaf9zt48mgktql80efexz2ht4yzz6tq7", + "ownerAddress": "shareledger1l9zp9yqaf9zt48mgktql80efexz2ht4yzz6tq7", + "extraData": "" + } + }, + { + "id": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "ownerAddress": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "extraData": "" + } + }, + { + "id": "shareledger1lav6c4yskkatkgrhtayadke0zzvhtcp5wchl27", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lav6c4yskkatkgrhtayadke0zzvhtcp5wchl27", + "ownerAddress": "shareledger1lav6c4yskkatkgrhtayadke0zzvhtcp5wchl27", + "extraData": "" + } + }, + { + "id": "shareledger1lc5tqqqygvttcgpn9ry2wjuntf7xddnuj2zf45", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lc5tqqqygvttcgpn9ry2wjuntf7xddnuj2zf45", + "ownerAddress": "shareledger1lc5tqqqygvttcgpn9ry2wjuntf7xddnuj2zf45", + "extraData": "" + } + }, + { + "id": "shareledger1lcckldleeta6wfsm0g29wr5eqe5scgw6w2uwtn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lcckldleeta6wfsm0g29wr5eqe5scgw6w2uwtn", + "ownerAddress": "shareledger1lcckldleeta6wfsm0g29wr5eqe5scgw6w2uwtn", + "extraData": "" + } + }, + { + "id": "shareledger1lcr6n0n059q4et5q4t3wgu229w94utwmqzagr4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lcr6n0n059q4et5q4t3wgu229w94utwmqzagr4", + "ownerAddress": "shareledger1lcr6n0n059q4et5q4t3wgu229w94utwmqzagr4", + "extraData": "" + } + }, + { + "id": "shareledger1lcssp9nw85xl49n9tgavgk3cf4ump7hsxchxuv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lcssp9nw85xl49n9tgavgk3cf4ump7hsxchxuv", + "ownerAddress": "shareledger1lcssp9nw85xl49n9tgavgk3cf4ump7hsxchxuv", + "extraData": "" + } + }, + { + "id": "shareledger1lczmep6hccv8274ls7xwqu44qwdn6k6q2hvteg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lczmep6hccv8274ls7xwqu44qwdn6k6q2hvteg", + "ownerAddress": "shareledger1lczmep6hccv8274ls7xwqu44qwdn6k6q2hvteg", + "extraData": "" + } + }, + { + "id": "shareledger1le0lccdyej89pvefshl99ncuc33wehljvj9et4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1le0lccdyej89pvefshl99ncuc33wehljvj9et4", + "ownerAddress": "shareledger1le0lccdyej89pvefshl99ncuc33wehljvj9et4", + "extraData": "" + } + }, + { + "id": "shareledger1le88zmud5yma5kjjzp9zuzmthvu7wkd6khxwhf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1le88zmud5yma5kjjzp9zuzmthvu7wkd6khxwhf", + "ownerAddress": "shareledger1le88zmud5yma5kjjzp9zuzmthvu7wkd6khxwhf", + "extraData": "" + } + }, + { + "id": "shareledger1legze0xkv764j0xr7hu9pv0n66y02702jmcyf8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1legze0xkv764j0xr7hu9pv0n66y02702jmcyf8", + "ownerAddress": "shareledger1legze0xkv764j0xr7hu9pv0n66y02702jmcyf8", + "extraData": "" + } + }, + { + "id": "shareledger1lf6xj94867vpvn0v20yavn55syphy73vfstn0q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lf6xj94867vpvn0v20yavn55syphy73vfstn0q", + "ownerAddress": "shareledger1lf6xj94867vpvn0v20yavn55syphy73vfstn0q", + "extraData": "" + } + }, + { + "id": "shareledger1lf8v35w7574wvzg6pr8g6s9jrpht38p6mfrchq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lf8v35w7574wvzg6pr8g6s9jrpht38p6mfrchq", + "ownerAddress": "shareledger1lf8v35w7574wvzg6pr8g6s9jrpht38p6mfrchq", + "extraData": "" + } + }, + { + "id": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "ownerAddress": "shareledger1lfnkd8vjpfqtckwa0t5uce4dv4ngng34ycr429", + "extraData": "" + } + }, + { + "id": "shareledger1lgd98sqn0vxz0t7vkzz38g3lkggnmdpl0lkwea", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lgd98sqn0vxz0t7vkzz38g3lkggnmdpl0lkwea", + "ownerAddress": "shareledger1lgd98sqn0vxz0t7vkzz38g3lkggnmdpl0lkwea", + "extraData": "" + } + }, + { + "id": "shareledger1lgf2f62wpwrc5a7wuauemmx6398kgqc3xq6ddl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lgf2f62wpwrc5a7wuauemmx6398kgqc3xq6ddl", + "ownerAddress": "shareledger1lgf2f62wpwrc5a7wuauemmx6398kgqc3xq6ddl", + "extraData": "" + } + }, + { + "id": "shareledger1lhdfddfmw9ymucyvyx7zsh5steptjdg56tltna", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lhdfddfmw9ymucyvyx7zsh5steptjdg56tltna", + "ownerAddress": "shareledger1lhdfddfmw9ymucyvyx7zsh5steptjdg56tltna", + "extraData": "" + } + }, + { + "id": "shareledger1ljm7sltlgfkezqjpsj8lnh00wx6d3w7c9vjdqj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ljm7sltlgfkezqjpsj8lnh00wx6d3w7c9vjdqj", + "ownerAddress": "shareledger1ljm7sltlgfkezqjpsj8lnh00wx6d3w7c9vjdqj", + "extraData": "" + } + }, + { + "id": "shareledger1ljrelfvtyvpn2zmqlw2z6fmhhspd7gjs47wsrz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ljrelfvtyvpn2zmqlw2z6fmhhspd7gjs47wsrz", + "ownerAddress": "shareledger1ljrelfvtyvpn2zmqlw2z6fmhhspd7gjs47wsrz", + "extraData": "" + } + }, + { + "id": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "ownerAddress": "shareledger1lkfetel7h8pzf035erdcrzjkawmkasullfpjgx", + "extraData": "" + } + }, + { + "id": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "ownerAddress": "shareledger1lldrtvyja5xkc6a0ustpy5hzqtd0008a87ymru", + "extraData": "" + } + }, + { + "id": "shareledger1lle5hyt29yz5jr95naw2ganlklhnp8azu0x9w6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lle5hyt29yz5jr95naw2ganlklhnp8azu0x9w6", + "ownerAddress": "shareledger1lle5hyt29yz5jr95naw2ganlklhnp8azu0x9w6", + "extraData": "" + } + }, + { + "id": "shareledger1lmtqr3t29cpua2pn5cndpjn8zj3pcsy6n04f86", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lmtqr3t29cpua2pn5cndpjn8zj3pcsy6n04f86", + "ownerAddress": "shareledger1lmtqr3t29cpua2pn5cndpjn8zj3pcsy6n04f86", + "extraData": "" + } + }, + { + "id": "shareledger1ln0s9d0qs04wrq9p2842qftf5azn3m2aw5e2r0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ln0s9d0qs04wrq9p2842qftf5azn3m2aw5e2r0", + "ownerAddress": "shareledger1ln0s9d0qs04wrq9p2842qftf5azn3m2aw5e2r0", + "extraData": "" + } + }, + { + "id": "shareledger1ln8zztanadaw0286q4kdzd4dvpcgjt5e3j96f0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ln8zztanadaw0286q4kdzd4dvpcgjt5e3j96f0", + "ownerAddress": "shareledger1ln8zztanadaw0286q4kdzd4dvpcgjt5e3j96f0", + "extraData": "" + } + }, + { + "id": "shareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "ownerAddress": "shareledger1lnl7m236wzmw08tuf594chgf9lx4zhnuhuj7te", + "extraData": "" + } + }, + { + "id": "shareledger1lp5j7c96cydqv4xyg6vsyglxad0kuxmsux5xdc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lp5j7c96cydqv4xyg6vsyglxad0kuxmsux5xdc", + "ownerAddress": "shareledger1lp5j7c96cydqv4xyg6vsyglxad0kuxmsux5xdc", + "extraData": "" + } + }, + { + "id": "shareledger1lq2a70gffuc5e89rfyj8dwe4z44tp5f7eeynz9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lq2a70gffuc5e89rfyj8dwe4z44tp5f7eeynz9", + "ownerAddress": "shareledger1lq2a70gffuc5e89rfyj8dwe4z44tp5f7eeynz9", + "extraData": "" + } + }, + { + "id": "shareledger1ltxqxcvmhhenherecpclxxa9kmjrcxln6k8ljp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ltxqxcvmhhenherecpclxxa9kmjrcxln6k8ljp", + "ownerAddress": "shareledger1ltxqxcvmhhenherecpclxxa9kmjrcxln6k8ljp", + "extraData": "" + } + }, + { + "id": "shareledger1ltzs7gf3rcmkcshrw3e4rw6tzppq20jjdxxnql", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ltzs7gf3rcmkcshrw3e4rw6tzppq20jjdxxnql", + "ownerAddress": "shareledger1ltzs7gf3rcmkcshrw3e4rw6tzppq20jjdxxnql", + "extraData": "" + } + }, + { + "id": "shareledger1lvd0jgc63hkpy64t6navhhtuulzkw6t5ze0p4e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lvd0jgc63hkpy64t6navhhtuulzkw6t5ze0p4e", + "ownerAddress": "shareledger1lvd0jgc63hkpy64t6navhhtuulzkw6t5ze0p4e", + "extraData": "" + } + }, + { + "id": "shareledger1lvfrdwu0ffsngzy5x5n8rn62gwdhkl4w3yt43g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lvfrdwu0ffsngzy5x5n8rn62gwdhkl4w3yt43g", + "ownerAddress": "shareledger1lvfrdwu0ffsngzy5x5n8rn62gwdhkl4w3yt43g", + "extraData": "" + } + }, + { + "id": "shareledger1lvh2q3076926ynfjgm587kzgm2ujmhnnfydpt6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lvh2q3076926ynfjgm587kzgm2ujmhnnfydpt6", + "ownerAddress": "shareledger1lvh2q3076926ynfjgm587kzgm2ujmhnnfydpt6", + "extraData": "" + } + }, + { + "id": "shareledger1lvqrk3f5g5k9qgcucd2cepu075sdu0v2ayykmu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lvqrk3f5g5k9qgcucd2cepu075sdu0v2ayykmu", + "ownerAddress": "shareledger1lvqrk3f5g5k9qgcucd2cepu075sdu0v2ayykmu", + "extraData": "" + } + }, + { + "id": "shareledger1lwy88a82r48ng9xcl4egv332vygr2ud3352324", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lwy88a82r48ng9xcl4egv332vygr2ud3352324", + "ownerAddress": "shareledger1lwy88a82r48ng9xcl4egv332vygr2ud3352324", + "extraData": "" + } + }, + { + "id": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "ownerAddress": "shareledger1lx8v3ghc2nrpfasjd8ree3yclwmnetlnt509r4", + "extraData": "" + } + }, + { + "id": "shareledger1m20rggnhphm8rcg8r9g8ttzav9ea9la6psgrp3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m20rggnhphm8rcg8r9g8ttzav9ea9la6psgrp3", + "ownerAddress": "shareledger1m20rggnhphm8rcg8r9g8ttzav9ea9la6psgrp3", + "extraData": "" + } + }, + { + "id": "shareledger1m2zmvh3d4alw85rys07at33qyazntlj253p39f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m2zmvh3d4alw85rys07at33qyazntlj253p39f", + "ownerAddress": "shareledger1m2zmvh3d4alw85rys07at33qyazntlj253p39f", + "extraData": "" + } + }, + { + "id": "shareledger1m3597redywnwdexutp4t3ggwf3cujc4w0djpl4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m3597redywnwdexutp4t3ggwf3cujc4w0djpl4", + "ownerAddress": "shareledger1m3597redywnwdexutp4t3ggwf3cujc4w0djpl4", + "extraData": "" + } + }, + { + "id": "shareledger1m384ms26j5g00pc4jadg6e7u2235azqrs0cksx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m384ms26j5g00pc4jadg6e7u2235azqrs0cksx", + "ownerAddress": "shareledger1m384ms26j5g00pc4jadg6e7u2235azqrs0cksx", + "extraData": "" + } + }, + { + "id": "shareledger1m3ffzh2vennqytvjyvpl3te5gwjksj4ujycv8q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m3ffzh2vennqytvjyvpl3te5gwjksj4ujycv8q", + "ownerAddress": "shareledger1m3ffzh2vennqytvjyvpl3te5gwjksj4ujycv8q", + "extraData": "" + } + }, + { + "id": "shareledger1m3uuxcggc4rcqgwraa45l3amucnmle6jus746h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m3uuxcggc4rcqgwraa45l3amucnmle6jus746h", + "ownerAddress": "shareledger1m3uuxcggc4rcqgwraa45l3amucnmle6jus746h", + "extraData": "" + } + }, + { + "id": "shareledger1m3xrcyxqp4jlz494zgqgvtjpsk2c6g7avgy986", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m3xrcyxqp4jlz494zgqgvtjpsk2c6g7avgy986", + "ownerAddress": "shareledger1m3xrcyxqp4jlz494zgqgvtjpsk2c6g7avgy986", + "extraData": "" + } + }, + { + "id": "shareledger1m4fjdqne23muwz3ss9anj8vxj2px22rp2mtr2x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m4fjdqne23muwz3ss9anj8vxj2px22rp2mtr2x", + "ownerAddress": "shareledger1m4fjdqne23muwz3ss9anj8vxj2px22rp2mtr2x", + "extraData": "" + } + }, + { + "id": "shareledger1m4fk2gxcuht44q6nqs9wwaaaudr74u8tluzxwe", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m4fk2gxcuht44q6nqs9wwaaaudr74u8tluzxwe", + "ownerAddress": "shareledger1m4fk2gxcuht44q6nqs9wwaaaudr74u8tluzxwe", + "extraData": "" + } + }, + { + "id": "shareledger1m4vnpr80fhqjjrmgek8leldzrvh5chrxrup6yl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m4vnpr80fhqjjrmgek8leldzrvh5chrxrup6yl", + "ownerAddress": "shareledger1m4vnpr80fhqjjrmgek8leldzrvh5chrxrup6yl", + "extraData": "" + } + }, + { + "id": "shareledger1m58s0flvwsavfcz7ewuljqak89renutk269rpz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m58s0flvwsavfcz7ewuljqak89renutk269rpz", + "ownerAddress": "shareledger1m58s0flvwsavfcz7ewuljqak89renutk269rpz", + "extraData": "" + } + }, + { + "id": "shareledger1m687vpmu8exp4das43pak6uzrewu0ppkyhl5wx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m687vpmu8exp4das43pak6uzrewu0ppkyhl5wx", + "ownerAddress": "shareledger1m687vpmu8exp4das43pak6uzrewu0ppkyhl5wx", + "extraData": "" + } + }, + { + "id": "shareledger1m68qjzcu77d263gxv7eyd7dnz9fyndpxdhjay4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m68qjzcu77d263gxv7eyd7dnz9fyndpxdhjay4", + "ownerAddress": "shareledger1m68qjzcu77d263gxv7eyd7dnz9fyndpxdhjay4", + "extraData": "" + } + }, + { + "id": "shareledger1m6sddwhtcnlc3l0dk3yhdm8xmk9p3l065enmgj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m6sddwhtcnlc3l0dk3yhdm8xmk9p3l065enmgj", + "ownerAddress": "shareledger1m6sddwhtcnlc3l0dk3yhdm8xmk9p3l065enmgj", + "extraData": "" + } + }, + { + "id": "shareledger1m6sus50ptxvg2cn86sdeve6eauyhghquv499mf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m6sus50ptxvg2cn86sdeve6eauyhghquv499mf", + "ownerAddress": "shareledger1m6sus50ptxvg2cn86sdeve6eauyhghquv499mf", + "extraData": "" + } + }, + { + "id": "shareledger1m6wp2l84kw9n3jcl45w3ajc8jdmrvlnnqfsz8j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m6wp2l84kw9n3jcl45w3ajc8jdmrvlnnqfsz8j", + "ownerAddress": "shareledger1m6wp2l84kw9n3jcl45w3ajc8jdmrvlnnqfsz8j", + "extraData": "" + } + }, + { + "id": "shareledger1m745kgsyrhe0xqsmrgajy0ujyr3gg8rg6s0qh9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m745kgsyrhe0xqsmrgajy0ujyr3gg8rg6s0qh9", + "ownerAddress": "shareledger1m745kgsyrhe0xqsmrgajy0ujyr3gg8rg6s0qh9", + "extraData": "" + } + }, + { + "id": "shareledger1m76mm673g447nhfku0w0trez4g8hnzw6nr4u4f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m76mm673g447nhfku0w0trez4g8hnzw6nr4u4f", + "ownerAddress": "shareledger1m76mm673g447nhfku0w0trez4g8hnzw6nr4u4f", + "extraData": "" + } + }, + { + "id": "shareledger1m784p0rqsdkqcuzaqwa9wk2gc5v74gk2s6gnal", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m784p0rqsdkqcuzaqwa9wk2gc5v74gk2s6gnal", + "ownerAddress": "shareledger1m784p0rqsdkqcuzaqwa9wk2gc5v74gk2s6gnal", + "extraData": "" + } + }, + { + "id": "shareledger1m79j8p4grpd5770fx26y20qv998lrp298xkgtn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m79j8p4grpd5770fx26y20qv998lrp298xkgtn", + "ownerAddress": "shareledger1m79j8p4grpd5770fx26y20qv998lrp298xkgtn", + "extraData": "" + } + }, + { + "id": "shareledger1m7adr22paz0rmycjwjasmeyqaqel3spsqs70tl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m7adr22paz0rmycjwjasmeyqaqel3spsqs70tl", + "ownerAddress": "shareledger1m7adr22paz0rmycjwjasmeyqaqel3spsqs70tl", + "extraData": "" + } + }, + { + "id": "shareledger1m7qzhky3n9vwu5efdy2a9tu60fx9ds603qhm37", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1m7qzhky3n9vwu5efdy2a9tu60fx9ds603qhm37", + "ownerAddress": "shareledger1m7qzhky3n9vwu5efdy2a9tu60fx9ds603qhm37", + "extraData": "" + } + }, + { + "id": "shareledger1madglsvtlmqleyxgzkrvp4gdssrv2tc5z9vh5x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1madglsvtlmqleyxgzkrvp4gdssrv2tc5z9vh5x", + "ownerAddress": "shareledger1madglsvtlmqleyxgzkrvp4gdssrv2tc5z9vh5x", + "extraData": "" + } + }, + { + "id": "shareledger1mcfgvghmekvh3e3dhkvygfhauly5yd5fsrfawy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mcfgvghmekvh3e3dhkvygfhauly5yd5fsrfawy", + "ownerAddress": "shareledger1mcfgvghmekvh3e3dhkvygfhauly5yd5fsrfawy", + "extraData": "" + } + }, + { + "id": "shareledger1mdcqextt66fk7f8vakh6ktaczsx7suk7ss6jlc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mdcqextt66fk7f8vakh6ktaczsx7suk7ss6jlc", + "ownerAddress": "shareledger1mdcqextt66fk7f8vakh6ktaczsx7suk7ss6jlc", + "extraData": "" + } + }, + { + "id": "shareledger1mdrp0czr2wdmayf00rg565mtgqul7300cf0ll7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mdrp0czr2wdmayf00rg565mtgqul7300cf0ll7", + "ownerAddress": "shareledger1mdrp0czr2wdmayf00rg565mtgqul7300cf0ll7", + "extraData": "" + } + }, + { + "id": "shareledger1me6rjgs6u8jxpdjusy2pawsdfndlkrzsyx559u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1me6rjgs6u8jxpdjusy2pawsdfndlkrzsyx559u", + "ownerAddress": "shareledger1me6rjgs6u8jxpdjusy2pawsdfndlkrzsyx559u", + "extraData": "" + } + }, + { + "id": "shareledger1me8lytjruynrm0t4fqmcyyd74anj5a430kyp3r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1me8lytjruynrm0t4fqmcyyd74anj5a430kyp3r", + "ownerAddress": "shareledger1me8lytjruynrm0t4fqmcyyd74anj5a430kyp3r", + "extraData": "" + } + }, + { + "id": "shareledger1mfeynlgs62dh856zdk82s9e8549kf7rqhhlm37", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mfeynlgs62dh856zdk82s9e8549kf7rqhhlm37", + "ownerAddress": "shareledger1mfeynlgs62dh856zdk82s9e8549kf7rqhhlm37", + "extraData": "" + } + }, + { + "id": "shareledger1mh0cn2apfz444gkw03cjcjgfm7n8wu9mnydkw7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mh0cn2apfz444gkw03cjcjgfm7n8wu9mnydkw7", + "ownerAddress": "shareledger1mh0cn2apfz444gkw03cjcjgfm7n8wu9mnydkw7", + "extraData": "" + } + }, + { + "id": "shareledger1mhvp5epwgk2fdzpmpn6pkfcy66z4532ugr938u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mhvp5epwgk2fdzpmpn6pkfcy66z4532ugr938u", + "ownerAddress": "shareledger1mhvp5epwgk2fdzpmpn6pkfcy66z4532ugr938u", + "extraData": "" + } + }, + { + "id": "shareledger1mj358d5q6s585ea54u87jkly4dp9c3f452d0fm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mj358d5q6s585ea54u87jkly4dp9c3f452d0fm", + "ownerAddress": "shareledger1mj358d5q6s585ea54u87jkly4dp9c3f452d0fm", + "extraData": "" + } + }, + { + "id": "shareledger1mj39r0uaq3zp27pqxqg94ygmtajxl2jhchmdtd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mj39r0uaq3zp27pqxqg94ygmtajxl2jhchmdtd", + "ownerAddress": "shareledger1mj39r0uaq3zp27pqxqg94ygmtajxl2jhchmdtd", + "extraData": "" + } + }, + { + "id": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "ownerAddress": "shareledger1mjhue8dvcdpsezzkxwh646rem0ra9pvjrx36yg", + "extraData": "" + } + }, + { + "id": "shareledger1mkp96pljc4yysnggecmgdtlv2l3u5w0nuvjwej", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mkp96pljc4yysnggecmgdtlv2l3u5w0nuvjwej", + "ownerAddress": "shareledger1mkp96pljc4yysnggecmgdtlv2l3u5w0nuvjwej", + "extraData": "" + } + }, + { + "id": "shareledger1mlm898fqvcjg7rmfn4j2nm39knw8eea4kl8lws", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mlm898fqvcjg7rmfn4j2nm39knw8eea4kl8lws", + "ownerAddress": "shareledger1mlm898fqvcjg7rmfn4j2nm39knw8eea4kl8lws", + "extraData": "" + } + }, + { + "id": "shareledger1mlpj7munraczqzqcpxhm87scv4drexnhvdeztr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mlpj7munraczqzqcpxhm87scv4drexnhvdeztr", + "ownerAddress": "shareledger1mlpj7munraczqzqcpxhm87scv4drexnhvdeztr", + "extraData": "" + } + }, + { + "id": "shareledger1mn5vp36p28pyl2d6sv2t8qlrpt8022f0gl8acx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mn5vp36p28pyl2d6sv2t8qlrpt8022f0gl8acx", + "ownerAddress": "shareledger1mn5vp36p28pyl2d6sv2t8qlrpt8022f0gl8acx", + "extraData": "" + } + }, + { + "id": "shareledger1mnnc2jvgf2d0vzqwe2yuq7gqd3ccyv0z2qlu6n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mnnc2jvgf2d0vzqwe2yuq7gqd3ccyv0z2qlu6n", + "ownerAddress": "shareledger1mnnc2jvgf2d0vzqwe2yuq7gqd3ccyv0z2qlu6n", + "extraData": "" + } + }, + { + "id": "shareledger1mnpcwaj83sx2j3a0dn3jhw0e6czxxfyy2ys78f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mnpcwaj83sx2j3a0dn3jhw0e6czxxfyy2ys78f", + "ownerAddress": "shareledger1mnpcwaj83sx2j3a0dn3jhw0e6czxxfyy2ys78f", + "extraData": "" + } + }, + { + "id": "shareledger1mnrmrrtlm97xmk5xpl0ev8ked4mvakr3ncla5y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mnrmrrtlm97xmk5xpl0ev8ked4mvakr3ncla5y", + "ownerAddress": "shareledger1mnrmrrtlm97xmk5xpl0ev8ked4mvakr3ncla5y", + "extraData": "" + } + }, + { + "id": "shareledger1mnzwsuqkn7fgtwav4c57t6x2xp6u90xtfesy62", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mnzwsuqkn7fgtwav4c57t6x2xp6u90xtfesy62", + "ownerAddress": "shareledger1mnzwsuqkn7fgtwav4c57t6x2xp6u90xtfesy62", + "extraData": "" + } + }, + { + "id": "shareledger1mpmgpk8mwe3llng5v2j37r9wulx4x4r0mre2zq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mpmgpk8mwe3llng5v2j37r9wulx4x4r0mre2zq", + "ownerAddress": "shareledger1mpmgpk8mwe3llng5v2j37r9wulx4x4r0mre2zq", + "extraData": "" + } + }, + { + "id": "shareledger1mpznt8r7csgej7f2987c2wjxjqr3l2zf4tfxzs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mpznt8r7csgej7f2987c2wjxjqr3l2zf4tfxzs", + "ownerAddress": "shareledger1mpznt8r7csgej7f2987c2wjxjqr3l2zf4tfxzs", + "extraData": "" + } + }, + { + "id": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "ownerAddress": "shareledger1mr8mrdewssn6vzdq020vvd2x9s20fwfu30p26m", + "extraData": "" + } + }, + { + "id": "shareledger1mrzhzf0v9cz00rwgyxcdwrl6s7n7plgdur4z74", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mrzhzf0v9cz00rwgyxcdwrl6s7n7plgdur4z74", + "ownerAddress": "shareledger1mrzhzf0v9cz00rwgyxcdwrl6s7n7plgdur4z74", + "extraData": "" + } + }, + { + "id": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "ownerAddress": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "extraData": "" + } + }, + { + "id": "shareledger1mspukayt6gk9xzypcw9gf50gvpc9p5m4c6uvyv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mspukayt6gk9xzypcw9gf50gvpc9p5m4c6uvyv", + "ownerAddress": "shareledger1mspukayt6gk9xzypcw9gf50gvpc9p5m4c6uvyv", + "extraData": "" + } + }, + { + "id": "shareledger1mt3u56z8j2yhdqf8z8z7pazvvctsjllcl0fw2c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mt3u56z8j2yhdqf8z8z7pazvvctsjllcl0fw2c", + "ownerAddress": "shareledger1mt3u56z8j2yhdqf8z8z7pazvvctsjllcl0fw2c", + "extraData": "" + } + }, + { + "id": "shareledger1mtne6hfpyfnkljs5qtws5g83qfds0fr4ats48c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mtne6hfpyfnkljs5qtws5g83qfds0fr4ats48c", + "ownerAddress": "shareledger1mtne6hfpyfnkljs5qtws5g83qfds0fr4ats48c", + "extraData": "" + } + }, + { + "id": "shareledger1mu0me8kvwtp7ykqqec9efhj4tjww470dec0qmh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mu0me8kvwtp7ykqqec9efhj4tjww470dec0qmh", + "ownerAddress": "shareledger1mu0me8kvwtp7ykqqec9efhj4tjww470dec0qmh", + "extraData": "" + } + }, + { + "id": "shareledger1mu4s5vy7wnh7f7f8jzwz4emvz0sqgy6tsf9zjr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mu4s5vy7wnh7f7f8jzwz4emvz0sqgy6tsf9zjr", + "ownerAddress": "shareledger1mu4s5vy7wnh7f7f8jzwz4emvz0sqgy6tsf9zjr", + "extraData": "" + } + }, + { + "id": "shareledger1mum3cu5myg0nlngrhgpmhsm26v035d63q938rz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mum3cu5myg0nlngrhgpmhsm26v035d63q938rz", + "ownerAddress": "shareledger1mum3cu5myg0nlngrhgpmhsm26v035d63q938rz", + "extraData": "" + } + }, + { + "id": "shareledger1mw3y92pf45m8tpe7azx0xhdep92y4yazk6gzvu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mw3y92pf45m8tpe7azx0xhdep92y4yazk6gzvu", + "ownerAddress": "shareledger1mw3y92pf45m8tpe7azx0xhdep92y4yazk6gzvu", + "extraData": "" + } + }, + { + "id": "shareledger1mxd3l67cas4mu42mmedkay5npvlxvjx5lt6t8p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mxd3l67cas4mu42mmedkay5npvlxvjx5lt6t8p", + "ownerAddress": "shareledger1mxd3l67cas4mu42mmedkay5npvlxvjx5lt6t8p", + "extraData": "" + } + }, + { + "id": "shareledger1mxhm0kcnwq25kp3xpqrk3l55cm9gmw7p6hr8vp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mxhm0kcnwq25kp3xpqrk3l55cm9gmw7p6hr8vp", + "ownerAddress": "shareledger1mxhm0kcnwq25kp3xpqrk3l55cm9gmw7p6hr8vp", + "extraData": "" + } + }, + { + "id": "shareledger1mxu02qcp30n3mftfce2e3vgpkzmzkc9aeucn9y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mxu02qcp30n3mftfce2e3vgpkzmzkc9aeucn9y", + "ownerAddress": "shareledger1mxu02qcp30n3mftfce2e3vgpkzmzkc9aeucn9y", + "extraData": "" + } + }, + { + "id": "shareledger1myl2zhq8074upjxspmtdp8u97mcc2ht2w9qvjv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1myl2zhq8074upjxspmtdp8u97mcc2ht2w9qvjv", + "ownerAddress": "shareledger1myl2zhq8074upjxspmtdp8u97mcc2ht2w9qvjv", + "extraData": "" + } + }, + { + "id": "shareledger1mynu56ja343lce47x2m6rac6ew6k6jvqw6dpkl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mynu56ja343lce47x2m6rac6ew6k6jvqw6dpkl", + "ownerAddress": "shareledger1mynu56ja343lce47x2m6rac6ew6k6jvqw6dpkl", + "extraData": "" + } + }, + { + "id": "shareledger1mzsxz8qd38e8trxcxuck5xfldkv2ahnk9uw9xy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1mzsxz8qd38e8trxcxuck5xfldkv2ahnk9uw9xy", + "ownerAddress": "shareledger1mzsxz8qd38e8trxcxuck5xfldkv2ahnk9uw9xy", + "extraData": "" + } + }, + { + "id": "shareledger1n0amfc54q0vdfwzue3gyxlcveneguceu5hc77w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n0amfc54q0vdfwzue3gyxlcveneguceu5hc77w", + "ownerAddress": "shareledger1n0amfc54q0vdfwzue3gyxlcveneguceu5hc77w", + "extraData": "" + } + }, + { + "id": "shareledger1n2zgxzrwhwvvlacw2hq930u687ymllam7khde8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n2zgxzrwhwvvlacw2hq930u687ymllam7khde8", + "ownerAddress": "shareledger1n2zgxzrwhwvvlacw2hq930u687ymllam7khde8", + "extraData": "" + } + }, + { + "id": "shareledger1n3ge7ckq8nzq0jk6j7tgayusg5aelrutr83f2y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n3ge7ckq8nzq0jk6j7tgayusg5aelrutr83f2y", + "ownerAddress": "shareledger1n3ge7ckq8nzq0jk6j7tgayusg5aelrutr83f2y", + "extraData": "" + } + }, + { + "id": "shareledger1n3jvwqpagenl36pzampulpfvtc0kts85u83hq5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n3jvwqpagenl36pzampulpfvtc0kts85u83hq5", + "ownerAddress": "shareledger1n3jvwqpagenl36pzampulpfvtc0kts85u83hq5", + "extraData": "" + } + }, + { + "id": "shareledger1n5nuqyhzuz3jcyy5356vhe7mzk28y8xm70h5uh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n5nuqyhzuz3jcyy5356vhe7mzk28y8xm70h5uh", + "ownerAddress": "shareledger1n5nuqyhzuz3jcyy5356vhe7mzk28y8xm70h5uh", + "extraData": "" + } + }, + { + "id": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "ownerAddress": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "extraData": "" + } + }, + { + "id": "shareledger1n6zk5wkaq04k43nv3k8vwjy7puwpjateyukztk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n6zk5wkaq04k43nv3k8vwjy7puwpjateyukztk", + "ownerAddress": "shareledger1n6zk5wkaq04k43nv3k8vwjy7puwpjateyukztk", + "extraData": "" + } + }, + { + "id": "shareledger1n6zw5lkfndx2zvhgfl20s2larfla5fjrlpdgzm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n6zw5lkfndx2zvhgfl20s2larfla5fjrlpdgzm", + "ownerAddress": "shareledger1n6zw5lkfndx2zvhgfl20s2larfla5fjrlpdgzm", + "extraData": "" + } + }, + { + "id": "shareledger1n73lm8gcgq2s98vpcr48kjaerh3hrgk6agmw3m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n73lm8gcgq2s98vpcr48kjaerh3hrgk6agmw3m", + "ownerAddress": "shareledger1n73lm8gcgq2s98vpcr48kjaerh3hrgk6agmw3m", + "extraData": "" + } + }, + { + "id": "shareledger1n7pmad708ayaem789zxz7j4vhzukqpfmyt2vl7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n7pmad708ayaem789zxz7j4vhzukqpfmyt2vl7", + "ownerAddress": "shareledger1n7pmad708ayaem789zxz7j4vhzukqpfmyt2vl7", + "extraData": "" + } + }, + { + "id": "shareledger1n80mzqcxter7yvdltzkjwwkmc4t9ppjzjcuye9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n80mzqcxter7yvdltzkjwwkmc4t9ppjzjcuye9", + "ownerAddress": "shareledger1n80mzqcxter7yvdltzkjwwkmc4t9ppjzjcuye9", + "extraData": "" + } + }, + { + "id": "shareledger1n90pkmj7htp7q04hyzqgjp7yh3sfplrk0jsnaq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n90pkmj7htp7q04hyzqgjp7yh3sfplrk0jsnaq", + "ownerAddress": "shareledger1n90pkmj7htp7q04hyzqgjp7yh3sfplrk0jsnaq", + "extraData": "" + } + }, + { + "id": "shareledger1n9cf2zyufh8a02vuaunsgwgzptqyeqjx4q5zml", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1n9cf2zyufh8a02vuaunsgwgzptqyeqjx4q5zml", + "ownerAddress": "shareledger1n9cf2zyufh8a02vuaunsgwgzptqyeqjx4q5zml", + "extraData": "" + } + }, + { + "id": "shareledger1ncq3gc6fdcaj3k27v5v8kqjsqz9tyqqfp6ede6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ncq3gc6fdcaj3k27v5v8kqjsqz9tyqqfp6ede6", + "ownerAddress": "shareledger1ncq3gc6fdcaj3k27v5v8kqjsqz9tyqqfp6ede6", + "extraData": "" + } + }, + { + "id": "shareledger1nd0hrs2g50je27jr4z269u6c8a73kmv7ylhn72", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nd0hrs2g50je27jr4z269u6c8a73kmv7ylhn72", + "ownerAddress": "shareledger1nd0hrs2g50je27jr4z269u6c8a73kmv7ylhn72", + "extraData": "" + } + }, + { + "id": "shareledger1ndrxdpv24xukwz92rrey3dfvzf5ruxpdfct7s6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ndrxdpv24xukwz92rrey3dfvzf5ruxpdfct7s6", + "ownerAddress": "shareledger1ndrxdpv24xukwz92rrey3dfvzf5ruxpdfct7s6", + "extraData": "" + } + }, + { + "id": "shareledger1ndtr4re05htpkmuvlamtdygvxtvjd59hrjly7v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ndtr4re05htpkmuvlamtdygvxtvjd59hrjly7v", + "ownerAddress": "shareledger1ndtr4re05htpkmuvlamtdygvxtvjd59hrjly7v", + "extraData": "" + } + }, + { + "id": "shareledger1ne8uxjs55jzj8x075nq9gta66kserj9mqtzdfl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ne8uxjs55jzj8x075nq9gta66kserj9mqtzdfl", + "ownerAddress": "shareledger1ne8uxjs55jzj8x075nq9gta66kserj9mqtzdfl", + "extraData": "" + } + }, + { + "id": "shareledger1nemnjwh8mhxrn2zs6pkn9ea8tysmdy05fnzhxq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nemnjwh8mhxrn2zs6pkn9ea8tysmdy05fnzhxq", + "ownerAddress": "shareledger1nemnjwh8mhxrn2zs6pkn9ea8tysmdy05fnzhxq", + "extraData": "" + } + }, + { + "id": "shareledger1nfewvfpglycsnq8ue5wc22aguaevzuz8zvm4ac", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nfewvfpglycsnq8ue5wc22aguaevzuz8zvm4ac", + "ownerAddress": "shareledger1nfewvfpglycsnq8ue5wc22aguaevzuz8zvm4ac", + "extraData": "" + } + }, + { + "id": "shareledger1nftmmftwzts7a5q4jqwl5x2ad9n6rtxs7ulke8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nftmmftwzts7a5q4jqwl5x2ad9n6rtxs7ulke8", + "ownerAddress": "shareledger1nftmmftwzts7a5q4jqwl5x2ad9n6rtxs7ulke8", + "extraData": "" + } + }, + { + "id": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "ownerAddress": "shareledger1ng5k9ew8u47mu9kvmnfd4yj7tf92x2nwrzkq6f", + "extraData": "" + } + }, + { + "id": "shareledger1ngsmjza402wc9k2fdw28gfjkvwulcuu6kker79", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ngsmjza402wc9k2fdw28gfjkvwulcuu6kker79", + "ownerAddress": "shareledger1ngsmjza402wc9k2fdw28gfjkvwulcuu6kker79", + "extraData": "" + } + }, + { + "id": "shareledger1nh7kpnamggdaw72yx5ma3mfh0hpdmgpnexc0n9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nh7kpnamggdaw72yx5ma3mfh0hpdmgpnexc0n9", + "ownerAddress": "shareledger1nh7kpnamggdaw72yx5ma3mfh0hpdmgpnexc0n9", + "extraData": "" + } + }, + { + "id": "shareledger1njxa9vm2z8clhhv8qknky907k34mdzv06z23fl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1njxa9vm2z8clhhv8qknky907k34mdzv06z23fl", + "ownerAddress": "shareledger1njxa9vm2z8clhhv8qknky907k34mdzv06z23fl", + "extraData": "" + } + }, + { + "id": "shareledger1nk92hn0njeauqegmzhj53jrn9vjgs6k5tm8xwj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nk92hn0njeauqegmzhj53jrn9vjgs6k5tm8xwj", + "ownerAddress": "shareledger1nk92hn0njeauqegmzhj53jrn9vjgs6k5tm8xwj", + "extraData": "" + } + }, + { + "id": "shareledger1nkg0dfrvsm2w3nd8wrf3d5umsnexae0cyp33zg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nkg0dfrvsm2w3nd8wrf3d5umsnexae0cyp33zg", + "ownerAddress": "shareledger1nkg0dfrvsm2w3nd8wrf3d5umsnexae0cyp33zg", + "extraData": "" + } + }, + { + "id": "shareledger1nkrayqlaphxad4c8rs3a7e9h0kjywqrkvgkmek", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nkrayqlaphxad4c8rs3a7e9h0kjywqrkvgkmek", + "ownerAddress": "shareledger1nkrayqlaphxad4c8rs3a7e9h0kjywqrkvgkmek", + "extraData": "" + } + }, + { + "id": "shareledger1nl9e5qsff3gxkejehhj9q7fx2ns65ajqtjhem5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nl9e5qsff3gxkejehhj9q7fx2ns65ajqtjhem5", + "ownerAddress": "shareledger1nl9e5qsff3gxkejehhj9q7fx2ns65ajqtjhem5", + "extraData": "" + } + }, + { + "id": "shareledger1nlwp4san0q7ce8me0yktfyf3z87u9qrt0n4zq3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nlwp4san0q7ce8me0yktfyf3z87u9qrt0n4zq3", + "ownerAddress": "shareledger1nlwp4san0q7ce8me0yktfyf3z87u9qrt0n4zq3", + "extraData": "" + } + }, + { + "id": "shareledger1nndpq4lv73gjjnzxadlxp56ggjgds2rkajsxu4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nndpq4lv73gjjnzxadlxp56ggjgds2rkajsxu4", + "ownerAddress": "shareledger1nndpq4lv73gjjnzxadlxp56ggjgds2rkajsxu4", + "extraData": "" + } + }, + { + "id": "shareledger1nnzm0n8ew7fu0jj9l6vn7c9rzkdfnuw5ghty7e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nnzm0n8ew7fu0jj9l6vn7c9rzkdfnuw5ghty7e", + "ownerAddress": "shareledger1nnzm0n8ew7fu0jj9l6vn7c9rzkdfnuw5ghty7e", + "extraData": "" + } + }, + { + "id": "shareledger1np2p0c2c48l0e75w8vef4eu0u63y84jpvn35x2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1np2p0c2c48l0e75w8vef4eu0u63y84jpvn35x2", + "ownerAddress": "shareledger1np2p0c2c48l0e75w8vef4eu0u63y84jpvn35x2", + "extraData": "" + } + }, + { + "id": "shareledger1nplvvcu9w5x9zj50yj3lp3c80mvqkpm0r9kjp5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nplvvcu9w5x9zj50yj3lp3c80mvqkpm0r9kjp5", + "ownerAddress": "shareledger1nplvvcu9w5x9zj50yj3lp3c80mvqkpm0r9kjp5", + "extraData": "" + } + }, + { + "id": "shareledger1nqhff7qzn2njk2s0lwph2n3pasc7vdsu8v9akc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nqhff7qzn2njk2s0lwph2n3pasc7vdsu8v9akc", + "ownerAddress": "shareledger1nqhff7qzn2njk2s0lwph2n3pasc7vdsu8v9akc", + "extraData": "" + } + }, + { + "id": "shareledger1nr47asurn276egqeuaknagesr7e8ur3a9tzea7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nr47asurn276egqeuaknagesr7e8ur3a9tzea7", + "ownerAddress": "shareledger1nr47asurn276egqeuaknagesr7e8ur3a9tzea7", + "extraData": "" + } + }, + { + "id": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "ownerAddress": "shareledger1ns9rxgw8kzqt327urrzwmfxgdsmamy3l9vscm0", + "extraData": "" + } + }, + { + "id": "shareledger1nty769f0ulywtyqs02rgc3pc88nkhxdmemd50a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nty769f0ulywtyqs02rgc3pc88nkhxdmemd50a", + "ownerAddress": "shareledger1nty769f0ulywtyqs02rgc3pc88nkhxdmemd50a", + "extraData": "" + } + }, + { + "id": "shareledger1nuhl8a5e9hx8zr48j3hxqjs4kydgqfa3ndjczn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nuhl8a5e9hx8zr48j3hxqjs4kydgqfa3ndjczn", + "ownerAddress": "shareledger1nuhl8a5e9hx8zr48j3hxqjs4kydgqfa3ndjczn", + "extraData": "" + } + }, + { + "id": "shareledger1nus2r7z5qj56u2lyg69fczsmmwg447u9rym392", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nus2r7z5qj56u2lyg69fczsmmwg447u9rym392", + "ownerAddress": "shareledger1nus2r7z5qj56u2lyg69fczsmmwg447u9rym392", + "extraData": "" + } + }, + { + "id": "shareledger1nuzask250g0t2a0yh6kcmx5cjvzrhc587gk4q3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nuzask250g0t2a0yh6kcmx5cjvzrhc587gk4q3", + "ownerAddress": "shareledger1nuzask250g0t2a0yh6kcmx5cjvzrhc587gk4q3", + "extraData": "" + } + }, + { + "id": "shareledger1nvm8ujz75pxwtml3wr73l3zhc6nxvzlvw82ufz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nvm8ujz75pxwtml3wr73l3zhc6nxvzlvw82ufz", + "ownerAddress": "shareledger1nvm8ujz75pxwtml3wr73l3zhc6nxvzlvw82ufz", + "extraData": "" + } + }, + { + "id": "shareledger1nvx4n625djwdmznrgv33nt2g3mugadw622kptt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nvx4n625djwdmznrgv33nt2g3mugadw622kptt", + "ownerAddress": "shareledger1nvx4n625djwdmznrgv33nt2g3mugadw622kptt", + "extraData": "" + } + }, + { + "id": "shareledger1ny2s070zhrjxkuul7htr86clv94km06nccmkzg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ny2s070zhrjxkuul7htr86clv94km06nccmkzg", + "ownerAddress": "shareledger1ny2s070zhrjxkuul7htr86clv94km06nccmkzg", + "extraData": "" + } + }, + { + "id": "shareledger1ny2z2vjn6sk5czj6p7zsdq3u7vf0n25eqtv4pv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ny2z2vjn6sk5czj6p7zsdq3u7vf0n25eqtv4pv", + "ownerAddress": "shareledger1ny2z2vjn6sk5czj6p7zsdq3u7vf0n25eqtv4pv", + "extraData": "" + } + }, + { + "id": "shareledger1ny3ldsadrptqvyxsz8ke57ulpslpum837dxwyn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ny3ldsadrptqvyxsz8ke57ulpslpum837dxwyn", + "ownerAddress": "shareledger1ny3ldsadrptqvyxsz8ke57ulpslpum837dxwyn", + "extraData": "" + } + }, + { + "id": "shareledger1nymjpsu8j6nqd2heumqtm4hgjslx4euts2z2hw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nymjpsu8j6nqd2heumqtm4hgjslx4euts2z2hw", + "ownerAddress": "shareledger1nymjpsu8j6nqd2heumqtm4hgjslx4euts2z2hw", + "extraData": "" + } + }, + { + "id": "shareledger1nys7v2dhp5xspvakyhuuesqtgdl6plw6dmndtt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nys7v2dhp5xspvakyhuuesqtgdl6plw6dmndtt", + "ownerAddress": "shareledger1nys7v2dhp5xspvakyhuuesqtgdl6plw6dmndtt", + "extraData": "" + } + }, + { + "id": "shareledger1nyvuwwgpumqhm6pgy2ufya33zuy6g3yapqalrw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nyvuwwgpumqhm6pgy2ufya33zuy6g3yapqalrw", + "ownerAddress": "shareledger1nyvuwwgpumqhm6pgy2ufya33zuy6g3yapqalrw", + "extraData": "" + } + }, + { + "id": "shareledger1nze9y6jgd8ngcdvz0rgeq0974ed43shvgg0cjg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1nze9y6jgd8ngcdvz0rgeq0974ed43shvgg0cjg", + "ownerAddress": "shareledger1nze9y6jgd8ngcdvz0rgeq0974ed43shvgg0cjg", + "extraData": "" + } + }, + { + "id": "shareledger1p0advjf9tzl5qyv5vtwlrteuejgnt0pryf0gvk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p0advjf9tzl5qyv5vtwlrteuejgnt0pryf0gvk", + "ownerAddress": "shareledger1p0advjf9tzl5qyv5vtwlrteuejgnt0pryf0gvk", + "extraData": "" + } + }, + { + "id": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "ownerAddress": "shareledger1p0g6lqqdwqadf5ac9ryypt8khh2n6tfsjyek79", + "extraData": "" + } + }, + { + "id": "shareledger1p0v70g5zap4uuswhk0cuhmweps6cwnq9h0vcf0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p0v70g5zap4uuswhk0cuhmweps6cwnq9h0vcf0", + "ownerAddress": "shareledger1p0v70g5zap4uuswhk0cuhmweps6cwnq9h0vcf0", + "extraData": "" + } + }, + { + "id": "shareledger1p0wk3ay9sc2lceh07jrcc93zdavmtx77sqj346", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p0wk3ay9sc2lceh07jrcc93zdavmtx77sqj346", + "ownerAddress": "shareledger1p0wk3ay9sc2lceh07jrcc93zdavmtx77sqj346", + "extraData": "" + } + }, + { + "id": "shareledger1p2dhtjflaxc32nq8vkk8vt4w8emx2uhrcvcfjj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p2dhtjflaxc32nq8vkk8vt4w8emx2uhrcvcfjj", + "ownerAddress": "shareledger1p2dhtjflaxc32nq8vkk8vt4w8emx2uhrcvcfjj", + "extraData": "" + } + }, + { + "id": "shareledger1p3ag93hmhtcpp5750axnevlyxh4xdr33nsx6fd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p3ag93hmhtcpp5750axnevlyxh4xdr33nsx6fd", + "ownerAddress": "shareledger1p3ag93hmhtcpp5750axnevlyxh4xdr33nsx6fd", + "extraData": "" + } + }, + { + "id": "shareledger1p49lkxc6x0su8k72v096nxk9jts9tzsjr6emzh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p49lkxc6x0su8k72v096nxk9jts9tzsjr6emzh", + "ownerAddress": "shareledger1p49lkxc6x0su8k72v096nxk9jts9tzsjr6emzh", + "extraData": "" + } + }, + { + "id": "shareledger1p4lqkrtu8uuqx8qydqfpttzcxc9xjsf6ey94f3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p4lqkrtu8uuqx8qydqfpttzcxc9xjsf6ey94f3", + "ownerAddress": "shareledger1p4lqkrtu8uuqx8qydqfpttzcxc9xjsf6ey94f3", + "extraData": "" + } + }, + { + "id": "shareledger1p7c0g6autm7qkay7s6rzusg9d7yadlanft5xzz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p7c0g6autm7qkay7s6rzusg9d7yadlanft5xzz", + "ownerAddress": "shareledger1p7c0g6autm7qkay7s6rzusg9d7yadlanft5xzz", + "extraData": "" + } + }, + { + "id": "shareledger1p7c5phzf5e8pxlgdfekydlc99ayq9q5eh2cntt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p7c5phzf5e8pxlgdfekydlc99ayq9q5eh2cntt", + "ownerAddress": "shareledger1p7c5phzf5e8pxlgdfekydlc99ayq9q5eh2cntt", + "extraData": "" + } + }, + { + "id": "shareledger1p7j8774m4zxczfknnf543w56lsld3flpdzdn55", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p7j8774m4zxczfknnf543w56lsld3flpdzdn55", + "ownerAddress": "shareledger1p7j8774m4zxczfknnf543w56lsld3flpdzdn55", + "extraData": "" + } + }, + { + "id": "shareledger1p7l679g5xf2p65zacw4g5dkyc2heg05f5ur55t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p7l679g5xf2p65zacw4g5dkyc2heg05f5ur55t", + "ownerAddress": "shareledger1p7l679g5xf2p65zacw4g5dkyc2heg05f5ur55t", + "extraData": "" + } + }, + { + "id": "shareledger1p7umhuwtt2m9xanj698kvcey4a5j3yq9w5vxt3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p7umhuwtt2m9xanj698kvcey4a5j3yq9w5vxt3", + "ownerAddress": "shareledger1p7umhuwtt2m9xanj698kvcey4a5j3yq9w5vxt3", + "extraData": "" + } + }, + { + "id": "shareledger1p87ty6gdmdxz7lkaht4wvvhhj9jn88k0l6syzy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p87ty6gdmdxz7lkaht4wvvhhj9jn88k0l6syzy", + "ownerAddress": "shareledger1p87ty6gdmdxz7lkaht4wvvhhj9jn88k0l6syzy", + "extraData": "" + } + }, + { + "id": "shareledger1p8actw8de6nyhegkcymrmrrg0ypu6ylmummphg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p8actw8de6nyhegkcymrmrrg0ypu6ylmummphg", + "ownerAddress": "shareledger1p8actw8de6nyhegkcymrmrrg0ypu6ylmummphg", + "extraData": "" + } + }, + { + "id": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "ownerAddress": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "extraData": "" + } + }, + { + "id": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "ownerAddress": "shareledger1p93e5hldxq6470zce9vthp4fp3gdwzyh3kat53", + "extraData": "" + } + }, + { + "id": "shareledger1p9um2j5l2rvu2k58me0x373jncqt80t3vtf55w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1p9um2j5l2rvu2k58me0x373jncqt80t3vtf55w", + "ownerAddress": "shareledger1p9um2j5l2rvu2k58me0x373jncqt80t3vtf55w", + "extraData": "" + } + }, + { + "id": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "ownerAddress": "shareledger1pa7lw7x8fwvwp859aw7kz7dcn238lrcjzyrv2r", + "extraData": "" + } + }, + { + "id": "shareledger1padl2xj53ac3s4c29667yjxj0ajcpf5lc7f9z6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1padl2xj53ac3s4c29667yjxj0ajcpf5lc7f9z6", + "ownerAddress": "shareledger1padl2xj53ac3s4c29667yjxj0ajcpf5lc7f9z6", + "extraData": "" + } + }, + { + "id": "shareledger1patnsq9puuv8zfz5l3q2ygytdm9r2u6dfed9ug", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1patnsq9puuv8zfz5l3q2ygytdm9r2u6dfed9ug", + "ownerAddress": "shareledger1patnsq9puuv8zfz5l3q2ygytdm9r2u6dfed9ug", + "extraData": "" + } + }, + { + "id": "shareledger1pazv6jptllrrntlkyerpazjqgtml9nfm7whc5j", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pazv6jptllrrntlkyerpazjqgtml9nfm7whc5j", + "ownerAddress": "shareledger1pazv6jptllrrntlkyerpazjqgtml9nfm7whc5j", + "extraData": "" + } + }, + { + "id": "shareledger1pcap9llfuw0lmrjux98lz0nrp0tfa20zl8pwf9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pcap9llfuw0lmrjux98lz0nrp0tfa20zl8pwf9", + "ownerAddress": "shareledger1pcap9llfuw0lmrjux98lz0nrp0tfa20zl8pwf9", + "extraData": "" + } + }, + { + "id": "shareledger1pd227ffm3fza8y44pvw684jsvsuscdcq58y8px", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pd227ffm3fza8y44pvw684jsvsuscdcq58y8px", + "ownerAddress": "shareledger1pd227ffm3fza8y44pvw684jsvsuscdcq58y8px", + "extraData": "" + } + }, + { + "id": "shareledger1pd4rlrgxv0052ztzqn47zdjjv57weesseynjj9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pd4rlrgxv0052ztzqn47zdjjv57weesseynjj9", + "ownerAddress": "shareledger1pd4rlrgxv0052ztzqn47zdjjv57weesseynjj9", + "extraData": "" + } + }, + { + "id": "shareledger1pe6funzzsmu62nmht7hq6wgd3qzdzk9shx2all", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pe6funzzsmu62nmht7hq6wgd3qzdzk9shx2all", + "ownerAddress": "shareledger1pe6funzzsmu62nmht7hq6wgd3qzdzk9shx2all", + "extraData": "" + } + }, + { + "id": "shareledger1pe8gdq4nh8sc3yfgx4aq7x3jd7lfzhflcl4nqy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pe8gdq4nh8sc3yfgx4aq7x3jd7lfzhflcl4nqy", + "ownerAddress": "shareledger1pe8gdq4nh8sc3yfgx4aq7x3jd7lfzhflcl4nqy", + "extraData": "" + } + }, + { + "id": "shareledger1pekxavzl8c2ucxe3l6vnsxnnpew4l8cc3jjh62", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pekxavzl8c2ucxe3l6vnsxnnpew4l8cc3jjh62", + "ownerAddress": "shareledger1pekxavzl8c2ucxe3l6vnsxnnpew4l8cc3jjh62", + "extraData": "" + } + }, + { + "id": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "ownerAddress": "shareledger1penee0x0hn8vv9ujglvmpngxqma9k6htsknskv", + "extraData": "" + } + }, + { + "id": "shareledger1peyuhx4r23gsuewp5u866scytq28y7mnuymlkt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1peyuhx4r23gsuewp5u866scytq28y7mnuymlkt", + "ownerAddress": "shareledger1peyuhx4r23gsuewp5u866scytq28y7mnuymlkt", + "extraData": "" + } + }, + { + "id": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "ownerAddress": "shareledger1pff3tmngj3ljmrdhsv0rrl0xtmp3xtj3g0je43", + "extraData": "" + } + }, + { + "id": "shareledger1pfhjglam9smh0ywglht6npsk4e4sv5zgejdy4f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pfhjglam9smh0ywglht6npsk4e4sv5zgejdy4f", + "ownerAddress": "shareledger1pfhjglam9smh0ywglht6npsk4e4sv5zgejdy4f", + "extraData": "" + } + }, + { + "id": "shareledger1pgskzrhtcny5ns67pamk3e63s588uxgjpvuefj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pgskzrhtcny5ns67pamk3e63s588uxgjpvuefj", + "ownerAddress": "shareledger1pgskzrhtcny5ns67pamk3e63s588uxgjpvuefj", + "extraData": "" + } + }, + { + "id": "shareledger1pha0z9urag4zm8vpxxrhq6u9q92fm7kgjx0lrv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pha0z9urag4zm8vpxxrhq6u9q92fm7kgjx0lrv", + "ownerAddress": "shareledger1pha0z9urag4zm8vpxxrhq6u9q92fm7kgjx0lrv", + "extraData": "" + } + }, + { + "id": "shareledger1phj3crvy8c8ztgn2zj2xd466s6xn5sawfnh6ql", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1phj3crvy8c8ztgn2zj2xd466s6xn5sawfnh6ql", + "ownerAddress": "shareledger1phj3crvy8c8ztgn2zj2xd466s6xn5sawfnh6ql", + "extraData": "" + } + }, + { + "id": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "ownerAddress": "shareledger1pj6q29hrzttyjhwak6xgw9gntxqsaklxfdk4hu", + "extraData": "" + } + }, + { + "id": "shareledger1pjllxlnudvg8kryu4ph0lkm4qpfkyrj52kmsax", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pjllxlnudvg8kryu4ph0lkm4qpfkyrj52kmsax", + "ownerAddress": "shareledger1pjllxlnudvg8kryu4ph0lkm4qpfkyrj52kmsax", + "extraData": "" + } + }, + { + "id": "shareledger1pkfe2cz9euuqycesxdtzzx9eg9y3g9rdm95np5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pkfe2cz9euuqycesxdtzzx9eg9y3g9rdm95np5", + "ownerAddress": "shareledger1pkfe2cz9euuqycesxdtzzx9eg9y3g9rdm95np5", + "extraData": "" + } + }, + { + "id": "shareledger1plufz9g6dxzfke49qpv5l9t7q0x6ewfuf90shr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1plufz9g6dxzfke49qpv5l9t7q0x6ewfuf90shr", + "ownerAddress": "shareledger1plufz9g6dxzfke49qpv5l9t7q0x6ewfuf90shr", + "extraData": "" + } + }, + { + "id": "shareledger1pma6v6mp0ju0l7s7lcud92lt4ayatw9z5arpk4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pma6v6mp0ju0l7s7lcud92lt4ayatw9z5arpk4", + "ownerAddress": "shareledger1pma6v6mp0ju0l7s7lcud92lt4ayatw9z5arpk4", + "extraData": "" + } + }, + { + "id": "shareledger1pmw5s648tu5wlnenn2l0plfvj9hjkj3kv6dtn7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pmw5s648tu5wlnenn2l0plfvj9hjkj3kv6dtn7", + "ownerAddress": "shareledger1pmw5s648tu5wlnenn2l0plfvj9hjkj3kv6dtn7", + "extraData": "" + } + }, + { + "id": "shareledger1pnuny5qht6jv408sk43xm5p6cncevtvj8txkdm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pnuny5qht6jv408sk43xm5p6cncevtvj8txkdm", + "ownerAddress": "shareledger1pnuny5qht6jv408sk43xm5p6cncevtvj8txkdm", + "extraData": "" + } + }, + { + "id": "shareledger1pplyjeqq7hfg8a2snyw85ydsph5svu2vq45tkq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pplyjeqq7hfg8a2snyw85ydsph5svu2vq45tkq", + "ownerAddress": "shareledger1pplyjeqq7hfg8a2snyw85ydsph5svu2vq45tkq", + "extraData": "" + } + }, + { + "id": "shareledger1ppru6xdvem3yfsyz87v0zwwe6rhw0u8hqkqm7x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ppru6xdvem3yfsyz87v0zwwe6rhw0u8hqkqm7x", + "ownerAddress": "shareledger1ppru6xdvem3yfsyz87v0zwwe6rhw0u8hqkqm7x", + "extraData": "" + } + }, + { + "id": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "ownerAddress": "shareledger1ppv6j8rg36vpxa503rglu8qm6e946jlvh9hte4", + "extraData": "" + } + }, + { + "id": "shareledger1pq27vlk2h750k2k4xzn4wzmqwwgua47lt4j77f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pq27vlk2h750k2k4xzn4wzmqwwgua47lt4j77f", + "ownerAddress": "shareledger1pq27vlk2h750k2k4xzn4wzmqwwgua47lt4j77f", + "extraData": "" + } + }, + { + "id": "shareledger1pqhqkvxjem6h0hr8dzjrjxhexrlmp7rvr9uml2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pqhqkvxjem6h0hr8dzjrjxhexrlmp7rvr9uml2", + "ownerAddress": "shareledger1pqhqkvxjem6h0hr8dzjrjxhexrlmp7rvr9uml2", + "extraData": "" + } + }, + { + "id": "shareledger1prltyzgdfn4vnk5cmtx723ndll98eu3z9u2uf6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1prltyzgdfn4vnk5cmtx723ndll98eu3z9u2uf6", + "ownerAddress": "shareledger1prltyzgdfn4vnk5cmtx723ndll98eu3z9u2uf6", + "extraData": "" + } + }, + { + "id": "shareledger1pscpyetxzlr65gppku5ujg73tnmxz25kwd6mhq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pscpyetxzlr65gppku5ujg73tnmxz25kwd6mhq", + "ownerAddress": "shareledger1pscpyetxzlr65gppku5ujg73tnmxz25kwd6mhq", + "extraData": "" + } + }, + { + "id": "shareledger1psjc8j5a9q8vvch6w6php6vm4yhm3s6kpft2hr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1psjc8j5a9q8vvch6w6php6vm4yhm3s6kpft2hr", + "ownerAddress": "shareledger1psjc8j5a9q8vvch6w6php6vm4yhm3s6kpft2hr", + "extraData": "" + } + }, + { + "id": "shareledger1psqd84xatqzd6uu3e4jwh02hqtyg63hjdtg4q3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1psqd84xatqzd6uu3e4jwh02hqtyg63hjdtg4q3", + "ownerAddress": "shareledger1psqd84xatqzd6uu3e4jwh02hqtyg63hjdtg4q3", + "extraData": "" + } + }, + { + "id": "shareledger1psseh32jxj3l0na9pytxs8kult05sw9qpsr38t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1psseh32jxj3l0na9pytxs8kult05sw9qpsr38t", + "ownerAddress": "shareledger1psseh32jxj3l0na9pytxs8kult05sw9qpsr38t", + "extraData": "" + } + }, + { + "id": "shareledger1ptm0hw2v6wkqwkxfaqt6gquxs8d6vhltxmhe66", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ptm0hw2v6wkqwkxfaqt6gquxs8d6vhltxmhe66", + "ownerAddress": "shareledger1ptm0hw2v6wkqwkxfaqt6gquxs8d6vhltxmhe66", + "extraData": "" + } + }, + { + "id": "shareledger1pu648fkvp29d6t5uktj6mjm98zw8anvn9ke6px", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pu648fkvp29d6t5uktj6mjm98zw8anvn9ke6px", + "ownerAddress": "shareledger1pu648fkvp29d6t5uktj6mjm98zw8anvn9ke6px", + "extraData": "" + } + }, + { + "id": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "ownerAddress": "shareledger1pu86qkc3gvd9ytclk3p093p24r0xwx3rq0gy47", + "extraData": "" + } + }, + { + "id": "shareledger1pvmxa90lgdjz2zqj8ggxwqq2arvqew2rnujd89", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pvmxa90lgdjz2zqj8ggxwqq2arvqew2rnujd89", + "ownerAddress": "shareledger1pvmxa90lgdjz2zqj8ggxwqq2arvqew2rnujd89", + "extraData": "" + } + }, + { + "id": "shareledger1pxelstptj2vqz9gv2yryj26grg2uuju08dsg4r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pxelstptj2vqz9gv2yryj26grg2uuju08dsg4r", + "ownerAddress": "shareledger1pxelstptj2vqz9gv2yryj26grg2uuju08dsg4r", + "extraData": "" + } + }, + { + "id": "shareledger1pxvdw9yz76zup5p49k6wgw8uvg9zj6t04k4zpq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pxvdw9yz76zup5p49k6wgw8uvg9zj6t04k4zpq", + "ownerAddress": "shareledger1pxvdw9yz76zup5p49k6wgw8uvg9zj6t04k4zpq", + "extraData": "" + } + }, + { + "id": "shareledger1py2fy972f2jc3q8l6388473qcl4fv8k5nt2vep", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1py2fy972f2jc3q8l6388473qcl4fv8k5nt2vep", + "ownerAddress": "shareledger1py2fy972f2jc3q8l6388473qcl4fv8k5nt2vep", + "extraData": "" + } + }, + { + "id": "shareledger1pyqjzcaf667yj3j7mkzew53xkhsvl2ra6cgmmq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1pyqjzcaf667yj3j7mkzew53xkhsvl2ra6cgmmq", + "ownerAddress": "shareledger1pyqjzcaf667yj3j7mkzew53xkhsvl2ra6cgmmq", + "extraData": "" + } + }, + { + "id": "shareledger1q2nanj736taryf9u5056wsstv6ys3s9gym2hrj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q2nanj736taryf9u5056wsstv6ys3s9gym2hrj", + "ownerAddress": "shareledger1q2nanj736taryf9u5056wsstv6ys3s9gym2hrj", + "extraData": "" + } + }, + { + "id": "shareledger1q3gdav3y9s83wdgwra4862tjqgryjnl0rcjxuq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q3gdav3y9s83wdgwra4862tjqgryjnl0rcjxuq", + "ownerAddress": "shareledger1q3gdav3y9s83wdgwra4862tjqgryjnl0rcjxuq", + "extraData": "" + } + }, + { + "id": "shareledger1q49ulv0yjge6s5klxn7kwqsqvlpqku7wkkse34", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q49ulv0yjge6s5klxn7kwqsqvlpqku7wkkse34", + "ownerAddress": "shareledger1q49ulv0yjge6s5klxn7kwqsqvlpqku7wkkse34", + "extraData": "" + } + }, + { + "id": "shareledger1q7da6cfx69wgp867ucd49drp3qr2p3hjetyesa", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q7da6cfx69wgp867ucd49drp3qr2p3hjetyesa", + "ownerAddress": "shareledger1q7da6cfx69wgp867ucd49drp3qr2p3hjetyesa", + "extraData": "" + } + }, + { + "id": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "ownerAddress": "shareledger1q84ft8zn9lvd0lk22s4e8r0c2zcync5hga97w9", + "extraData": "" + } + }, + { + "id": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "ownerAddress": "shareledger1q86wp38ctez52h2n0vxarvdu664wvdmrqkz6rr", + "extraData": "" + } + }, + { + "id": "shareledger1q89j7n9t5w42hsrmfqwa02m4zvsnlrmykkdpcy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q89j7n9t5w42hsrmfqwa02m4zvsnlrmykkdpcy", + "ownerAddress": "shareledger1q89j7n9t5w42hsrmfqwa02m4zvsnlrmykkdpcy", + "extraData": "" + } + }, + { + "id": "shareledger1q8lk37fhkctclqukzgfqymnst5s2slgd9c8zm5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q8lk37fhkctclqukzgfqymnst5s2slgd9c8zm5", + "ownerAddress": "shareledger1q8lk37fhkctclqukzgfqymnst5s2slgd9c8zm5", + "extraData": "" + } + }, + { + "id": "shareledger1q9pdnl67an4uly80gg0r6khj5feem8vvps5zgx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q9pdnl67an4uly80gg0r6khj5feem8vvps5zgx", + "ownerAddress": "shareledger1q9pdnl67an4uly80gg0r6khj5feem8vvps5zgx", + "extraData": "" + } + }, + { + "id": "shareledger1q9qrx5r5c4sw83rstp2gp2pzny2l3n5fgzn2as", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q9qrx5r5c4sw83rstp2gp2pzny2l3n5fgzn2as", + "ownerAddress": "shareledger1q9qrx5r5c4sw83rstp2gp2pzny2l3n5fgzn2as", + "extraData": "" + } + }, + { + "id": "shareledger1q9rnn9eegnvvkrjkgk5swftmexr4950pjhlu20", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1q9rnn9eegnvvkrjkgk5swftmexr4950pjhlu20", + "ownerAddress": "shareledger1q9rnn9eegnvvkrjkgk5swftmexr4950pjhlu20", + "extraData": "" + } + }, + { + "id": "shareledger1qa754x52l7zdgau9whfxly2x7nx5ppeua9438t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qa754x52l7zdgau9whfxly2x7nx5ppeua9438t", + "ownerAddress": "shareledger1qa754x52l7zdgau9whfxly2x7nx5ppeua9438t", + "extraData": "" + } + }, + { + "id": "shareledger1qalqm8ma5sn5yhe3uejdzlll2ysu4sevx905pu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qalqm8ma5sn5yhe3uejdzlll2ysu4sevx905pu", + "ownerAddress": "shareledger1qalqm8ma5sn5yhe3uejdzlll2ysu4sevx905pu", + "extraData": "" + } + }, + { + "id": "shareledger1qasa3dkejam68v4ptyhvps4turynyp8nvm4rtu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qasa3dkejam68v4ptyhvps4turynyp8nvm4rtu", + "ownerAddress": "shareledger1qasa3dkejam68v4ptyhvps4turynyp8nvm4rtu", + "extraData": "" + } + }, + { + "id": "shareledger1qc7y3q7qv4pfra3p6rygkuau7ska8ncgcdac27", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qc7y3q7qv4pfra3p6rygkuau7ska8ncgcdac27", + "ownerAddress": "shareledger1qc7y3q7qv4pfra3p6rygkuau7ska8ncgcdac27", + "extraData": "" + } + }, + { + "id": "shareledger1qdvlktaax8y3svm895hq9mjz8udnc6yghz36ph", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qdvlktaax8y3svm895hq9mjz8udnc6yghz36ph", + "ownerAddress": "shareledger1qdvlktaax8y3svm895hq9mjz8udnc6yghz36ph", + "extraData": "" + } + }, + { + "id": "shareledger1qetmjxrxn6yg9k7tgzmzug9tgkyu5274kxver2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qetmjxrxn6yg9k7tgzmzug9tgkyu5274kxver2", + "ownerAddress": "shareledger1qetmjxrxn6yg9k7tgzmzug9tgkyu5274kxver2", + "extraData": "" + } + }, + { + "id": "shareledger1qfeuxzwtj3t0k7acycx8w5ka87hr3dchc8l47m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qfeuxzwtj3t0k7acycx8w5ka87hr3dchc8l47m", + "ownerAddress": "shareledger1qfeuxzwtj3t0k7acycx8w5ka87hr3dchc8l47m", + "extraData": "" + } + }, + { + "id": "shareledger1qg85xng7yk4em5tq5wvs4a4l6xrk9vrzzxgmng", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qg85xng7yk4em5tq5wvs4a4l6xrk9vrzzxgmng", + "ownerAddress": "shareledger1qg85xng7yk4em5tq5wvs4a4l6xrk9vrzzxgmng", + "extraData": "" + } + }, + { + "id": "shareledger1qj88r8la3xefl274htrltjje0vk3e9yrdmdw3s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qj88r8la3xefl274htrltjje0vk3e9yrdmdw3s", + "ownerAddress": "shareledger1qj88r8la3xefl274htrltjje0vk3e9yrdmdw3s", + "extraData": "" + } + }, + { + "id": "shareledger1qjzed4tdcehpg5ep0kxw5atytafdqtyga93ldr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qjzed4tdcehpg5ep0kxw5atytafdqtyga93ldr", + "ownerAddress": "shareledger1qjzed4tdcehpg5ep0kxw5atytafdqtyga93ldr", + "extraData": "" + } + }, + { + "id": "shareledger1qks6p2z7p4vx5h04qkuffk0l8ryqtdx7vz0v7y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qks6p2z7p4vx5h04qkuffk0l8ryqtdx7vz0v7y", + "ownerAddress": "shareledger1qks6p2z7p4vx5h04qkuffk0l8ryqtdx7vz0v7y", + "extraData": "" + } + }, + { + "id": "shareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "ownerAddress": "shareledger1ql25qtc3eqdrug5xs8s0hkzqc9y9tg74wr2gfd", + "extraData": "" + } + }, + { + "id": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "ownerAddress": "shareledger1qlj6np8mmfvv0udgpn9sfxkky3sayryss6d4ru", + "extraData": "" + } + }, + { + "id": "shareledger1qlpxqwkxsaanevqfljygayqm5p2qhpvmn5y6x0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qlpxqwkxsaanevqfljygayqm5p2qhpvmn5y6x0", + "ownerAddress": "shareledger1qlpxqwkxsaanevqfljygayqm5p2qhpvmn5y6x0", + "extraData": "" + } + }, + { + "id": "shareledger1qnz0lmesagmwdxzr3f306nvn7s57qmyj8fe4r0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qnz0lmesagmwdxzr3f306nvn7s57qmyj8fe4r0", + "ownerAddress": "shareledger1qnz0lmesagmwdxzr3f306nvn7s57qmyj8fe4r0", + "extraData": "" + } + }, + { + "id": "shareledger1qpmyaqczlk4adw5lk0spjxd746mda3vxukyhht", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qpmyaqczlk4adw5lk0spjxd746mda3vxukyhht", + "ownerAddress": "shareledger1qpmyaqczlk4adw5lk0spjxd746mda3vxukyhht", + "extraData": "" + } + }, + { + "id": "shareledger1qq5d78wkt2m0wv0jgy26e3y6cvvdmlng6ys0sk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qq5d78wkt2m0wv0jgy26e3y6cvvdmlng6ys0sk", + "ownerAddress": "shareledger1qq5d78wkt2m0wv0jgy26e3y6cvvdmlng6ys0sk", + "extraData": "" + } + }, + { + "id": "shareledger1qrdqm2ee227taaftdr99rayyt84cqc8y2f34l6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qrdqm2ee227taaftdr99rayyt84cqc8y2f34l6", + "ownerAddress": "shareledger1qrdqm2ee227taaftdr99rayyt84cqc8y2f34l6", + "extraData": "" + } + }, + { + "id": "shareledger1qrl03degf5ccprgnvsy58swhxrv36du5794gsr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qrl03degf5ccprgnvsy58swhxrv36du5794gsr", + "ownerAddress": "shareledger1qrl03degf5ccprgnvsy58swhxrv36du5794gsr", + "extraData": "" + } + }, + { + "id": "shareledger1qrssj96ysxtysqsftysey8jddpy5vrr3a32x3t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qrssj96ysxtysqsftysey8jddpy5vrr3a32x3t", + "ownerAddress": "shareledger1qrssj96ysxtysqsftysey8jddpy5vrr3a32x3t", + "extraData": "" + } + }, + { + "id": "shareledger1qs6pe80n2fjeg4r49cc7p2j8llcm8u04ve06vw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qs6pe80n2fjeg4r49cc7p2j8llcm8u04ve06vw", + "ownerAddress": "shareledger1qs6pe80n2fjeg4r49cc7p2j8llcm8u04ve06vw", + "extraData": "" + } + }, + { + "id": "shareledger1qseg0xrvk6ksc8dvafwt3y88eznasy8ewlpmun", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qseg0xrvk6ksc8dvafwt3y88eznasy8ewlpmun", + "ownerAddress": "shareledger1qseg0xrvk6ksc8dvafwt3y88eznasy8ewlpmun", + "extraData": "" + } + }, + { + "id": "shareledger1qsfhza2zy0m72w9xfjpxmc0hney0sd24n2s7k7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qsfhza2zy0m72w9xfjpxmc0hney0sd24n2s7k7", + "ownerAddress": "shareledger1qsfhza2zy0m72w9xfjpxmc0hney0sd24n2s7k7", + "extraData": "" + } + }, + { + "id": "shareledger1qssnku7hxynytg44uvk645qmeq2677e22gllcs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qssnku7hxynytg44uvk645qmeq2677e22gllcs", + "ownerAddress": "shareledger1qssnku7hxynytg44uvk645qmeq2677e22gllcs", + "extraData": "" + } + }, + { + "id": "shareledger1qtk69pgtndr2t7d05evlu3p8uzmj6p80ehwar9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qtk69pgtndr2t7d05evlu3p8uzmj6p80ehwar9", + "ownerAddress": "shareledger1qtk69pgtndr2t7d05evlu3p8uzmj6p80ehwar9", + "extraData": "" + } + }, + { + "id": "shareledger1qu4jac8j6vsc86rvzdwjqqjqlkrgqlyc37uapj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qu4jac8j6vsc86rvzdwjqqjqlkrgqlyc37uapj", + "ownerAddress": "shareledger1qu4jac8j6vsc86rvzdwjqqjqlkrgqlyc37uapj", + "extraData": "" + } + }, + { + "id": "shareledger1qv02zf25yclmfkgcwcmr5sgptekhyt025zxxw4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qv02zf25yclmfkgcwcmr5sgptekhyt025zxxw4", + "ownerAddress": "shareledger1qv02zf25yclmfkgcwcmr5sgptekhyt025zxxw4", + "extraData": "" + } + }, + { + "id": "shareledger1qv7jwf0j0s5kttp3e0vvu722nhagw7h05e4jg9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qv7jwf0j0s5kttp3e0vvu722nhagw7h05e4jg9", + "ownerAddress": "shareledger1qv7jwf0j0s5kttp3e0vvu722nhagw7h05e4jg9", + "extraData": "" + } + }, + { + "id": "shareledger1qwk8h6g3tj45re2xk3n39mdrfwnjjjkah03pf8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qwk8h6g3tj45re2xk3n39mdrfwnjjjkah03pf8", + "ownerAddress": "shareledger1qwk8h6g3tj45re2xk3n39mdrfwnjjjkah03pf8", + "extraData": "" + } + }, + { + "id": "shareledger1qwncgugt7tzak9a4shkqqt8tsrdzfmtjurc0fw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qwncgugt7tzak9a4shkqqt8tsrdzfmtjurc0fw", + "ownerAddress": "shareledger1qwncgugt7tzak9a4shkqqt8tsrdzfmtjurc0fw", + "extraData": "" + } + }, + { + "id": "shareledger1qwrmh75vlrtt747xtdf4z0c76qjv66kat0kl0w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qwrmh75vlrtt747xtdf4z0c76qjv66kat0kl0w", + "ownerAddress": "shareledger1qwrmh75vlrtt747xtdf4z0c76qjv66kat0kl0w", + "extraData": "" + } + }, + { + "id": "shareledger1qwz4gja33t5yeml5a0er7ejhyaqn0z8txvtcdl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qwz4gja33t5yeml5a0er7ejhyaqn0z8txvtcdl", + "ownerAddress": "shareledger1qwz4gja33t5yeml5a0er7ejhyaqn0z8txvtcdl", + "extraData": "" + } + }, + { + "id": "shareledger1qycnthw9n2gm5235l0qup7v9fqqeatwwpcpyar", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qycnthw9n2gm5235l0qup7v9fqqeatwwpcpyar", + "ownerAddress": "shareledger1qycnthw9n2gm5235l0qup7v9fqqeatwwpcpyar", + "extraData": "" + } + }, + { + "id": "shareledger1qyf64hl6rwwsgxq5t9dd63qjf7lucrvfkl5k2k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qyf64hl6rwwsgxq5t9dd63qjf7lucrvfkl5k2k", + "ownerAddress": "shareledger1qyf64hl6rwwsgxq5t9dd63qjf7lucrvfkl5k2k", + "extraData": "" + } + }, + { + "id": "shareledger1qzef39kyf8ryplrz4nj7qcst796jyw820ru9ur", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qzef39kyf8ryplrz4nj7qcst796jyw820ru9ur", + "ownerAddress": "shareledger1qzef39kyf8ryplrz4nj7qcst796jyw820ru9ur", + "extraData": "" + } + }, + { + "id": "shareledger1qzr6ggfa4p264cnpdy4st822e68rd6dtf4ag7s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1qzr6ggfa4p264cnpdy4st822e68rd6dtf4ag7s", + "ownerAddress": "shareledger1qzr6ggfa4p264cnpdy4st822e68rd6dtf4ag7s", + "extraData": "" + } + }, + { + "id": "shareledger1r03rl6e7x76sc07546n90078lhtshpmcqh6ssw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r03rl6e7x76sc07546n90078lhtshpmcqh6ssw", + "ownerAddress": "shareledger1r03rl6e7x76sc07546n90078lhtshpmcqh6ssw", + "extraData": "" + } + }, + { + "id": "shareledger1r0h6qfpzn9h5s3dkc6tnhuhm2dyq0u8xs957xk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r0h6qfpzn9h5s3dkc6tnhuhm2dyq0u8xs957xk", + "ownerAddress": "shareledger1r0h6qfpzn9h5s3dkc6tnhuhm2dyq0u8xs957xk", + "extraData": "" + } + }, + { + "id": "shareledger1r0qruwwah86fse65gjaxuwj893m044t3ykcm4t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r0qruwwah86fse65gjaxuwj893m044t3ykcm4t", + "ownerAddress": "shareledger1r0qruwwah86fse65gjaxuwj893m044t3ykcm4t", + "extraData": "" + } + }, + { + "id": "shareledger1r2aj9duxyk2wk9jfl9udeaefek0rx62zywklcp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r2aj9duxyk2wk9jfl9udeaefek0rx62zywklcp", + "ownerAddress": "shareledger1r2aj9duxyk2wk9jfl9udeaefek0rx62zywklcp", + "extraData": "" + } + }, + { + "id": "shareledger1r2m67xzwrcyzgsadnl52zw4sr7xpdtey33xpwd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r2m67xzwrcyzgsadnl52zw4sr7xpdtey33xpwd", + "ownerAddress": "shareledger1r2m67xzwrcyzgsadnl52zw4sr7xpdtey33xpwd", + "extraData": "" + } + }, + { + "id": "shareledger1r3svuenugg8ffeh6q4flwe7l4tvumc93k7sr8f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r3svuenugg8ffeh6q4flwe7l4tvumc93k7sr8f", + "ownerAddress": "shareledger1r3svuenugg8ffeh6q4flwe7l4tvumc93k7sr8f", + "extraData": "" + } + }, + { + "id": "shareledger1r4sm5saexpjhs9d7wutuql956yknlznr6fcau9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r4sm5saexpjhs9d7wutuql956yknlznr6fcau9", + "ownerAddress": "shareledger1r4sm5saexpjhs9d7wutuql956yknlznr6fcau9", + "extraData": "" + } + }, + { + "id": "shareledger1r6s06psz9mg45kxgx0r0hpzwk0p48yqmawnvtz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r6s06psz9mg45kxgx0r0hpzwk0p48yqmawnvtz", + "ownerAddress": "shareledger1r6s06psz9mg45kxgx0r0hpzwk0p48yqmawnvtz", + "extraData": "" + } + }, + { + "id": "shareledger1r6tx8h7ng84qqejujppm7pay8tsgz6sfjvdk09", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r6tx8h7ng84qqejujppm7pay8tsgz6sfjvdk09", + "ownerAddress": "shareledger1r6tx8h7ng84qqejujppm7pay8tsgz6sfjvdk09", + "extraData": "" + } + }, + { + "id": "shareledger1r6yszfhg45lyv59ma3krdpzkwdhhd55ehc7dqd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r6yszfhg45lyv59ma3krdpzkwdhhd55ehc7dqd", + "ownerAddress": "shareledger1r6yszfhg45lyv59ma3krdpzkwdhhd55ehc7dqd", + "extraData": "" + } + }, + { + "id": "shareledger1r7erv25vz24385r0k74234u287rggxc9y5p4td", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r7erv25vz24385r0k74234u287rggxc9y5p4td", + "ownerAddress": "shareledger1r7erv25vz24385r0k74234u287rggxc9y5p4td", + "extraData": "" + } + }, + { + "id": "shareledger1r7hscd3mcp0c85fzgnaw45pjrcg0wvpezdaz0x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r7hscd3mcp0c85fzgnaw45pjrcg0wvpezdaz0x", + "ownerAddress": "shareledger1r7hscd3mcp0c85fzgnaw45pjrcg0wvpezdaz0x", + "extraData": "" + } + }, + { + "id": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "ownerAddress": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "extraData": "" + } + }, + { + "id": "shareledger1r7xw223puylc4vs3qsq0jedxvwyu4m6pz9le28", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r7xw223puylc4vs3qsq0jedxvwyu4m6pz9le28", + "ownerAddress": "shareledger1r7xw223puylc4vs3qsq0jedxvwyu4m6pz9le28", + "extraData": "" + } + }, + { + "id": "shareledger1r856yr3t7udnarh57kx2yt5cfutg48lzq90uae", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1r856yr3t7udnarh57kx2yt5cfutg48lzq90uae", + "ownerAddress": "shareledger1r856yr3t7udnarh57kx2yt5cfutg48lzq90uae", + "extraData": "" + } + }, + { + "id": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "ownerAddress": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "extraData": "" + } + }, + { + "id": "shareledger1ra4jk45v4z3dsx460jl7l79crn55kw3qlefhv6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ra4jk45v4z3dsx460jl7l79crn55kw3qlefhv6", + "ownerAddress": "shareledger1ra4jk45v4z3dsx460jl7l79crn55kw3qlefhv6", + "extraData": "" + } + }, + { + "id": "shareledger1ra6q395l923p8x4gq8zyfm6c4efzwqwvzd8sqs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ra6q395l923p8x4gq8zyfm6c4efzwqwvzd8sqs", + "ownerAddress": "shareledger1ra6q395l923p8x4gq8zyfm6c4efzwqwvzd8sqs", + "extraData": "" + } + }, + { + "id": "shareledger1ratwur8tzrvnyscll960ja0rv83vj79v09fc56", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ratwur8tzrvnyscll960ja0rv83vj79v09fc56", + "ownerAddress": "shareledger1ratwur8tzrvnyscll960ja0rv83vj79v09fc56", + "extraData": "" + } + }, + { + "id": "shareledger1rcyppvxqcp56j3wlwpc9knwr8wdj0549jllr6w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rcyppvxqcp56j3wlwpc9knwr8wdj0549jllr6w", + "ownerAddress": "shareledger1rcyppvxqcp56j3wlwpc9knwr8wdj0549jllr6w", + "extraData": "" + } + }, + { + "id": "shareledger1rdzcfuqyulgj5huqka9stm7ltwuurtg8geg9xx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rdzcfuqyulgj5huqka9stm7ltwuurtg8geg9xx", + "ownerAddress": "shareledger1rdzcfuqyulgj5huqka9stm7ltwuurtg8geg9xx", + "extraData": "" + } + }, + { + "id": "shareledger1rehtwrkxyzfxr8mmwfn4j07zcdf5g5t6njushz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rehtwrkxyzfxr8mmwfn4j07zcdf5g5t6njushz", + "ownerAddress": "shareledger1rehtwrkxyzfxr8mmwfn4j07zcdf5g5t6njushz", + "extraData": "" + } + }, + { + "id": "shareledger1rf3jt9qekpkwansun6lg86fmesadqy6282ctx0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rf3jt9qekpkwansun6lg86fmesadqy6282ctx0", + "ownerAddress": "shareledger1rf3jt9qekpkwansun6lg86fmesadqy6282ctx0", + "extraData": "" + } + }, + { + "id": "shareledger1rfnkrv9yuzh5c4dnwyz6ecgard7wds5wxzwy46", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rfnkrv9yuzh5c4dnwyz6ecgard7wds5wxzwy46", + "ownerAddress": "shareledger1rfnkrv9yuzh5c4dnwyz6ecgard7wds5wxzwy46", + "extraData": "" + } + }, + { + "id": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "ownerAddress": "shareledger1rgpwlt07am5z9kv42xyxr4pjjj6a57df0mtpq6", + "extraData": "" + } + }, + { + "id": "shareledger1rhvj9w3zkens5gjxplvnqfk05xntknajskmlna", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rhvj9w3zkens5gjxplvnqfk05xntknajskmlna", + "ownerAddress": "shareledger1rhvj9w3zkens5gjxplvnqfk05xntknajskmlna", + "extraData": "" + } + }, + { + "id": "shareledger1rjsaxwn0kwfezz8as48a9qhfv9nefldrlucxm9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rjsaxwn0kwfezz8as48a9qhfv9nefldrlucxm9", + "ownerAddress": "shareledger1rjsaxwn0kwfezz8as48a9qhfv9nefldrlucxm9", + "extraData": "" + } + }, + { + "id": "shareledger1rk84zuchzueazry7gf9uyxqp48wte5ngr359u3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rk84zuchzueazry7gf9uyxqp48wte5ngr359u3", + "ownerAddress": "shareledger1rk84zuchzueazry7gf9uyxqp48wte5ngr359u3", + "extraData": "" + } + }, + { + "id": "shareledger1rkjjxg4g2wfmpnvupr5gz2kuz4wu3c7ytytr94", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rkjjxg4g2wfmpnvupr5gz2kuz4wu3c7ytytr94", + "ownerAddress": "shareledger1rkjjxg4g2wfmpnvupr5gz2kuz4wu3c7ytytr94", + "extraData": "" + } + }, + { + "id": "shareledger1rkq3au886gmmga6j8vcqy4zzndclhl8en2v0xr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rkq3au886gmmga6j8vcqy4zzndclhl8en2v0xr", + "ownerAddress": "shareledger1rkq3au886gmmga6j8vcqy4zzndclhl8en2v0xr", + "extraData": "" + } + }, + { + "id": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "ownerAddress": "shareledger1rkyrl98lcyyjw2ut5l74vg9sh4fwrzrc69enar", + "extraData": "" + } + }, + { + "id": "shareledger1rl9p3ectaj6pxmnfcs3pu3v4q4hy9y55edj9qm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rl9p3ectaj6pxmnfcs3pu3v4q4hy9y55edj9qm", + "ownerAddress": "shareledger1rl9p3ectaj6pxmnfcs3pu3v4q4hy9y55edj9qm", + "extraData": "" + } + }, + { + "id": "shareledger1rmze4xm73ewvxm05t7ac79lmkvy8zy3u90efsm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rmze4xm73ewvxm05t7ac79lmkvy8zy3u90efsm", + "ownerAddress": "shareledger1rmze4xm73ewvxm05t7ac79lmkvy8zy3u90efsm", + "extraData": "" + } + }, + { + "id": "shareledger1rn77c5lj7kc9u06lc4zf9a59mz0hec5yg7wx27", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rn77c5lj7kc9u06lc4zf9a59mz0hec5yg7wx27", + "ownerAddress": "shareledger1rn77c5lj7kc9u06lc4zf9a59mz0hec5yg7wx27", + "extraData": "" + } + }, + { + "id": "shareledger1rnuvruk75xpxyzkgu8h9y9fwzkxfz53mg2hvzv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rnuvruk75xpxyzkgu8h9y9fwzkxfz53mg2hvzv", + "ownerAddress": "shareledger1rnuvruk75xpxyzkgu8h9y9fwzkxfz53mg2hvzv", + "extraData": "" + } + }, + { + "id": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "ownerAddress": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "extraData": "" + } + }, + { + "id": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "ownerAddress": "shareledger1rs5cacc7ekwypl5ny6vmkpdvyset2vqqyhmy9l", + "extraData": "" + } + }, + { + "id": "shareledger1rslyr42eaxj4y8dvs52dfm6zfqxlxykc7vwr3x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rslyr42eaxj4y8dvs52dfm6zfqxlxykc7vwr3x", + "ownerAddress": "shareledger1rslyr42eaxj4y8dvs52dfm6zfqxlxykc7vwr3x", + "extraData": "" + } + }, + { + "id": "shareledger1rsuvql8u72jcauu44hj2eku5qz8j5xcmjxdmxz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rsuvql8u72jcauu44hj2eku5qz8j5xcmjxdmxz", + "ownerAddress": "shareledger1rsuvql8u72jcauu44hj2eku5qz8j5xcmjxdmxz", + "extraData": "" + } + }, + { + "id": "shareledger1rtl8dx7rr2tdaa3zwt9qc2tqsjxe3ddcltmd2h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rtl8dx7rr2tdaa3zwt9qc2tqsjxe3ddcltmd2h", + "ownerAddress": "shareledger1rtl8dx7rr2tdaa3zwt9qc2tqsjxe3ddcltmd2h", + "extraData": "" + } + }, + { + "id": "shareledger1rum5a8yck04lrjgjdnd39ej3z8merd820mcgw8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rum5a8yck04lrjgjdnd39ej3z8merd820mcgw8", + "ownerAddress": "shareledger1rum5a8yck04lrjgjdnd39ej3z8merd820mcgw8", + "extraData": "" + } + }, + { + "id": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "ownerAddress": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "extraData": "" + } + }, + { + "id": "shareledger1rvz09e728ap8x99qg626qsjyfakpjhfpnck553", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rvz09e728ap8x99qg626qsjyfakpjhfpnck553", + "ownerAddress": "shareledger1rvz09e728ap8x99qg626qsjyfakpjhfpnck553", + "extraData": "" + } + }, + { + "id": "shareledger1rwz8ckv6w9t3nx4xsm2l50j75fcxau0jrujc3g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rwz8ckv6w9t3nx4xsm2l50j75fcxau0jrujc3g", + "ownerAddress": "shareledger1rwz8ckv6w9t3nx4xsm2l50j75fcxau0jrujc3g", + "extraData": "" + } + }, + { + "id": "shareledger1rxkyzehpmnlqhekh8j95eysyl8zxey2pndurgd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rxkyzehpmnlqhekh8j95eysyl8zxey2pndurgd", + "ownerAddress": "shareledger1rxkyzehpmnlqhekh8j95eysyl8zxey2pndurgd", + "extraData": "" + } + }, + { + "id": "shareledger1ry8et7d6rwwqde2q2vlwmaxxy5fqpkgrx8p290", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ry8et7d6rwwqde2q2vlwmaxxy5fqpkgrx8p290", + "ownerAddress": "shareledger1ry8et7d6rwwqde2q2vlwmaxxy5fqpkgrx8p290", + "extraData": "" + } + }, + { + "id": "shareledger1rygnye2dqheacm3ku4990vxe3zmlxgk77dv3uy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rygnye2dqheacm3ku4990vxe3zmlxgk77dv3uy", + "ownerAddress": "shareledger1rygnye2dqheacm3ku4990vxe3zmlxgk77dv3uy", + "extraData": "" + } + }, + { + "id": "shareledger1ryql7s2n050dc3xda7g9ywmwpuq8zjcmtg9sx6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ryql7s2n050dc3xda7g9ywmwpuq8zjcmtg9sx6", + "ownerAddress": "shareledger1ryql7s2n050dc3xda7g9ywmwpuq8zjcmtg9sx6", + "extraData": "" + } + }, + { + "id": "shareledger1rz44ck8wu47f8e38a3v7de7vtm04kcnw5240au", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1rz44ck8wu47f8e38a3v7de7vtm04kcnw5240au", + "ownerAddress": "shareledger1rz44ck8wu47f8e38a3v7de7vtm04kcnw5240au", + "extraData": "" + } + }, + { + "id": "shareledger1s05s0ah9wcflsnt7hpvyd660ajgv09cgt6ulwd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s05s0ah9wcflsnt7hpvyd660ajgv09cgt6ulwd", + "ownerAddress": "shareledger1s05s0ah9wcflsnt7hpvyd660ajgv09cgt6ulwd", + "extraData": "" + } + }, + { + "id": "shareledger1s07hppyfvlptrwra9edcujf9wrqyqcfkes4nrl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s07hppyfvlptrwra9edcujf9wrqyqcfkes4nrl", + "ownerAddress": "shareledger1s07hppyfvlptrwra9edcujf9wrqyqcfkes4nrl", + "extraData": "" + } + }, + { + "id": "shareledger1s262j0n8s9m87tt55yz0g2ygnanll7gd8rd3qk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s262j0n8s9m87tt55yz0g2ygnanll7gd8rd3qk", + "ownerAddress": "shareledger1s262j0n8s9m87tt55yz0g2ygnanll7gd8rd3qk", + "extraData": "" + } + }, + { + "id": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "ownerAddress": "shareledger1s2j3k2xxgljfmav5f0dgjunrzyjx7nngkulcah", + "extraData": "" + } + }, + { + "id": "shareledger1s2lvymedu24pd4zlzpfz25pnz3ggfunhajtq3z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s2lvymedu24pd4zlzpfz25pnz3ggfunhajtq3z", + "ownerAddress": "shareledger1s2lvymedu24pd4zlzpfz25pnz3ggfunhajtq3z", + "extraData": "" + } + }, + { + "id": "shareledger1s3fwzpz7qh8rpvjkymnuv3zttv9l2m7mdcf82w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s3fwzpz7qh8rpvjkymnuv3zttv9l2m7mdcf82w", + "ownerAddress": "shareledger1s3fwzpz7qh8rpvjkymnuv3zttv9l2m7mdcf82w", + "extraData": "" + } + }, + { + "id": "shareledger1s3kz435nlxh73048zjjudljrfn7recyxlxt6zw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s3kz435nlxh73048zjjudljrfn7recyxlxt6zw", + "ownerAddress": "shareledger1s3kz435nlxh73048zjjudljrfn7recyxlxt6zw", + "extraData": "" + } + }, + { + "id": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "ownerAddress": "shareledger1s40xm3eftdmyjjxesk3xlxzq3qqmu6p2wvm3tq", + "extraData": "" + } + }, + { + "id": "shareledger1s4dcyr3ppl0xlvtg57tgdms0wlc23fg9mf3plt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s4dcyr3ppl0xlvtg57tgdms0wlc23fg9mf3plt", + "ownerAddress": "shareledger1s4dcyr3ppl0xlvtg57tgdms0wlc23fg9mf3plt", + "extraData": "" + } + }, + { + "id": "shareledger1s4zwxc5aqdrmtudsdjtn94hzwyjknvv8g7u7c7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s4zwxc5aqdrmtudsdjtn94hzwyjknvv8g7u7c7", + "ownerAddress": "shareledger1s4zwxc5aqdrmtudsdjtn94hzwyjknvv8g7u7c7", + "extraData": "" + } + }, + { + "id": "shareledger1s64z0a777cpa43cn325ps5e92nw36ty4r2xccg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s64z0a777cpa43cn325ps5e92nw36ty4r2xccg", + "ownerAddress": "shareledger1s64z0a777cpa43cn325ps5e92nw36ty4r2xccg", + "extraData": "" + } + }, + { + "id": "shareledger1s6ew2jq6vkxrxj6a04r2f80dmq02shz4e8axjj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s6ew2jq6vkxrxj6a04r2f80dmq02shz4e8axjj", + "ownerAddress": "shareledger1s6ew2jq6vkxrxj6a04r2f80dmq02shz4e8axjj", + "extraData": "" + } + }, + { + "id": "shareledger1s6kkgauyegs9dd0mcgn8r6kmkw4p7gj0tyy2jd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s6kkgauyegs9dd0mcgn8r6kmkw4p7gj0tyy2jd", + "ownerAddress": "shareledger1s6kkgauyegs9dd0mcgn8r6kmkw4p7gj0tyy2jd", + "extraData": "" + } + }, + { + "id": "shareledger1s6lq4z8vptvx6cx4vdc5qly309hp4fqvpv8p4g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s6lq4z8vptvx6cx4vdc5qly309hp4fqvpv8p4g", + "ownerAddress": "shareledger1s6lq4z8vptvx6cx4vdc5qly309hp4fqvpv8p4g", + "extraData": "" + } + }, + { + "id": "shareledger1s72dfzv9wawrq8g8m5pr02hlzpkvefnf07exrt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s72dfzv9wawrq8g8m5pr02hlzpkvefnf07exrt", + "ownerAddress": "shareledger1s72dfzv9wawrq8g8m5pr02hlzpkvefnf07exrt", + "extraData": "" + } + }, + { + "id": "shareledger1s73ll85mrr2crs86lqnvfdcjx8pahs9d7ug04d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s73ll85mrr2crs86lqnvfdcjx8pahs9d7ug04d", + "ownerAddress": "shareledger1s73ll85mrr2crs86lqnvfdcjx8pahs9d7ug04d", + "extraData": "" + } + }, + { + "id": "shareledger1s7gyzfylq7m4zsrutpl86lm33fwu02rgxk6dav", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s7gyzfylq7m4zsrutpl86lm33fwu02rgxk6dav", + "ownerAddress": "shareledger1s7gyzfylq7m4zsrutpl86lm33fwu02rgxk6dav", + "extraData": "" + } + }, + { + "id": "shareledger1s7s3tw5pnpeyls90rffwvs9fc4wllemse2z8e7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s7s3tw5pnpeyls90rffwvs9fc4wllemse2z8e7", + "ownerAddress": "shareledger1s7s3tw5pnpeyls90rffwvs9fc4wllemse2z8e7", + "extraData": "" + } + }, + { + "id": "shareledger1s7tgzg7e47a48j3p7uetyluq0j0yfyxwpps52l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s7tgzg7e47a48j3p7uetyluq0j0yfyxwpps52l", + "ownerAddress": "shareledger1s7tgzg7e47a48j3p7uetyluq0j0yfyxwpps52l", + "extraData": "" + } + }, + { + "id": "shareledger1s87tfw9vmvg52f5clwcrv44sm2y4r5vxnx08r8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s87tfw9vmvg52f5clwcrv44sm2y4r5vxnx08r8", + "ownerAddress": "shareledger1s87tfw9vmvg52f5clwcrv44sm2y4r5vxnx08r8", + "extraData": "" + } + }, + { + "id": "shareledger1s8g354sjvw4dkx0rxfjqvqf64hqyc2t3vxwudm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s8g354sjvw4dkx0rxfjqvqf64hqyc2t3vxwudm", + "ownerAddress": "shareledger1s8g354sjvw4dkx0rxfjqvqf64hqyc2t3vxwudm", + "extraData": "" + } + }, + { + "id": "shareledger1s9j4hwg43rqpk3fuj3k5fynrn0rswc4ldq4zua", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s9j4hwg43rqpk3fuj3k5fynrn0rswc4ldq4zua", + "ownerAddress": "shareledger1s9j4hwg43rqpk3fuj3k5fynrn0rswc4ldq4zua", + "extraData": "" + } + }, + { + "id": "shareledger1s9mpccn9wadexsg3wwrcz3s0xactgq9h9dxrjy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s9mpccn9wadexsg3wwrcz3s0xactgq9h9dxrjy", + "ownerAddress": "shareledger1s9mpccn9wadexsg3wwrcz3s0xactgq9h9dxrjy", + "extraData": "" + } + }, + { + "id": "shareledger1s9p537eva6g2w7n3gkvxq2upajtegepx6n65rt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s9p537eva6g2w7n3gkvxq2upajtegepx6n65rt", + "ownerAddress": "shareledger1s9p537eva6g2w7n3gkvxq2upajtegepx6n65rt", + "extraData": "" + } + }, + { + "id": "shareledger1s9xf2vnprp3dg2zsqjk0dea4rwxuahwn4ha4jq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s9xf2vnprp3dg2zsqjk0dea4rwxuahwn4ha4jq", + "ownerAddress": "shareledger1s9xf2vnprp3dg2zsqjk0dea4rwxuahwn4ha4jq", + "extraData": "" + } + }, + { + "id": "shareledger1scdq96hxerv2mkqgdseyxpnpjgygjqcvkk8urc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1scdq96hxerv2mkqgdseyxpnpjgygjqcvkk8urc", + "ownerAddress": "shareledger1scdq96hxerv2mkqgdseyxpnpjgygjqcvkk8urc", + "extraData": "" + } + }, + { + "id": "shareledger1scfm0vm2n0qv7hhjszmj03wpncu5p70pcaqnud", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1scfm0vm2n0qv7hhjszmj03wpncu5p70pcaqnud", + "ownerAddress": "shareledger1scfm0vm2n0qv7hhjszmj03wpncu5p70pcaqnud", + "extraData": "" + } + }, + { + "id": "shareledger1schfvptznfv4lnure99q2xtj9kp5lyfcxsgss8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1schfvptznfv4lnure99q2xtj9kp5lyfcxsgss8", + "ownerAddress": "shareledger1schfvptznfv4lnure99q2xtj9kp5lyfcxsgss8", + "extraData": "" + } + }, + { + "id": "shareledger1sclauac5pzlhxgeg27uwr5ez60uun06zqpy5af", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sclauac5pzlhxgeg27uwr5ez60uun06zqpy5af", + "ownerAddress": "shareledger1sclauac5pzlhxgeg27uwr5ez60uun06zqpy5af", + "extraData": "" + } + }, + { + "id": "shareledger1sdqn4r68y68n45835rzvxezanq2ztl5p69hw6z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sdqn4r68y68n45835rzvxezanq2ztl5p69hw6z", + "ownerAddress": "shareledger1sdqn4r68y68n45835rzvxezanq2ztl5p69hw6z", + "extraData": "" + } + }, + { + "id": "shareledger1sea8u4qzq4h67hnu42wpple8xt0y038p6n42dv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sea8u4qzq4h67hnu42wpple8xt0y038p6n42dv", + "ownerAddress": "shareledger1sea8u4qzq4h67hnu42wpple8xt0y038p6n42dv", + "extraData": "" + } + }, + { + "id": "shareledger1seqx83ayc8rcua4mf2dq6fy3gszclg0wcdngrl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1seqx83ayc8rcua4mf2dq6fy3gszclg0wcdngrl", + "ownerAddress": "shareledger1seqx83ayc8rcua4mf2dq6fy3gszclg0wcdngrl", + "extraData": "" + } + }, + { + "id": "shareledger1sf9x7pd6h8eewyakr8vn7rv6vf8sdt5euz7a05", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sf9x7pd6h8eewyakr8vn7rv6vf8sdt5euz7a05", + "ownerAddress": "shareledger1sf9x7pd6h8eewyakr8vn7rv6vf8sdt5euz7a05", + "extraData": "" + } + }, + { + "id": "shareledger1sfam9nfym77xf5mhqjlvw9fahgz646k0dk3s4k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sfam9nfym77xf5mhqjlvw9fahgz646k0dk3s4k", + "ownerAddress": "shareledger1sfam9nfym77xf5mhqjlvw9fahgz646k0dk3s4k", + "extraData": "" + } + }, + { + "id": "shareledger1sg20cvsd09suwlamkkxgsupj9czq7c628wu89w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sg20cvsd09suwlamkkxgsupj9czq7c628wu89w", + "ownerAddress": "shareledger1sg20cvsd09suwlamkkxgsupj9czq7c628wu89w", + "extraData": "" + } + }, + { + "id": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "ownerAddress": "shareledger1sg98fvhd759gmfumy2s42l3tzykywjgultdedr", + "extraData": "" + } + }, + { + "id": "shareledger1sh7gpgjr4mfc2h0d03lueqps563hdfc076n6fe", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sh7gpgjr4mfc2h0d03lueqps563hdfc076n6fe", + "ownerAddress": "shareledger1sh7gpgjr4mfc2h0d03lueqps563hdfc076n6fe", + "extraData": "" + } + }, + { + "id": "shareledger1shgyerx6lpj7nyyehj8tvt8js2ra8vdvd8lw98", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1shgyerx6lpj7nyyehj8tvt8js2ra8vdvd8lw98", + "ownerAddress": "shareledger1shgyerx6lpj7nyyehj8tvt8js2ra8vdvd8lw98", + "extraData": "" + } + }, + { + "id": "shareledger1sjrxdw0xnth0vwevnykdtdnxy7hxlnn3a3cnx8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sjrxdw0xnth0vwevnykdtdnxy7hxlnn3a3cnx8", + "ownerAddress": "shareledger1sjrxdw0xnth0vwevnykdtdnxy7hxlnn3a3cnx8", + "extraData": "" + } + }, + { + "id": "shareledger1sms0vsmykwyq0z37q2h39aax27tne25q5f3mrz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sms0vsmykwyq0z37q2h39aax27tne25q5f3mrz", + "ownerAddress": "shareledger1sms0vsmykwyq0z37q2h39aax27tne25q5f3mrz", + "extraData": "" + } + }, + { + "id": "shareledger1snw5x6mz4jr58k4009hfz0wygx94amnzsg834l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1snw5x6mz4jr58k4009hfz0wygx94amnzsg834l", + "ownerAddress": "shareledger1snw5x6mz4jr58k4009hfz0wygx94amnzsg834l", + "extraData": "" + } + }, + { + "id": "shareledger1snyu6mrnd2q3wwtvm33cedc289scy3cwzy0nsh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1snyu6mrnd2q3wwtvm33cedc289scy3cwzy0nsh", + "ownerAddress": "shareledger1snyu6mrnd2q3wwtvm33cedc289scy3cwzy0nsh", + "extraData": "" + } + }, + { + "id": "shareledger1spjurkce2pvzu6r9urlcwcfr88jx8vpqkrvv50", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1spjurkce2pvzu6r9urlcwcfr88jx8vpqkrvv50", + "ownerAddress": "shareledger1spjurkce2pvzu6r9urlcwcfr88jx8vpqkrvv50", + "extraData": "" + } + }, + { + "id": "shareledger1spm88umga6jrg6mrtcswvckymh23q0ga57lrqp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1spm88umga6jrg6mrtcswvckymh23q0ga57lrqp", + "ownerAddress": "shareledger1spm88umga6jrg6mrtcswvckymh23q0ga57lrqp", + "extraData": "" + } + }, + { + "id": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "ownerAddress": "shareledger1sqwyks0qgk3lhedxkl0n7whlajpafkndvt78wj", + "extraData": "" + } + }, + { + "id": "shareledger1sr3rhyzdmeat25qyr84h0heull6jyy3tm7cgmv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sr3rhyzdmeat25qyr84h0heull6jyy3tm7cgmv", + "ownerAddress": "shareledger1sr3rhyzdmeat25qyr84h0heull6jyy3tm7cgmv", + "extraData": "" + } + }, + { + "id": "shareledger1suth3fx3dyg6tlj2s23rmwrht3s6eh3twsxdny", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1suth3fx3dyg6tlj2s23rmwrht3s6eh3twsxdny", + "ownerAddress": "shareledger1suth3fx3dyg6tlj2s23rmwrht3s6eh3twsxdny", + "extraData": "" + } + }, + { + "id": "shareledger1svhvgrnvghx6f4tqnx275y6du0wflfmzv9t9uz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1svhvgrnvghx6f4tqnx275y6du0wflfmzv9t9uz", + "ownerAddress": "shareledger1svhvgrnvghx6f4tqnx275y6du0wflfmzv9t9uz", + "extraData": "" + } + }, + { + "id": "shareledger1svpzna6gt9u3e89kvq847dtqhraftmzgqpfew2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1svpzna6gt9u3e89kvq847dtqhraftmzgqpfew2", + "ownerAddress": "shareledger1svpzna6gt9u3e89kvq847dtqhraftmzgqpfew2", + "extraData": "" + } + }, + { + "id": "shareledger1swz5xflff69n0cf6svy2ztk99jltn8tg58swzt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1swz5xflff69n0cf6svy2ztk99jltn8tg58swzt", + "ownerAddress": "shareledger1swz5xflff69n0cf6svy2ztk99jltn8tg58swzt", + "extraData": "" + } + }, + { + "id": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "ownerAddress": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "extraData": "" + } + }, + { + "id": "shareledger1sxe8c3q20gvgu4le2ffrknzlk47x3xz3z9f5nk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sxe8c3q20gvgu4le2ffrknzlk47x3xz3z9f5nk", + "ownerAddress": "shareledger1sxe8c3q20gvgu4le2ffrknzlk47x3xz3z9f5nk", + "extraData": "" + } + }, + { + "id": "shareledger1sxq2pe3ua7dl5k7qwpfwecczk0ppxscn3nj33e", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1sxq2pe3ua7dl5k7qwpfwecczk0ppxscn3nj33e", + "ownerAddress": "shareledger1sxq2pe3ua7dl5k7qwpfwecczk0ppxscn3nj33e", + "extraData": "" + } + }, + { + "id": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "ownerAddress": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "extraData": "" + } + }, + { + "id": "shareledger1szpuh85zmh5rtnflz8f6krsjcdnjlc5yw7rd5h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1szpuh85zmh5rtnflz8f6krsjcdnjlc5yw7rd5h", + "ownerAddress": "shareledger1szpuh85zmh5rtnflz8f6krsjcdnjlc5yw7rd5h", + "extraData": "" + } + }, + { + "id": "shareledger1szqqc7t2y5mn0xtjhq7xqx4kamd6mmnwe2ugw7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1szqqc7t2y5mn0xtjhq7xqx4kamd6mmnwe2ugw7", + "ownerAddress": "shareledger1szqqc7t2y5mn0xtjhq7xqx4kamd6mmnwe2ugw7", + "extraData": "" + } + }, + { + "id": "shareledger1t0sd6dvpjp4k3ewknx0m0e3jg63cn36un4gfk2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t0sd6dvpjp4k3ewknx0m0e3jg63cn36un4gfk2", + "ownerAddress": "shareledger1t0sd6dvpjp4k3ewknx0m0e3jg63cn36un4gfk2", + "extraData": "" + } + }, + { + "id": "shareledger1t0tyzg5rrgzm56jx2hvwqk7ve07cfl897mv0at", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t0tyzg5rrgzm56jx2hvwqk7ve07cfl897mv0at", + "ownerAddress": "shareledger1t0tyzg5rrgzm56jx2hvwqk7ve07cfl897mv0at", + "extraData": "" + } + }, + { + "id": "shareledger1t24ks7g2l8yff9gcvkq7exyjch3z2a9z9c5dwl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t24ks7g2l8yff9gcvkq7exyjch3z2a9z9c5dwl", + "ownerAddress": "shareledger1t24ks7g2l8yff9gcvkq7exyjch3z2a9z9c5dwl", + "extraData": "" + } + }, + { + "id": "shareledger1t30qzsy986x0jmyq8ljpfufsz5f0kgssq0e7rd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t30qzsy986x0jmyq8ljpfufsz5f0kgssq0e7rd", + "ownerAddress": "shareledger1t30qzsy986x0jmyq8ljpfufsz5f0kgssq0e7rd", + "extraData": "" + } + }, + { + "id": "shareledger1t3l65zeclpe0v7cnehqq5qmanc9p3ksp2zxx3s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t3l65zeclpe0v7cnehqq5qmanc9p3ksp2zxx3s", + "ownerAddress": "shareledger1t3l65zeclpe0v7cnehqq5qmanc9p3ksp2zxx3s", + "extraData": "" + } + }, + { + "id": "shareledger1t48a7rvv6ksmawwjc9afjdgzk24cnpqjjme0v4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t48a7rvv6ksmawwjc9afjdgzk24cnpqjjme0v4", + "ownerAddress": "shareledger1t48a7rvv6ksmawwjc9afjdgzk24cnpqjjme0v4", + "extraData": "" + } + }, + { + "id": "shareledger1t4kvqqk3ewextvhn4meldz6qsaqf4tzvj5p3p5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t4kvqqk3ewextvhn4meldz6qsaqf4tzvj5p3p5", + "ownerAddress": "shareledger1t4kvqqk3ewextvhn4meldz6qsaqf4tzvj5p3p5", + "extraData": "" + } + }, + { + "id": "shareledger1t4pmldxh68cja9k0qhxmg0gw6qdjpcrlkc2ym6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t4pmldxh68cja9k0qhxmg0gw6qdjpcrlkc2ym6", + "ownerAddress": "shareledger1t4pmldxh68cja9k0qhxmg0gw6qdjpcrlkc2ym6", + "extraData": "" + } + }, + { + "id": "shareledger1t4v9xq5guu4c0nj5cqcjem85ztn9wygfc2gen7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t4v9xq5guu4c0nj5cqcjem85ztn9wygfc2gen7", + "ownerAddress": "shareledger1t4v9xq5guu4c0nj5cqcjem85ztn9wygfc2gen7", + "extraData": "" + } + }, + { + "id": "shareledger1t556lgfcfy7v2agquzktthr4ydlnctj29eahzq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t556lgfcfy7v2agquzktthr4ydlnctj29eahzq", + "ownerAddress": "shareledger1t556lgfcfy7v2agquzktthr4ydlnctj29eahzq", + "extraData": "" + } + }, + { + "id": "shareledger1t654p456fryz6wxhq6yfh6ke85try02ramxxsc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t654p456fryz6wxhq6yfh6ke85try02ramxxsc", + "ownerAddress": "shareledger1t654p456fryz6wxhq6yfh6ke85try02ramxxsc", + "extraData": "" + } + }, + { + "id": "shareledger1t6mah3y05ehapgxdesptvr7zgmfdgefwkkvrz3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t6mah3y05ehapgxdesptvr7zgmfdgefwkkvrz3", + "ownerAddress": "shareledger1t6mah3y05ehapgxdesptvr7zgmfdgefwkkvrz3", + "extraData": "" + } + }, + { + "id": "shareledger1t8nsq5n7swleszjhe6fx4x2qkwahf9j6v8lfu7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t8nsq5n7swleszjhe6fx4x2qkwahf9j6v8lfu7", + "ownerAddress": "shareledger1t8nsq5n7swleszjhe6fx4x2qkwahf9j6v8lfu7", + "extraData": "" + } + }, + { + "id": "shareledger1t8xw80cvsnfnrhhkaj3hct6k359rtznqs222yy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t8xw80cvsnfnrhhkaj3hct6k359rtznqs222yy", + "ownerAddress": "shareledger1t8xw80cvsnfnrhhkaj3hct6k359rtznqs222yy", + "extraData": "" + } + }, + { + "id": "shareledger1t93arypjfdnjdxeryulr9xtwf2c0m7rapcyjzn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1t93arypjfdnjdxeryulr9xtwf2c0m7rapcyjzn", + "ownerAddress": "shareledger1t93arypjfdnjdxeryulr9xtwf2c0m7rapcyjzn", + "extraData": "" + } + }, + { + "id": "shareledger1tcnta40gq8w07yryxquwkvhrclk54x352lg57w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tcnta40gq8w07yryxquwkvhrclk54x352lg57w", + "ownerAddress": "shareledger1tcnta40gq8w07yryxquwkvhrclk54x352lg57w", + "extraData": "" + } + }, + { + "id": "shareledger1tcxr03yuhj6gunagw5cs8zghh3jkpu7yxwdzes", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tcxr03yuhj6gunagw5cs8zghh3jkpu7yxwdzes", + "ownerAddress": "shareledger1tcxr03yuhj6gunagw5cs8zghh3jkpu7yxwdzes", + "extraData": "" + } + }, + { + "id": "shareledger1td2g4dm9mj8cmrer8h39j5z65pu5t3ez550843", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1td2g4dm9mj8cmrer8h39j5z65pu5t3ez550843", + "ownerAddress": "shareledger1td2g4dm9mj8cmrer8h39j5z65pu5t3ez550843", + "extraData": "" + } + }, + { + "id": "shareledger1tdd2pdj2e4wmev3c4zh9z8tvereh4qzscdjpku", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tdd2pdj2e4wmev3c4zh9z8tvereh4qzscdjpku", + "ownerAddress": "shareledger1tdd2pdj2e4wmev3c4zh9z8tvereh4qzscdjpku", + "extraData": "" + } + }, + { + "id": "shareledger1tfapyqpea7yq34m0sfusazzkltrgmxxmkczfzh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tfapyqpea7yq34m0sfusazzkltrgmxxmkczfzh", + "ownerAddress": "shareledger1tfapyqpea7yq34m0sfusazzkltrgmxxmkczfzh", + "extraData": "" + } + }, + { + "id": "shareledger1tfg4e2ycwjrstdvefu4l7wjrzvsh3tcp3nyzeh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tfg4e2ycwjrstdvefu4l7wjrzvsh3tcp3nyzeh", + "ownerAddress": "shareledger1tfg4e2ycwjrstdvefu4l7wjrzvsh3tcp3nyzeh", + "extraData": "" + } + }, + { + "id": "shareledger1tgjjeh29yzj750s9lxv28ne8c8h9cu756hn2m5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tgjjeh29yzj750s9lxv28ne8c8h9cu756hn2m5", + "ownerAddress": "shareledger1tgjjeh29yzj750s9lxv28ne8c8h9cu756hn2m5", + "extraData": "" + } + }, + { + "id": "shareledger1th0wdefvlyprm9mmyn43jvxcgrfak525ltyvef", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1th0wdefvlyprm9mmyn43jvxcgrfak525ltyvef", + "ownerAddress": "shareledger1th0wdefvlyprm9mmyn43jvxcgrfak525ltyvef", + "extraData": "" + } + }, + { + "id": "shareledger1thc87zvjezpy50tfahywrlj8q22zngjyl0qg6a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1thc87zvjezpy50tfahywrlj8q22zngjyl0qg6a", + "ownerAddress": "shareledger1thc87zvjezpy50tfahywrlj8q22zngjyl0qg6a", + "extraData": "" + } + }, + { + "id": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "ownerAddress": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "extraData": "" + } + }, + { + "id": "shareledger1tpql5qtqxmz4z885dak472wpgl0u4rgethcacf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tpql5qtqxmz4z885dak472wpgl0u4rgethcacf", + "ownerAddress": "shareledger1tpql5qtqxmz4z885dak472wpgl0u4rgethcacf", + "extraData": "" + } + }, + { + "id": "shareledger1tpuef47t09slyc834nex5uvgxjpfsw90gg5wup", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tpuef47t09slyc834nex5uvgxjpfsw90gg5wup", + "ownerAddress": "shareledger1tpuef47t09slyc834nex5uvgxjpfsw90gg5wup", + "extraData": "" + } + }, + { + "id": "shareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "ownerAddress": "shareledger1tq9tymye8ksgf2c3qv7phssz6hcygc9j49pqcw", + "extraData": "" + } + }, + { + "id": "shareledger1tqtlnhwf8j7xlxj8zxce0u5rnkjsteu4tga5r2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tqtlnhwf8j7xlxj8zxce0u5rnkjsteu4tga5r2", + "ownerAddress": "shareledger1tqtlnhwf8j7xlxj8zxce0u5rnkjsteu4tga5r2", + "extraData": "" + } + }, + { + "id": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "ownerAddress": "shareledger1tr27uvwuwyf3wxey57esrmqu52jwl95lrpg0d4", + "extraData": "" + } + }, + { + "id": "shareledger1trgfuxn8h383quqz6jzly3ad32t2wgadgnhx6l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1trgfuxn8h383quqz6jzly3ad32t2wgadgnhx6l", + "ownerAddress": "shareledger1trgfuxn8h383quqz6jzly3ad32t2wgadgnhx6l", + "extraData": "" + } + }, + { + "id": "shareledger1tte9qm89ys3e5gztyv4zclkckk5v8x8mhlp58r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tte9qm89ys3e5gztyv4zclkckk5v8x8mhlp58r", + "ownerAddress": "shareledger1tte9qm89ys3e5gztyv4zclkckk5v8x8mhlp58r", + "extraData": "" + } + }, + { + "id": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "ownerAddress": "shareledger1ttqe8cf4lqzzqh63hk5wnx9upmy6rj43spjgv2", + "extraData": "" + } + }, + { + "id": "shareledger1tujs8wkjsmlhyhwnk80jaq2hhvqq5ejra0v76c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tujs8wkjsmlhyhwnk80jaq2hhvqq5ejra0v76c", + "ownerAddress": "shareledger1tujs8wkjsmlhyhwnk80jaq2hhvqq5ejra0v76c", + "extraData": "" + } + }, + { + "id": "shareledger1tupgnsqjdsgmm5y53l4zr4vp3s0qzg0v5p0kly", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tupgnsqjdsgmm5y53l4zr4vp3s0qzg0v5p0kly", + "ownerAddress": "shareledger1tupgnsqjdsgmm5y53l4zr4vp3s0qzg0v5p0kly", + "extraData": "" + } + }, + { + "id": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "ownerAddress": "shareledger1tuug2qqr0vg4p5esjkq506mmq09fqye6alcf33", + "extraData": "" + } + }, + { + "id": "shareledger1tvxdr4jla4ezxq6m0769pawhlqtjdpeaygynqq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tvxdr4jla4ezxq6m0769pawhlqtjdpeaygynqq", + "ownerAddress": "shareledger1tvxdr4jla4ezxq6m0769pawhlqtjdpeaygynqq", + "extraData": "" + } + }, + { + "id": "shareledger1tyhvf09yyezplp8fqz06pd0w57e79v8nkn7tam", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tyhvf09yyezplp8fqz06pd0w57e79v8nkn7tam", + "ownerAddress": "shareledger1tyhvf09yyezplp8fqz06pd0w57e79v8nkn7tam", + "extraData": "" + } + }, + { + "id": "shareledger1tz4hgpcf2nxxea05tjmtptw3da3a0yy0g2hfgz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tz4hgpcf2nxxea05tjmtptw3da3a0yy0g2hfgz", + "ownerAddress": "shareledger1tz4hgpcf2nxxea05tjmtptw3da3a0yy0g2hfgz", + "extraData": "" + } + }, + { + "id": "shareledger1tzja67cdg77fcawam4jjwe3wrudlm08khw5ssq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1tzja67cdg77fcawam4jjwe3wrudlm08khw5ssq", + "ownerAddress": "shareledger1tzja67cdg77fcawam4jjwe3wrudlm08khw5ssq", + "extraData": "" + } + }, + { + "id": "shareledger1u06086d0e7h4e43y2mjavqlufunn7qfnqlqc2k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u06086d0e7h4e43y2mjavqlufunn7qfnqlqc2k", + "ownerAddress": "shareledger1u06086d0e7h4e43y2mjavqlufunn7qfnqlqc2k", + "extraData": "" + } + }, + { + "id": "shareledger1u27rf2qpev0zsvawu8q8heqvrahfkttmlca6h4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u27rf2qpev0zsvawu8q8heqvrahfkttmlca6h4", + "ownerAddress": "shareledger1u27rf2qpev0zsvawu8q8heqvrahfkttmlca6h4", + "extraData": "" + } + }, + { + "id": "shareledger1u2dxxgpq9v344jh9sltqfgw0zn5cwzpdj72fdh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u2dxxgpq9v344jh9sltqfgw0zn5cwzpdj72fdh", + "ownerAddress": "shareledger1u2dxxgpq9v344jh9sltqfgw0zn5cwzpdj72fdh", + "extraData": "" + } + }, + { + "id": "shareledger1u2xq64xh045vj59r235tzpz2pzsrnfetnl5sec", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u2xq64xh045vj59r235tzpz2pzsrnfetnl5sec", + "ownerAddress": "shareledger1u2xq64xh045vj59r235tzpz2pzsrnfetnl5sec", + "extraData": "" + } + }, + { + "id": "shareledger1u2zqsvulc2sf9jgekm0zpjt2c7vy3g09lnueg6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u2zqsvulc2sf9jgekm0zpjt2c7vy3g09lnueg6", + "ownerAddress": "shareledger1u2zqsvulc2sf9jgekm0zpjt2c7vy3g09lnueg6", + "extraData": "" + } + }, + { + "id": "shareledger1u3jsr9y6ek9jllqgzf8ywm6hzzxhxkjlphrzz3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u3jsr9y6ek9jllqgzf8ywm6hzzxhxkjlphrzz3", + "ownerAddress": "shareledger1u3jsr9y6ek9jllqgzf8ywm6hzzxhxkjlphrzz3", + "extraData": "" + } + }, + { + "id": "shareledger1u4g2pvuq569gtcclvnmrwxek9hcpzfyscm3qqy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u4g2pvuq569gtcclvnmrwxek9hcpzfyscm3qqy", + "ownerAddress": "shareledger1u4g2pvuq569gtcclvnmrwxek9hcpzfyscm3qqy", + "extraData": "" + } + }, + { + "id": "shareledger1u4nckcmwg852lj0jxn2t33r6njhua24splftep", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u4nckcmwg852lj0jxn2t33r6njhua24splftep", + "ownerAddress": "shareledger1u4nckcmwg852lj0jxn2t33r6njhua24splftep", + "extraData": "" + } + }, + { + "id": "shareledger1u5erkaezvsmdk5rccjuxrleh23v9qmu0k7r2r0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u5erkaezvsmdk5rccjuxrleh23v9qmu0k7r2r0", + "ownerAddress": "shareledger1u5erkaezvsmdk5rccjuxrleh23v9qmu0k7r2r0", + "extraData": "" + } + }, + { + "id": "shareledger1u6hwfkjfpnuv6y93pwmdl54sfxny5lzrw2erac", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u6hwfkjfpnuv6y93pwmdl54sfxny5lzrw2erac", + "ownerAddress": "shareledger1u6hwfkjfpnuv6y93pwmdl54sfxny5lzrw2erac", + "extraData": "" + } + }, + { + "id": "shareledger1u846hgac04v95xltz6mauy4p02f6wmj9e6q8c7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u846hgac04v95xltz6mauy4p02f6wmj9e6q8c7", + "ownerAddress": "shareledger1u846hgac04v95xltz6mauy4p02f6wmj9e6q8c7", + "extraData": "" + } + }, + { + "id": "shareledger1u88djd7v2gekzk7cmqyvmvwf02224fcr92as0x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u88djd7v2gekzk7cmqyvmvwf02224fcr92as0x", + "ownerAddress": "shareledger1u88djd7v2gekzk7cmqyvmvwf02224fcr92as0x", + "extraData": "" + } + }, + { + "id": "shareledger1u932vplea0ks396czse7xsvexejqdakryy9xzt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1u932vplea0ks396czse7xsvexejqdakryy9xzt", + "ownerAddress": "shareledger1u932vplea0ks396czse7xsvexejqdakryy9xzt", + "extraData": "" + } + }, + { + "id": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "ownerAddress": "shareledger1uaktwhakqf600ezg8pu7f5rcw3q50904txrqgq", + "extraData": "" + } + }, + { + "id": "shareledger1uaur8e08n65fmcas54k59qcchpcj4dnpvqkx6m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uaur8e08n65fmcas54k59qcchpcj4dnpvqkx6m", + "ownerAddress": "shareledger1uaur8e08n65fmcas54k59qcchpcj4dnpvqkx6m", + "extraData": "" + } + }, + { + "id": "shareledger1uc5krt07fw2s074xk9kmnpzv5xaw7r7n05f5w9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uc5krt07fw2s074xk9kmnpzv5xaw7r7n05f5w9", + "ownerAddress": "shareledger1uc5krt07fw2s074xk9kmnpzv5xaw7r7n05f5w9", + "extraData": "" + } + }, + { + "id": "shareledger1ucqn8eyskcr60wdqcwzvzk0h5rmqg9w0z8u6sv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ucqn8eyskcr60wdqcwzvzk0h5rmqg9w0z8u6sv", + "ownerAddress": "shareledger1ucqn8eyskcr60wdqcwzvzk0h5rmqg9w0z8u6sv", + "extraData": "" + } + }, + { + "id": "shareledger1ucw4fvxdzasgayct0yxgjgz3r74uzz3ryz54xv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ucw4fvxdzasgayct0yxgjgz3r74uzz3ryz54xv", + "ownerAddress": "shareledger1ucw4fvxdzasgayct0yxgjgz3r74uzz3ryz54xv", + "extraData": "" + } + }, + { + "id": "shareledger1ucz4mwqcqwmfqnz3ex3hz69p6ufu7u5hcymynq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ucz4mwqcqwmfqnz3ex3hz69p6ufu7u5hcymynq", + "ownerAddress": "shareledger1ucz4mwqcqwmfqnz3ex3hz69p6ufu7u5hcymynq", + "extraData": "" + } + }, + { + "id": "shareledger1udquwelyxw4tdmh7g0educlk8kwzcx0zt0dscy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1udquwelyxw4tdmh7g0educlk8kwzcx0zt0dscy", + "ownerAddress": "shareledger1udquwelyxw4tdmh7g0educlk8kwzcx0zt0dscy", + "extraData": "" + } + }, + { + "id": "shareledger1udradyn7yklmdulv6hyltmgj622c9pltrt8tfy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1udradyn7yklmdulv6hyltmgj622c9pltrt8tfy", + "ownerAddress": "shareledger1udradyn7yklmdulv6hyltmgj622c9pltrt8tfy", + "extraData": "" + } + }, + { + "id": "shareledger1uehqy2axpe2skap6qykpgvxm8u20mtyx4z57jr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uehqy2axpe2skap6qykpgvxm8u20mtyx4z57jr", + "ownerAddress": "shareledger1uehqy2axpe2skap6qykpgvxm8u20mtyx4z57jr", + "extraData": "" + } + }, + { + "id": "shareledger1uerqa59yqy9dckqppqvaqh7mfj2rf276zcxaww", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uerqa59yqy9dckqppqvaqh7mfj2rf276zcxaww", + "ownerAddress": "shareledger1uerqa59yqy9dckqppqvaqh7mfj2rf276zcxaww", + "extraData": "" + } + }, + { + "id": "shareledger1ufdrlsrt4cpzvht8gmcfqwefxa0q2ea654w853", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ufdrlsrt4cpzvht8gmcfqwefxa0q2ea654w853", + "ownerAddress": "shareledger1ufdrlsrt4cpzvht8gmcfqwefxa0q2ea654w853", + "extraData": "" + } + }, + { + "id": "shareledger1uffha0dmt2vmzhw6ukd96qu4zxsqs0rdpw6ugg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uffha0dmt2vmzhw6ukd96qu4zxsqs0rdpw6ugg", + "ownerAddress": "shareledger1uffha0dmt2vmzhw6ukd96qu4zxsqs0rdpw6ugg", + "extraData": "" + } + }, + { + "id": "shareledger1ufmt79d7vh9qa35tlwwmlzdl4ps5ne7wcr7cas", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ufmt79d7vh9qa35tlwwmlzdl4ps5ne7wcr7cas", + "ownerAddress": "shareledger1ufmt79d7vh9qa35tlwwmlzdl4ps5ne7wcr7cas", + "extraData": "" + } + }, + { + "id": "shareledger1ug3ma2p5nak5kh7dt89aedmkktuf7aud06j7uk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ug3ma2p5nak5kh7dt89aedmkktuf7aud06j7uk", + "ownerAddress": "shareledger1ug3ma2p5nak5kh7dt89aedmkktuf7aud06j7uk", + "extraData": "" + } + }, + { + "id": "shareledger1ugd4p2pyhrf8ve6v9l4cxs6n5qrfrxcpthmkep", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ugd4p2pyhrf8ve6v9l4cxs6n5qrfrxcpthmkep", + "ownerAddress": "shareledger1ugd4p2pyhrf8ve6v9l4cxs6n5qrfrxcpthmkep", + "extraData": "" + } + }, + { + "id": "shareledger1uh8fvnnv5c43z4d7k2h7rpcunuhhlnq57f2s26", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uh8fvnnv5c43z4d7k2h7rpcunuhhlnq57f2s26", + "ownerAddress": "shareledger1uh8fvnnv5c43z4d7k2h7rpcunuhhlnq57f2s26", + "extraData": "" + } + }, + { + "id": "shareledger1uhtpqpg3qlud3xnnqnkcsth2n9ssdp3n2vxsl0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uhtpqpg3qlud3xnnqnkcsth2n9ssdp3n2vxsl0", + "ownerAddress": "shareledger1uhtpqpg3qlud3xnnqnkcsth2n9ssdp3n2vxsl0", + "extraData": "" + } + }, + { + "id": "shareledger1uk0hqza88w65pgffhnxxecy9e6w4vdxqjjqz0v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uk0hqza88w65pgffhnxxecy9e6w4vdxqjjqz0v", + "ownerAddress": "shareledger1uk0hqza88w65pgffhnxxecy9e6w4vdxqjjqz0v", + "extraData": "" + } + }, + { + "id": "shareledger1uk8750mlsn0fg5xtzcq9ulkvhhrj78e2ze67nl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uk8750mlsn0fg5xtzcq9ulkvhhrj78e2ze67nl", + "ownerAddress": "shareledger1uk8750mlsn0fg5xtzcq9ulkvhhrj78e2ze67nl", + "extraData": "" + } + }, + { + "id": "shareledger1ukhzurl94qjt4354r5lg0mau652fhwpnughmzq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ukhzurl94qjt4354r5lg0mau652fhwpnughmzq", + "ownerAddress": "shareledger1ukhzurl94qjt4354r5lg0mau652fhwpnughmzq", + "extraData": "" + } + }, + { + "id": "shareledger1ukyw0n8gqxf7dt7eafgrvyrn53p7xqjs3akt08", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ukyw0n8gqxf7dt7eafgrvyrn53p7xqjs3akt08", + "ownerAddress": "shareledger1ukyw0n8gqxf7dt7eafgrvyrn53p7xqjs3akt08", + "extraData": "" + } + }, + { + "id": "shareledger1ulehyj94ngp36w687gyj8hswpfcrtr7mawsmtk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ulehyj94ngp36w687gyj8hswpfcrtr7mawsmtk", + "ownerAddress": "shareledger1ulehyj94ngp36w687gyj8hswpfcrtr7mawsmtk", + "extraData": "" + } + }, + { + "id": "shareledger1ulmfvmxqu3wwnpw4vv7fndlpn926evzg64crp9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ulmfvmxqu3wwnpw4vv7fndlpn926evzg64crp9", + "ownerAddress": "shareledger1ulmfvmxqu3wwnpw4vv7fndlpn926evzg64crp9", + "extraData": "" + } + }, + { + "id": "shareledger1uly0tnm0vqp7ny2zdvuphgchrdrxmnejehxjv8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uly0tnm0vqp7ny2zdvuphgchrdrxmnejehxjv8", + "ownerAddress": "shareledger1uly0tnm0vqp7ny2zdvuphgchrdrxmnejehxjv8", + "extraData": "" + } + }, + { + "id": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "ownerAddress": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "extraData": "" + } + }, + { + "id": "shareledger1unumxvyvsgkxn3s9c0fj3f7thpv2j0v5z0d48x", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1unumxvyvsgkxn3s9c0fj3f7thpv2j0v5z0d48x", + "ownerAddress": "shareledger1unumxvyvsgkxn3s9c0fj3f7thpv2j0v5z0d48x", + "extraData": "" + } + }, + { + "id": "shareledger1up2qks2t3nmp34asr9mc8ppxlv8r8lzl0u2xpy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1up2qks2t3nmp34asr9mc8ppxlv8r8lzl0u2xpy", + "ownerAddress": "shareledger1up2qks2t3nmp34asr9mc8ppxlv8r8lzl0u2xpy", + "extraData": "" + } + }, + { + "id": "shareledger1upd2dv2c7t83tzcqky78ntsas73luvn47q2el8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1upd2dv2c7t83tzcqky78ntsas73luvn47q2el8", + "ownerAddress": "shareledger1upd2dv2c7t83tzcqky78ntsas73luvn47q2el8", + "extraData": "" + } + }, + { + "id": "shareledger1upepyk2nvuzm93jtdhdjpg33qqxxnjsckgpp38", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1upepyk2nvuzm93jtdhdjpg33qqxxnjsckgpp38", + "ownerAddress": "shareledger1upepyk2nvuzm93jtdhdjpg33qqxxnjsckgpp38", + "extraData": "" + } + }, + { + "id": "shareledger1upg9wqkm2dr7yznjps8apg9yhgd69v48qncxnp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1upg9wqkm2dr7yznjps8apg9yhgd69v48qncxnp", + "ownerAddress": "shareledger1upg9wqkm2dr7yznjps8apg9yhgd69v48qncxnp", + "extraData": "" + } + }, + { + "id": "shareledger1upmyuaj8x9ed2a0vxeh84p46p4nlk89repmgvm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1upmyuaj8x9ed2a0vxeh84p46p4nlk89repmgvm", + "ownerAddress": "shareledger1upmyuaj8x9ed2a0vxeh84p46p4nlk89repmgvm", + "extraData": "" + } + }, + { + "id": "shareledger1upzf0vswhnzscdhll26uf97zx0tnrchsmvs9gn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1upzf0vswhnzscdhll26uf97zx0tnrchsmvs9gn", + "ownerAddress": "shareledger1upzf0vswhnzscdhll26uf97zx0tnrchsmvs9gn", + "extraData": "" + } + }, + { + "id": "shareledger1uqlue2e7lrr8j4dyxkcrf6nuq684utlgrv5ehm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uqlue2e7lrr8j4dyxkcrf6nuq684utlgrv5ehm", + "ownerAddress": "shareledger1uqlue2e7lrr8j4dyxkcrf6nuq684utlgrv5ehm", + "extraData": "" + } + }, + { + "id": "shareledger1ur3nrdz37j63zkkvyvf56d9nt8cmsfvtu42lq0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ur3nrdz37j63zkkvyvf56d9nt8cmsfvtu42lq0", + "ownerAddress": "shareledger1ur3nrdz37j63zkkvyvf56d9nt8cmsfvtu42lq0", + "extraData": "" + } + }, + { + "id": "shareledger1urn6au0uf0ewx7sa78h5necraqlzdqa0te4dtd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1urn6au0uf0ewx7sa78h5necraqlzdqa0te4dtd", + "ownerAddress": "shareledger1urn6au0uf0ewx7sa78h5necraqlzdqa0te4dtd", + "extraData": "" + } + }, + { + "id": "shareledger1ury8u5hacpht7gxl9kc6yxj0e6d7jy835ghrkn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ury8u5hacpht7gxl9kc6yxj0e6d7jy835ghrkn", + "ownerAddress": "shareledger1ury8u5hacpht7gxl9kc6yxj0e6d7jy835ghrkn", + "extraData": "" + } + }, + { + "id": "shareledger1us8f8pyewmdfgrqjwda7g04jzck8gjsc48z56y", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1us8f8pyewmdfgrqjwda7g04jzck8gjsc48z56y", + "ownerAddress": "shareledger1us8f8pyewmdfgrqjwda7g04jzck8gjsc48z56y", + "extraData": "" + } + }, + { + "id": "shareledger1usxpd8zwrcw6snhmmjkth9rt7p4z7wcm2yqzcz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1usxpd8zwrcw6snhmmjkth9rt7p4z7wcm2yqzcz", + "ownerAddress": "shareledger1usxpd8zwrcw6snhmmjkth9rt7p4z7wcm2yqzcz", + "extraData": "" + } + }, + { + "id": "shareledger1uszpjyzvzwjm6zxuchgeh978j36sc86yvxak6u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uszpjyzvzwjm6zxuchgeh978j36sc86yvxak6u", + "ownerAddress": "shareledger1uszpjyzvzwjm6zxuchgeh978j36sc86yvxak6u", + "extraData": "" + } + }, + { + "id": "shareledger1ut8vugvkyry98ka0ezdgn8yamaztrayu4j2ec3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ut8vugvkyry98ka0ezdgn8yamaztrayu4j2ec3", + "ownerAddress": "shareledger1ut8vugvkyry98ka0ezdgn8yamaztrayu4j2ec3", + "extraData": "" + } + }, + { + "id": "shareledger1uu8f9gkn9699fryp0axa02wjnl2ldzwkzvsa49", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uu8f9gkn9699fryp0axa02wjnl2ldzwkzvsa49", + "ownerAddress": "shareledger1uu8f9gkn9699fryp0axa02wjnl2ldzwkzvsa49", + "extraData": "" + } + }, + { + "id": "shareledger1uvg9mwg7ndka3eae4mh6q7xjpd76cr866wfrkl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uvg9mwg7ndka3eae4mh6q7xjpd76cr866wfrkl", + "ownerAddress": "shareledger1uvg9mwg7ndka3eae4mh6q7xjpd76cr866wfrkl", + "extraData": "" + } + }, + { + "id": "shareledger1uvgyutaeew50dszm6v0sja8cuc2hkfef4pgd6g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uvgyutaeew50dszm6v0sja8cuc2hkfef4pgd6g", + "ownerAddress": "shareledger1uvgyutaeew50dszm6v0sja8cuc2hkfef4pgd6g", + "extraData": "" + } + }, + { + "id": "shareledger1uvvssu8yklvex5gaq80qgnr0keq8682d84kcga", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uvvssu8yklvex5gaq80qgnr0keq8682d84kcga", + "ownerAddress": "shareledger1uvvssu8yklvex5gaq80qgnr0keq8682d84kcga", + "extraData": "" + } + }, + { + "id": "shareledger1uwlrrzugr69x9wvh2na2c9c3atx8re0pq0pj04", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uwlrrzugr69x9wvh2na2c9c3atx8re0pq0pj04", + "ownerAddress": "shareledger1uwlrrzugr69x9wvh2na2c9c3atx8re0pq0pj04", + "extraData": "" + } + }, + { + "id": "shareledger1uwxsrk2j33lcp00n5xyfcwcu2d7hew8lwuw55v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uwxsrk2j33lcp00n5xyfcwcu2d7hew8lwuw55v", + "ownerAddress": "shareledger1uwxsrk2j33lcp00n5xyfcwcu2d7hew8lwuw55v", + "extraData": "" + } + }, + { + "id": "shareledger1uwyag603vjnxhtehe83qua9n0x9aztmkk9ve23", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uwyag603vjnxhtehe83qua9n0x9aztmkk9ve23", + "ownerAddress": "shareledger1uwyag603vjnxhtehe83qua9n0x9aztmkk9ve23", + "extraData": "" + } + }, + { + "id": "shareledger1ux4m288agwel4fg7vhesmuyf286qv9v7k30vk7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ux4m288agwel4fg7vhesmuyf286qv9v7k30vk7", + "ownerAddress": "shareledger1ux4m288agwel4fg7vhesmuyf286qv9v7k30vk7", + "extraData": "" + } + }, + { + "id": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "ownerAddress": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "extraData": "" + } + }, + { + "id": "shareledger1uxvnd2cpx2dwszd833e70phvvlce4zrv32d6mt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uxvnd2cpx2dwszd833e70phvvlce4zrv32d6mt", + "ownerAddress": "shareledger1uxvnd2cpx2dwszd833e70phvvlce4zrv32d6mt", + "extraData": "" + } + }, + { + "id": "shareledger1uyf03m2emmjemr8fexv25te4zx9xk4wndhlfqz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uyf03m2emmjemr8fexv25te4zx9xk4wndhlfqz", + "ownerAddress": "shareledger1uyf03m2emmjemr8fexv25te4zx9xk4wndhlfqz", + "extraData": "" + } + }, + { + "id": "shareledger1uyrlnry5un3rwvavnkk3xnq9csw8k3t6fx3frv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uyrlnry5un3rwvavnkk3xnq9csw8k3t6fx3frv", + "ownerAddress": "shareledger1uyrlnry5un3rwvavnkk3xnq9csw8k3t6fx3frv", + "extraData": "" + } + }, + { + "id": "shareledger1uyz8t9eg38zwlmjyy6me52uw35lenuqrww3grq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uyz8t9eg38zwlmjyy6me52uw35lenuqrww3grq", + "ownerAddress": "shareledger1uyz8t9eg38zwlmjyy6me52uw35lenuqrww3grq", + "extraData": "" + } + }, + { + "id": "shareledger1uyzkqh70z5kvt3r6rf74el3l4da6ea49pauw43", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uyzkqh70z5kvt3r6rf74el3l4da6ea49pauw43", + "ownerAddress": "shareledger1uyzkqh70z5kvt3r6rf74el3l4da6ea49pauw43", + "extraData": "" + } + }, + { + "id": "shareledger1uznvuenlskxa5xrl3tpelhknprc0u07nyww8tv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uznvuenlskxa5xrl3tpelhknprc0u07nyww8tv", + "ownerAddress": "shareledger1uznvuenlskxa5xrl3tpelhknprc0u07nyww8tv", + "extraData": "" + } + }, + { + "id": "shareledger1uzsql7rxx5q7l863e9r3dmgmspxxmdeym675dd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1uzsql7rxx5q7l863e9r3dmgmspxxmdeym675dd", + "ownerAddress": "shareledger1uzsql7rxx5q7l863e9r3dmgmspxxmdeym675dd", + "extraData": "" + } + }, + { + "id": "shareledger1v0k7vum7vy3wgtl34zlfkkpqzmryz2vkr0sm62", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v0k7vum7vy3wgtl34zlfkkpqzmryz2vkr0sm62", + "ownerAddress": "shareledger1v0k7vum7vy3wgtl34zlfkkpqzmryz2vkr0sm62", + "extraData": "" + } + }, + { + "id": "shareledger1v0ksg9rrcrspr0dplylp869gnfxhcv2mn5rr3n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v0ksg9rrcrspr0dplylp869gnfxhcv2mn5rr3n", + "ownerAddress": "shareledger1v0ksg9rrcrspr0dplylp869gnfxhcv2mn5rr3n", + "extraData": "" + } + }, + { + "id": "shareledger1v22wed4tvn5kfjclm0230xx3544mjmd0e6k5e4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v22wed4tvn5kfjclm0230xx3544mjmd0e6k5e4", + "ownerAddress": "shareledger1v22wed4tvn5kfjclm0230xx3544mjmd0e6k5e4", + "extraData": "" + } + }, + { + "id": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "ownerAddress": "shareledger1v29m2m0q9ytwsy43xk3s2kyz2fy8us8z2sqnxh", + "extraData": "" + } + }, + { + "id": "shareledger1v2cxt5hwtsdlsjc0sgkxwgj2c46a2ac6jmaryf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v2cxt5hwtsdlsjc0sgkxwgj2c46a2ac6jmaryf", + "ownerAddress": "shareledger1v2cxt5hwtsdlsjc0sgkxwgj2c46a2ac6jmaryf", + "extraData": "" + } + }, + { + "id": "shareledger1v2m8cyzccshkr8ptjy5wsmv2z3h5zwsh3q26h7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v2m8cyzccshkr8ptjy5wsmv2z3h5zwsh3q26h7", + "ownerAddress": "shareledger1v2m8cyzccshkr8ptjy5wsmv2z3h5zwsh3q26h7", + "extraData": "" + } + }, + { + "id": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "ownerAddress": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "extraData": "" + } + }, + { + "id": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "ownerAddress": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "extraData": "" + } + }, + { + "id": "shareledger1v6x0gzr4qcr570syfzmd7xcd2ev5fpyyzsnfl6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v6x0gzr4qcr570syfzmd7xcd2ev5fpyyzsnfl6", + "ownerAddress": "shareledger1v6x0gzr4qcr570syfzmd7xcd2ev5fpyyzsnfl6", + "extraData": "" + } + }, + { + "id": "shareledger1v80qza9dmvjtf5pwjgmw4wvxra7q53tzn9jq68", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v80qza9dmvjtf5pwjgmw4wvxra7q53tzn9jq68", + "ownerAddress": "shareledger1v80qza9dmvjtf5pwjgmw4wvxra7q53tzn9jq68", + "extraData": "" + } + }, + { + "id": "shareledger1v82ae2hsgxxztxzr0n380aux4546xerq87fdtv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v82ae2hsgxxztxzr0n380aux4546xerq87fdtv", + "ownerAddress": "shareledger1v82ae2hsgxxztxzr0n380aux4546xerq87fdtv", + "extraData": "" + } + }, + { + "id": "shareledger1v8cjs8xkjn8uszqd0lmm56e7hdj8dyzjlsdgdt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v8cjs8xkjn8uszqd0lmm56e7hdj8dyzjlsdgdt", + "ownerAddress": "shareledger1v8cjs8xkjn8uszqd0lmm56e7hdj8dyzjlsdgdt", + "extraData": "" + } + }, + { + "id": "shareledger1v8u8mt7m87pzymzls2dav6y3z82nguyd52gpau", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v8u8mt7m87pzymzls2dav6y3z82nguyd52gpau", + "ownerAddress": "shareledger1v8u8mt7m87pzymzls2dav6y3z82nguyd52gpau", + "extraData": "" + } + }, + { + "id": "shareledger1v8vw7fwz0drl9gc85evfn2xgarl3ukstrepq6t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1v8vw7fwz0drl9gc85evfn2xgarl3ukstrepq6t", + "ownerAddress": "shareledger1v8vw7fwz0drl9gc85evfn2xgarl3ukstrepq6t", + "extraData": "" + } + }, + { + "id": "shareledger1vcf7aww7ey9vqllyv4htfupvqa2sxp44r3pvwf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vcf7aww7ey9vqllyv4htfupvqa2sxp44r3pvwf", + "ownerAddress": "shareledger1vcf7aww7ey9vqllyv4htfupvqa2sxp44r3pvwf", + "extraData": "" + } + }, + { + "id": "shareledger1vchp0c530m3k5rsur7ztq6vdfx9tcj2e3d4vfg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vchp0c530m3k5rsur7ztq6vdfx9tcj2e3d4vfg", + "ownerAddress": "shareledger1vchp0c530m3k5rsur7ztq6vdfx9tcj2e3d4vfg", + "extraData": "" + } + }, + { + "id": "shareledger1vcnp90dxhaxhxya7qn9gudy4tszpw26tr0hm3n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vcnp90dxhaxhxya7qn9gudy4tszpw26tr0hm3n", + "ownerAddress": "shareledger1vcnp90dxhaxhxya7qn9gudy4tszpw26tr0hm3n", + "extraData": "" + } + }, + { + "id": "shareledger1vcuh3kvn2rc9ffnhnuhfzn7vge7gjets54fzmp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vcuh3kvn2rc9ffnhnuhfzn7vge7gjets54fzmp", + "ownerAddress": "shareledger1vcuh3kvn2rc9ffnhnuhfzn7vge7gjets54fzmp", + "extraData": "" + } + }, + { + "id": "shareledger1vd2jtgtd9jy7fx25w3sch2y0apz0ekxadjrz9h", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vd2jtgtd9jy7fx25w3sch2y0apz0ekxadjrz9h", + "ownerAddress": "shareledger1vd2jtgtd9jy7fx25w3sch2y0apz0ekxadjrz9h", + "extraData": "" + } + }, + { + "id": "shareledger1vdfr6gvs60w5gqpz4hl3kglsuvl5r0retg92y6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vdfr6gvs60w5gqpz4hl3kglsuvl5r0retg92y6", + "ownerAddress": "shareledger1vdfr6gvs60w5gqpz4hl3kglsuvl5r0retg92y6", + "extraData": "" + } + }, + { + "id": "shareledger1vdzm2tfvwwegtk0j6qyu8v7gusak8uxngk5wng", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vdzm2tfvwwegtk0j6qyu8v7gusak8uxngk5wng", + "ownerAddress": "shareledger1vdzm2tfvwwegtk0j6qyu8v7gusak8uxngk5wng", + "extraData": "" + } + }, + { + "id": "shareledger1veqnx3ceuemryzpfz8n7mygujl6j5zmnz6pnhh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1veqnx3ceuemryzpfz8n7mygujl6j5zmnz6pnhh", + "ownerAddress": "shareledger1veqnx3ceuemryzpfz8n7mygujl6j5zmnz6pnhh", + "extraData": "" + } + }, + { + "id": "shareledger1vf57yzws9tn8qcfdf6cjw0u47x4e46rfqeldvm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vf57yzws9tn8qcfdf6cjw0u47x4e46rfqeldvm", + "ownerAddress": "shareledger1vf57yzws9tn8qcfdf6cjw0u47x4e46rfqeldvm", + "extraData": "" + } + }, + { + "id": "shareledger1vfrh43z3hmygdl928ujtd4rglsluzmh2aku6wr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vfrh43z3hmygdl928ujtd4rglsluzmh2aku6wr", + "ownerAddress": "shareledger1vfrh43z3hmygdl928ujtd4rglsluzmh2aku6wr", + "extraData": "" + } + }, + { + "id": "shareledger1vjj2ufstr4amqr6pp25ywj8y0qaeyd8rc92as9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vjj2ufstr4amqr6pp25ywj8y0qaeyd8rc92as9", + "ownerAddress": "shareledger1vjj2ufstr4amqr6pp25ywj8y0qaeyd8rc92as9", + "extraData": "" + } + }, + { + "id": "shareledger1vjrqur33scq29s2zmek99rm3yck84rq2dkraxn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vjrqur33scq29s2zmek99rm3yck84rq2dkraxn", + "ownerAddress": "shareledger1vjrqur33scq29s2zmek99rm3yck84rq2dkraxn", + "extraData": "" + } + }, + { + "id": "shareledger1vjwsmlu33vm66vsscuenjnf6ajsspv9ge2keg8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vjwsmlu33vm66vsscuenjnf6ajsspv9ge2keg8", + "ownerAddress": "shareledger1vjwsmlu33vm66vsscuenjnf6ajsspv9ge2keg8", + "extraData": "" + } + }, + { + "id": "shareledger1vk05fvpa4jq9p20kw3dxx4c283xal8nt62szkm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vk05fvpa4jq9p20kw3dxx4c283xal8nt62szkm", + "ownerAddress": "shareledger1vk05fvpa4jq9p20kw3dxx4c283xal8nt62szkm", + "extraData": "" + } + }, + { + "id": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "ownerAddress": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "extraData": "" + } + }, + { + "id": "shareledger1vl5cu8qrakc9r4w7dpsa5prwqwv90j8lufs575", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vl5cu8qrakc9r4w7dpsa5prwqwv90j8lufs575", + "ownerAddress": "shareledger1vl5cu8qrakc9r4w7dpsa5prwqwv90j8lufs575", + "extraData": "" + } + }, + { + "id": "shareledger1vlpwd2g0natt3sm54tdwfcecfs69yrfu26hcel", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vlpwd2g0natt3sm54tdwfcecfs69yrfu26hcel", + "ownerAddress": "shareledger1vlpwd2g0natt3sm54tdwfcecfs69yrfu26hcel", + "extraData": "" + } + }, + { + "id": "shareledger1vmujdd8663qwkcnam0chx3t228gk68tyuzqffh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vmujdd8663qwkcnam0chx3t228gk68tyuzqffh", + "ownerAddress": "shareledger1vmujdd8663qwkcnam0chx3t228gk68tyuzqffh", + "extraData": "" + } + }, + { + "id": "shareledger1vnl7jg6cap2um6wug8s6t7ppd9e9v7pjm2jrmn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vnl7jg6cap2um6wug8s6t7ppd9e9v7pjm2jrmn", + "ownerAddress": "shareledger1vnl7jg6cap2um6wug8s6t7ppd9e9v7pjm2jrmn", + "extraData": "" + } + }, + { + "id": "shareledger1vnm6g5f3ng3kd3em653c4vhxjyn0s6l9fmfa0v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vnm6g5f3ng3kd3em653c4vhxjyn0s6l9fmfa0v", + "ownerAddress": "shareledger1vnm6g5f3ng3kd3em653c4vhxjyn0s6l9fmfa0v", + "extraData": "" + } + }, + { + "id": "shareledger1vnxjhsesf9qd0w7g9etf2azk9srpd3t9pgr47n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vnxjhsesf9qd0w7g9etf2azk9srpd3t9pgr47n", + "ownerAddress": "shareledger1vnxjhsesf9qd0w7g9etf2azk9srpd3t9pgr47n", + "extraData": "" + } + }, + { + "id": "shareledger1vp82d4swhcwags2xnyplc9zn6lwdefprt2y4mt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vp82d4swhcwags2xnyplc9zn6lwdefprt2y4mt", + "ownerAddress": "shareledger1vp82d4swhcwags2xnyplc9zn6lwdefprt2y4mt", + "extraData": "" + } + }, + { + "id": "shareledger1vp8szhyzwyunec48g9apw3vnr38m276s8yfsh0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vp8szhyzwyunec48g9apw3vnr38m276s8yfsh0", + "ownerAddress": "shareledger1vp8szhyzwyunec48g9apw3vnr38m276s8yfsh0", + "extraData": "" + } + }, + { + "id": "shareledger1vpp0658df52rmjp66h0pzkqy48u6pwkkvvxky5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vpp0658df52rmjp66h0pzkqy48u6pwkkvvxky5", + "ownerAddress": "shareledger1vpp0658df52rmjp66h0pzkqy48u6pwkkvvxky5", + "extraData": "" + } + }, + { + "id": "shareledger1vq57ufdr3fzs4ltrfme57zsakv4wfu6fg03u4r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vq57ufdr3fzs4ltrfme57zsakv4wfu6fg03u4r", + "ownerAddress": "shareledger1vq57ufdr3fzs4ltrfme57zsakv4wfu6fg03u4r", + "extraData": "" + } + }, + { + "id": "shareledger1vquyutfwqnur5w0v9udcae69n2y2gjqvkxkkr8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vquyutfwqnur5w0v9udcae69n2y2gjqvkxkkr8", + "ownerAddress": "shareledger1vquyutfwqnur5w0v9udcae69n2y2gjqvkxkkr8", + "extraData": "" + } + }, + { + "id": "shareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "ownerAddress": "shareledger1vr3c04s6e4a43mfftzc8sa59sajg7eu77z354a", + "extraData": "" + } + }, + { + "id": "shareledger1vrjp4kxcd2vyjfl27dp9pmyzcw28nrddhjgknx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vrjp4kxcd2vyjfl27dp9pmyzcw28nrddhjgknx", + "ownerAddress": "shareledger1vrjp4kxcd2vyjfl27dp9pmyzcw28nrddhjgknx", + "extraData": "" + } + }, + { + "id": "shareledger1vrvexhc0tcctsdzjyjzznljm0lx59a4l3wd3m0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vrvexhc0tcctsdzjyjzznljm0lx59a4l3wd3m0", + "ownerAddress": "shareledger1vrvexhc0tcctsdzjyjzznljm0lx59a4l3wd3m0", + "extraData": "" + } + }, + { + "id": "shareledger1vt9cmu30jh0tz22pxps729y868adknhnrczjsg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vt9cmu30jh0tz22pxps729y868adknhnrczjsg", + "ownerAddress": "shareledger1vt9cmu30jh0tz22pxps729y868adknhnrczjsg", + "extraData": "" + } + }, + { + "id": "shareledger1vvg3hr4ax4r7fz72ehg3035sqhdtjnexw888hu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vvg3hr4ax4r7fz72ehg3035sqhdtjnexw888hu", + "ownerAddress": "shareledger1vvg3hr4ax4r7fz72ehg3035sqhdtjnexw888hu", + "extraData": "" + } + }, + { + "id": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "ownerAddress": "shareledger1vvzp7c09upm25r9njd4p9x45hkjr6r8usl97rs", + "extraData": "" + } + }, + { + "id": "shareledger1vw0gkxf8v4c0ghg44rpav72p5wysgnc0mu9jmy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vw0gkxf8v4c0ghg44rpav72p5wysgnc0mu9jmy", + "ownerAddress": "shareledger1vw0gkxf8v4c0ghg44rpav72p5wysgnc0mu9jmy", + "extraData": "" + } + }, + { + "id": "shareledger1vwxn6g2p88xz8yvfq8p9wkwrzw4mmzknwdk4y0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vwxn6g2p88xz8yvfq8p9wkwrzw4mmzknwdk4y0", + "ownerAddress": "shareledger1vwxn6g2p88xz8yvfq8p9wkwrzw4mmzknwdk4y0", + "extraData": "" + } + }, + { + "id": "shareledger1vx8q02enr4688mx5vgvs8hh90wap2eq3nnwdzp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vx8q02enr4688mx5vgvs8hh90wap2eq3nnwdzp", + "ownerAddress": "shareledger1vx8q02enr4688mx5vgvs8hh90wap2eq3nnwdzp", + "extraData": "" + } + }, + { + "id": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "ownerAddress": "shareledger1vxlv5y9z9caveymrn30k0zv48e0g07qzav2687", + "extraData": "" + } + }, + { + "id": "shareledger1vy0gvf9dzypa6j4ycvf0s4tsyglyqnlcf9dxjf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vy0gvf9dzypa6j4ycvf0s4tsyglyqnlcf9dxjf", + "ownerAddress": "shareledger1vy0gvf9dzypa6j4ycvf0s4tsyglyqnlcf9dxjf", + "extraData": "" + } + }, + { + "id": "shareledger1vye93g92zlhvza3295egw3ygrejwdlppnw2tt3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1vye93g92zlhvza3295egw3ygrejwdlppnw2tt3", + "ownerAddress": "shareledger1vye93g92zlhvza3295egw3ygrejwdlppnw2tt3", + "extraData": "" + } + }, + { + "id": "shareledger1w20lvwretcp9ft4z929mrshdd0ecxq9p8vlzpv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w20lvwretcp9ft4z929mrshdd0ecxq9p8vlzpv", + "ownerAddress": "shareledger1w20lvwretcp9ft4z929mrshdd0ecxq9p8vlzpv", + "extraData": "" + } + }, + { + "id": "shareledger1w35ur3z0wumtseekl2xqc3knzv67ynem9gnrr4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w35ur3z0wumtseekl2xqc3knzv67ynem9gnrr4", + "ownerAddress": "shareledger1w35ur3z0wumtseekl2xqc3knzv67ynem9gnrr4", + "extraData": "" + } + }, + { + "id": "shareledger1w468urhs6q4zwc5hpyjxuef7w5nj3zq3j925lh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w468urhs6q4zwc5hpyjxuef7w5nj3zq3j925lh", + "ownerAddress": "shareledger1w468urhs6q4zwc5hpyjxuef7w5nj3zq3j925lh", + "extraData": "" + } + }, + { + "id": "shareledger1w4dm0nnlrv8qeuaqtgm0f40xzu3hllca4vaxwn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w4dm0nnlrv8qeuaqtgm0f40xzu3hllca4vaxwn", + "ownerAddress": "shareledger1w4dm0nnlrv8qeuaqtgm0f40xzu3hllca4vaxwn", + "extraData": "" + } + }, + { + "id": "shareledger1w5rjfsmupfnyhj78xqf3hd8k3q3vptwgkpdp0t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w5rjfsmupfnyhj78xqf3hd8k3q3vptwgkpdp0t", + "ownerAddress": "shareledger1w5rjfsmupfnyhj78xqf3hd8k3q3vptwgkpdp0t", + "extraData": "" + } + }, + { + "id": "shareledger1w63l5va8m28wh5tuvwm2n60h6ej3n55suajltt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w63l5va8m28wh5tuvwm2n60h6ej3n55suajltt", + "ownerAddress": "shareledger1w63l5va8m28wh5tuvwm2n60h6ej3n55suajltt", + "extraData": "" + } + }, + { + "id": "shareledger1w6lh8dy0w3kvq3jmcr0nypw2nvfjx7ykkl9ryk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w6lh8dy0w3kvq3jmcr0nypw2nvfjx7ykkl9ryk", + "ownerAddress": "shareledger1w6lh8dy0w3kvq3jmcr0nypw2nvfjx7ykkl9ryk", + "extraData": "" + } + }, + { + "id": "shareledger1w6nvs4zzdf8qc9qll60h4faqmz0t7yqx2p2867", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w6nvs4zzdf8qc9qll60h4faqmz0t7yqx2p2867", + "ownerAddress": "shareledger1w6nvs4zzdf8qc9qll60h4faqmz0t7yqx2p2867", + "extraData": "" + } + }, + { + "id": "shareledger1w78zjh5r4y7f9hz3glv28f733v6sj3he83jqal", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w78zjh5r4y7f9hz3glv28f733v6sj3he83jqal", + "ownerAddress": "shareledger1w78zjh5r4y7f9hz3glv28f733v6sj3he83jqal", + "extraData": "" + } + }, + { + "id": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "ownerAddress": "shareledger1w7lrrycwm5mhc96rvn0qejlm3gj9h3ek529ude", + "extraData": "" + } + }, + { + "id": "shareledger1w7tkc3z943mj7kucvsylkzsk05x377z0ym9mhp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w7tkc3z943mj7kucvsylkzsk05x377z0ym9mhp", + "ownerAddress": "shareledger1w7tkc3z943mj7kucvsylkzsk05x377z0ym9mhp", + "extraData": "" + } + }, + { + "id": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "ownerAddress": "shareledger1w89y8zg542lgwm2hafyss0u0jdpt8j6yn0c922", + "extraData": "" + } + }, + { + "id": "shareledger1w8suqktwatn6zkyp04mgpxlkj0m0x5w5rf4xjw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w8suqktwatn6zkyp04mgpxlkj0m0x5w5rf4xjw", + "ownerAddress": "shareledger1w8suqktwatn6zkyp04mgpxlkj0m0x5w5rf4xjw", + "extraData": "" + } + }, + { + "id": "shareledger1w9ae3c6xvgzn88zdy8m3vrgfa000854n6wt040", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1w9ae3c6xvgzn88zdy8m3vrgfa000854n6wt040", + "ownerAddress": "shareledger1w9ae3c6xvgzn88zdy8m3vrgfa000854n6wt040", + "extraData": "" + } + }, + { + "id": "shareledger1wdrnu7wevav342wjc7xz09lyqt0sjycyud5ujf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wdrnu7wevav342wjc7xz09lyqt0sjycyud5ujf", + "ownerAddress": "shareledger1wdrnu7wevav342wjc7xz09lyqt0sjycyud5ujf", + "extraData": "" + } + }, + { + "id": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "ownerAddress": "shareledger1wdsm4q8jlg32f5wux27m9a8p2k6alkr085xvaw", + "extraData": "" + } + }, + { + "id": "shareledger1we276v92dedwz2wccmc2ghse5s63h0s47yzyfw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1we276v92dedwz2wccmc2ghse5s63h0s47yzyfw", + "ownerAddress": "shareledger1we276v92dedwz2wccmc2ghse5s63h0s47yzyfw", + "extraData": "" + } + }, + { + "id": "shareledger1wek0dg5kpfkuxyqsn0yjze6g26awsfegf65pk0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wek0dg5kpfkuxyqsn0yjze6g26awsfegf65pk0", + "ownerAddress": "shareledger1wek0dg5kpfkuxyqsn0yjze6g26awsfegf65pk0", + "extraData": "" + } + }, + { + "id": "shareledger1wevrujawmm5hy3kh8y3ymflteaujxt8sjdpr3f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wevrujawmm5hy3kh8y3ymflteaujxt8sjdpr3f", + "ownerAddress": "shareledger1wevrujawmm5hy3kh8y3ymflteaujxt8sjdpr3f", + "extraData": "" + } + }, + { + "id": "shareledger1wf0dstk2w5xz02usr9wze59fz2judc0evmx70z", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wf0dstk2w5xz02usr9wze59fz2judc0evmx70z", + "ownerAddress": "shareledger1wf0dstk2w5xz02usr9wze59fz2judc0evmx70z", + "extraData": "" + } + }, + { + "id": "shareledger1wfeazymfqdlc5a7g73jpsrmg9vqc5p577avvjc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wfeazymfqdlc5a7g73jpsrmg9vqc5p577avvjc", + "ownerAddress": "shareledger1wfeazymfqdlc5a7g73jpsrmg9vqc5p577avvjc", + "extraData": "" + } + }, + { + "id": "shareledger1wfm4uu0x8p4eucazjcgt0syww8jrpu6gsm5wf3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wfm4uu0x8p4eucazjcgt0syww8jrpu6gsm5wf3", + "ownerAddress": "shareledger1wfm4uu0x8p4eucazjcgt0syww8jrpu6gsm5wf3", + "extraData": "" + } + }, + { + "id": "shareledger1wgep7f9g3czdpvpe0g9yaz2s005h59v7hzs62n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wgep7f9g3czdpvpe0g9yaz2s005h59v7hzs62n", + "ownerAddress": "shareledger1wgep7f9g3czdpvpe0g9yaz2s005h59v7hzs62n", + "extraData": "" + } + }, + { + "id": "shareledger1wgnms32r5xcv8m9zfequxfv0t7n0lr8xv50jx7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wgnms32r5xcv8m9zfequxfv0t7n0lr8xv50jx7", + "ownerAddress": "shareledger1wgnms32r5xcv8m9zfequxfv0t7n0lr8xv50jx7", + "extraData": "" + } + }, + { + "id": "shareledger1wh9g0534d37t8mh475cnqkr7w8yl4tml8d93l5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wh9g0534d37t8mh475cnqkr7w8yl4tml8d93l5", + "ownerAddress": "shareledger1wh9g0534d37t8mh475cnqkr7w8yl4tml8d93l5", + "extraData": "" + } + }, + { + "id": "shareledger1whdm34ltqa26t5xn5ewg305vkwajjkav5sl2kr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1whdm34ltqa26t5xn5ewg305vkwajjkav5sl2kr", + "ownerAddress": "shareledger1whdm34ltqa26t5xn5ewg305vkwajjkav5sl2kr", + "extraData": "" + } + }, + { + "id": "shareledger1wherq35srvwetr6nd8hssjje3l9us7kercms77", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wherq35srvwetr6nd8hssjje3l9us7kercms77", + "ownerAddress": "shareledger1wherq35srvwetr6nd8hssjje3l9us7kercms77", + "extraData": "" + } + }, + { + "id": "shareledger1wjcdl65peaqj3wupsr6yyh0gfj6l0r7r06sl74", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wjcdl65peaqj3wupsr6yyh0gfj6l0r7r06sl74", + "ownerAddress": "shareledger1wjcdl65peaqj3wupsr6yyh0gfj6l0r7r06sl74", + "extraData": "" + } + }, + { + "id": "shareledger1wjlvy2t8xjrnhnnpugy7kn03ftmwv9arec600c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wjlvy2t8xjrnhnnpugy7kn03ftmwv9arec600c", + "ownerAddress": "shareledger1wjlvy2t8xjrnhnnpugy7kn03ftmwv9arec600c", + "extraData": "" + } + }, + { + "id": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "ownerAddress": "shareledger1wjtyvmn8xjf4f9vfgcl4w2skkm6r65xl5s9jac", + "extraData": "" + } + }, + { + "id": "shareledger1wk3zx3n89fj5a4wea3rs79688vdumruqxnl6zk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wk3zx3n89fj5a4wea3rs79688vdumruqxnl6zk", + "ownerAddress": "shareledger1wk3zx3n89fj5a4wea3rs79688vdumruqxnl6zk", + "extraData": "" + } + }, + { + "id": "shareledger1wkm9uywy2juzcld43rvwclak8uqcx29fq2t95g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wkm9uywy2juzcld43rvwclak8uqcx29fq2t95g", + "ownerAddress": "shareledger1wkm9uywy2juzcld43rvwclak8uqcx29fq2t95g", + "extraData": "" + } + }, + { + "id": "shareledger1wkxtlcpaqjej4ytmsu260yr48yjfnkq2a8gs8c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wkxtlcpaqjej4ytmsu260yr48yjfnkq2a8gs8c", + "ownerAddress": "shareledger1wkxtlcpaqjej4ytmsu260yr48yjfnkq2a8gs8c", + "extraData": "" + } + }, + { + "id": "shareledger1wla4ens6xssms4rc4vwrl7wxyny82x3yce6eeu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wla4ens6xssms4rc4vwrl7wxyny82x3yce6eeu", + "ownerAddress": "shareledger1wla4ens6xssms4rc4vwrl7wxyny82x3yce6eeu", + "extraData": "" + } + }, + { + "id": "shareledger1wled7snehavh60akccay79vzhc8nc5kd6llurx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wled7snehavh60akccay79vzhc8nc5kd6llurx", + "ownerAddress": "shareledger1wled7snehavh60akccay79vzhc8nc5kd6llurx", + "extraData": "" + } + }, + { + "id": "shareledger1wmj6ygxm0crs7mwd4wm32adh9akrdskym3p34a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wmj6ygxm0crs7mwd4wm32adh9akrdskym3p34a", + "ownerAddress": "shareledger1wmj6ygxm0crs7mwd4wm32adh9akrdskym3p34a", + "extraData": "" + } + }, + { + "id": "shareledger1wnetwx86duc3fddntd0hjk4m45f8ehzl258xsw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wnetwx86duc3fddntd0hjk4m45f8ehzl258xsw", + "ownerAddress": "shareledger1wnetwx86duc3fddntd0hjk4m45f8ehzl258xsw", + "extraData": "" + } + }, + { + "id": "shareledger1wnt9qksm57sc5dxgd7qevmg7qvsz4nl3065kku", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wnt9qksm57sc5dxgd7qevmg7qvsz4nl3065kku", + "ownerAddress": "shareledger1wnt9qksm57sc5dxgd7qevmg7qvsz4nl3065kku", + "extraData": "" + } + }, + { + "id": "shareledger1wpukjkvpp0zc36anmpmrxpdh9f7wzqx9sm887u", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wpukjkvpp0zc36anmpmrxpdh9f7wzqx9sm887u", + "ownerAddress": "shareledger1wpukjkvpp0zc36anmpmrxpdh9f7wzqx9sm887u", + "extraData": "" + } + }, + { + "id": "shareledger1wsdegaxzrd23a5a8zqa88ex3ck8hdzscy53szy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wsdegaxzrd23a5a8zqa88ex3ck8hdzscy53szy", + "ownerAddress": "shareledger1wsdegaxzrd23a5a8zqa88ex3ck8hdzscy53szy", + "extraData": "" + } + }, + { + "id": "shareledger1wtr7ycz8cn5qhkjevecvsfkxcu6lk73yxt04ma", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wtr7ycz8cn5qhkjevecvsfkxcu6lk73yxt04ma", + "ownerAddress": "shareledger1wtr7ycz8cn5qhkjevecvsfkxcu6lk73yxt04ma", + "extraData": "" + } + }, + { + "id": "shareledger1wvmgjgn9rzlszw7qpfahdw77ppqzm4j4jcyk98", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wvmgjgn9rzlszw7qpfahdw77ppqzm4j4jcyk98", + "ownerAddress": "shareledger1wvmgjgn9rzlszw7qpfahdw77ppqzm4j4jcyk98", + "extraData": "" + } + }, + { + "id": "shareledger1wvnk2amcvpzurkhqy4nn4rqalky94dh25eka6d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wvnk2amcvpzurkhqy4nn4rqalky94dh25eka6d", + "ownerAddress": "shareledger1wvnk2amcvpzurkhqy4nn4rqalky94dh25eka6d", + "extraData": "" + } + }, + { + "id": "shareledger1wx4ktl9tycewavrmajqqeycds9ddm53fpcdxe9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wx4ktl9tycewavrmajqqeycds9ddm53fpcdxe9", + "ownerAddress": "shareledger1wx4ktl9tycewavrmajqqeycds9ddm53fpcdxe9", + "extraData": "" + } + }, + { + "id": "shareledger1wxcxjvqcplcyl2j4ygmxhvpd6xl0datgg3j4rn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wxcxjvqcplcyl2j4ygmxhvpd6xl0datgg3j4rn", + "ownerAddress": "shareledger1wxcxjvqcplcyl2j4ygmxhvpd6xl0datgg3j4rn", + "extraData": "" + } + }, + { + "id": "shareledger1wy8vxvwanycjcs5dhq5kuzs6a2ht0qdwmm8d9a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wy8vxvwanycjcs5dhq5kuzs6a2ht0qdwmm8d9a", + "ownerAddress": "shareledger1wy8vxvwanycjcs5dhq5kuzs6a2ht0qdwmm8d9a", + "extraData": "" + } + }, + { + "id": "shareledger1wylspujc9h79ha89vjx00me4tsuww88petrlg3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wylspujc9h79ha89vjx00me4tsuww88petrlg3", + "ownerAddress": "shareledger1wylspujc9h79ha89vjx00me4tsuww88petrlg3", + "extraData": "" + } + }, + { + "id": "shareledger1wyq32220fe6gw0heq738thp2r948x6rwn7vpva", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wyq32220fe6gw0heq738thp2r948x6rwn7vpva", + "ownerAddress": "shareledger1wyq32220fe6gw0heq738thp2r948x6rwn7vpva", + "extraData": "" + } + }, + { + "id": "shareledger1wyxwpux2gkvhsjeykq6a8frn6rca7g6y2jetwj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1wyxwpux2gkvhsjeykq6a8frn6rca7g6y2jetwj", + "ownerAddress": "shareledger1wyxwpux2gkvhsjeykq6a8frn6rca7g6y2jetwj", + "extraData": "" + } + }, + { + "id": "shareledger1x0kkppd7hnmyqd55k36pvllpxu6kpmu6wjmxrk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x0kkppd7hnmyqd55k36pvllpxu6kpmu6wjmxrk", + "ownerAddress": "shareledger1x0kkppd7hnmyqd55k36pvllpxu6kpmu6wjmxrk", + "extraData": "" + } + }, + { + "id": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "ownerAddress": "shareledger1x2aemrr7568tuxdhhzf84uk8639y9tfxae5gzq", + "extraData": "" + } + }, + { + "id": "shareledger1x2d2x2rvumqm42cu65693ywrudehm3pq53ha7k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x2d2x2rvumqm42cu65693ywrudehm3pq53ha7k", + "ownerAddress": "shareledger1x2d2x2rvumqm42cu65693ywrudehm3pq53ha7k", + "extraData": "" + } + }, + { + "id": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "ownerAddress": "shareledger1x33wu4t0jsel4vngyevpjx79v05c74j7hty535", + "extraData": "" + } + }, + { + "id": "shareledger1x64hagf58kudaj5cxw076dy654l3ksj30r25tm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x64hagf58kudaj5cxw076dy654l3ksj30r25tm", + "ownerAddress": "shareledger1x64hagf58kudaj5cxw076dy654l3ksj30r25tm", + "extraData": "" + } + }, + { + "id": "shareledger1x68t235755ysh23fcetk6zqxqmkqnntttjttzm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x68t235755ysh23fcetk6zqxqmkqnntttjttzm", + "ownerAddress": "shareledger1x68t235755ysh23fcetk6zqxqmkqnntttjttzm", + "extraData": "" + } + }, + { + "id": "shareledger1x6ujm68y0t9sgq6vk2pnxfsmqt8z4zvwdy92z3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x6ujm68y0t9sgq6vk2pnxfsmqt8z4zvwdy92z3", + "ownerAddress": "shareledger1x6ujm68y0t9sgq6vk2pnxfsmqt8z4zvwdy92z3", + "extraData": "" + } + }, + { + "id": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "ownerAddress": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "extraData": "" + } + }, + { + "id": "shareledger1x7n58v9a5g734nyxexmtvh4pt9rvxywn0uc0p2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x7n58v9a5g734nyxexmtvh4pt9rvxywn0uc0p2", + "ownerAddress": "shareledger1x7n58v9a5g734nyxexmtvh4pt9rvxywn0uc0p2", + "extraData": "" + } + }, + { + "id": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "ownerAddress": "shareledger1x7p3clauy2v5fhhkh6qlqg5saq0nea0qz3x6y4", + "extraData": "" + } + }, + { + "id": "shareledger1x84n2ujejj9hxjj8fq9vm7wpzfj866mvl7sc0g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x84n2ujejj9hxjj8fq9vm7wpzfj866mvl7sc0g", + "ownerAddress": "shareledger1x84n2ujejj9hxjj8fq9vm7wpzfj866mvl7sc0g", + "extraData": "" + } + }, + { + "id": "shareledger1x8fgctprmrtnazz8w4jrz3wzgv8ruxr2knfe5s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x8fgctprmrtnazz8w4jrz3wzgv8ruxr2knfe5s", + "ownerAddress": "shareledger1x8fgctprmrtnazz8w4jrz3wzgv8ruxr2knfe5s", + "extraData": "" + } + }, + { + "id": "shareledger1x8nuhstu9d3ez6wnw9d3t0smg0c7xl5jyflnce", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x8nuhstu9d3ez6wnw9d3t0smg0c7xl5jyflnce", + "ownerAddress": "shareledger1x8nuhstu9d3ez6wnw9d3t0smg0c7xl5jyflnce", + "extraData": "" + } + }, + { + "id": "shareledger1x8p80cpjudekjp6qpz20408kjfyrgejqml8pdp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x8p80cpjudekjp6qpz20408kjfyrgejqml8pdp", + "ownerAddress": "shareledger1x8p80cpjudekjp6qpz20408kjfyrgejqml8pdp", + "extraData": "" + } + }, + { + "id": "shareledger1x9keejhhmcg83cgzungaschfwc7dw9627hulsj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1x9keejhhmcg83cgzungaschfwc7dw9627hulsj", + "ownerAddress": "shareledger1x9keejhhmcg83cgzungaschfwc7dw9627hulsj", + "extraData": "" + } + }, + { + "id": "shareledger1xc8qwdcguxgdffjga2fh8ne63856wdppx824f2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xc8qwdcguxgdffjga2fh8ne63856wdppx824f2", + "ownerAddress": "shareledger1xc8qwdcguxgdffjga2fh8ne63856wdppx824f2", + "extraData": "" + } + }, + { + "id": "shareledger1xckl9adxlcm4qx6cs8vnqx3hr2xc0t720d9skp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xckl9adxlcm4qx6cs8vnqx3hr2xc0t720d9skp", + "ownerAddress": "shareledger1xckl9adxlcm4qx6cs8vnqx3hr2xc0t720d9skp", + "extraData": "" + } + }, + { + "id": "shareledger1xcu47jcfnfm60nlp20s038vuvm0v23qhrvqux6", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xcu47jcfnfm60nlp20s038vuvm0v23qhrvqux6", + "ownerAddress": "shareledger1xcu47jcfnfm60nlp20s038vuvm0v23qhrvqux6", + "extraData": "" + } + }, + { + "id": "shareledger1xdc29rsgjaxj4znjeugx7mx4u26qreh7qtewpy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xdc29rsgjaxj4znjeugx7mx4u26qreh7qtewpy", + "ownerAddress": "shareledger1xdc29rsgjaxj4znjeugx7mx4u26qreh7qtewpy", + "extraData": "" + } + }, + { + "id": "shareledger1xdcumal4uprr7q6z0jkjnj7v4qh7veek0allt4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xdcumal4uprr7q6z0jkjnj7v4qh7veek0allt4", + "ownerAddress": "shareledger1xdcumal4uprr7q6z0jkjnj7v4qh7veek0allt4", + "extraData": "" + } + }, + { + "id": "shareledger1xe3ckap97a7p8dmcg385gcvzt2z4v4sjmvt7q5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xe3ckap97a7p8dmcg385gcvzt2z4v4sjmvt7q5", + "ownerAddress": "shareledger1xe3ckap97a7p8dmcg385gcvzt2z4v4sjmvt7q5", + "extraData": "" + } + }, + { + "id": "shareledger1xekmja8y3wz3prmde7k96v9jj3xhd0d8v9etsa", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xekmja8y3wz3prmde7k96v9jj3xhd0d8v9etsa", + "ownerAddress": "shareledger1xekmja8y3wz3prmde7k96v9jj3xhd0d8v9etsa", + "extraData": "" + } + }, + { + "id": "shareledger1xfpna4wl23n2jugcalh2qgklghmc42s77km23r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xfpna4wl23n2jugcalh2qgklghmc42s77km23r", + "ownerAddress": "shareledger1xfpna4wl23n2jugcalh2qgklghmc42s77km23r", + "extraData": "" + } + }, + { + "id": "shareledger1xg64gldp9640ljj63zapl34s256tefzv9sx05p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xg64gldp9640ljj63zapl34s256tefzv9sx05p", + "ownerAddress": "shareledger1xg64gldp9640ljj63zapl34s256tefzv9sx05p", + "extraData": "" + } + }, + { + "id": "shareledger1xg9j7ps2xv0sy9jnjauyfx9wwu2qs37wwhlweq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xg9j7ps2xv0sy9jnjauyfx9wwu2qs37wwhlweq", + "ownerAddress": "shareledger1xg9j7ps2xv0sy9jnjauyfx9wwu2qs37wwhlweq", + "extraData": "" + } + }, + { + "id": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "ownerAddress": "shareledger1xghm5typuwcqs74pe7y8vdlt2lqkmlcpyexw9r", + "extraData": "" + } + }, + { + "id": "shareledger1xgxdwpf4f4rdkpc37mn4xn4cfun3hwzc9e44c9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xgxdwpf4f4rdkpc37mn4xn4cfun3hwzc9e44c9", + "ownerAddress": "shareledger1xgxdwpf4f4rdkpc37mn4xn4cfun3hwzc9e44c9", + "extraData": "" + } + }, + { + "id": "shareledger1xkvp5gh0w8rszhn8t37lhjlue7hk2pr8cjxtd7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xkvp5gh0w8rszhn8t37lhjlue7hk2pr8cjxtd7", + "ownerAddress": "shareledger1xkvp5gh0w8rszhn8t37lhjlue7hk2pr8cjxtd7", + "extraData": "" + } + }, + { + "id": "shareledger1xkvz7zn8xnsujsn7jpu53plcqaaycal5xjv0tn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xkvz7zn8xnsujsn7jpu53plcqaaycal5xjv0tn", + "ownerAddress": "shareledger1xkvz7zn8xnsujsn7jpu53plcqaaycal5xjv0tn", + "extraData": "" + } + }, + { + "id": "shareledger1xl6nludq447x3pd5nqt5zxm74hlmk2asrgjvv0", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xl6nludq447x3pd5nqt5zxm74hlmk2asrgjvv0", + "ownerAddress": "shareledger1xl6nludq447x3pd5nqt5zxm74hlmk2asrgjvv0", + "extraData": "" + } + }, + { + "id": "shareledger1xmc45723nymjsaqpju52te35sk28hpuxkn208f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xmc45723nymjsaqpju52te35sk28hpuxkn208f", + "ownerAddress": "shareledger1xmc45723nymjsaqpju52te35sk28hpuxkn208f", + "extraData": "" + } + }, + { + "id": "shareledger1xmmxauxljv0ttttgmxmzdm95tcdpsttur5dmau", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xmmxauxljv0ttttgmxmzdm95tcdpsttur5dmau", + "ownerAddress": "shareledger1xmmxauxljv0ttttgmxmzdm95tcdpsttur5dmau", + "extraData": "" + } + }, + { + "id": "shareledger1xms5hfp3yhfa4pnvk49ewx9nu60xzm0890jjwq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xms5hfp3yhfa4pnvk49ewx9nu60xzm0890jjwq", + "ownerAddress": "shareledger1xms5hfp3yhfa4pnvk49ewx9nu60xzm0890jjwq", + "extraData": "" + } + }, + { + "id": "shareledger1xn0y4m0qjumd8ahlvk7d7m74hg9f7dvy07ylnq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xn0y4m0qjumd8ahlvk7d7m74hg9f7dvy07ylnq", + "ownerAddress": "shareledger1xn0y4m0qjumd8ahlvk7d7m74hg9f7dvy07ylnq", + "extraData": "" + } + }, + { + "id": "shareledger1xn2fvzmr6q7dv5nqwju767luk7g485fep780qp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xn2fvzmr6q7dv5nqwju767luk7g485fep780qp", + "ownerAddress": "shareledger1xn2fvzmr6q7dv5nqwju767luk7g485fep780qp", + "extraData": "" + } + }, + { + "id": "shareledger1xn56gqgya6jjej5nq7gnzqgpnmkyrj0gnqauu5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xn56gqgya6jjej5nq7gnzqgpnmkyrj0gnqauu5", + "ownerAddress": "shareledger1xn56gqgya6jjej5nq7gnzqgpnmkyrj0gnqauu5", + "extraData": "" + } + }, + { + "id": "shareledger1xphjq07xh5kcc2gynf9ysx9f6pxqtl9pnnv4p4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xphjq07xh5kcc2gynf9ysx9f6pxqtl9pnnv4p4", + "ownerAddress": "shareledger1xphjq07xh5kcc2gynf9ysx9f6pxqtl9pnnv4p4", + "extraData": "" + } + }, + { + "id": "shareledger1xpuxs68c8ms0gnj6pe2fdalgfjdllqk2gwwa9k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xpuxs68c8ms0gnj6pe2fdalgfjdllqk2gwwa9k", + "ownerAddress": "shareledger1xpuxs68c8ms0gnj6pe2fdalgfjdllqk2gwwa9k", + "extraData": "" + } + }, + { + "id": "shareledger1xqg6ev2zam6qwgfmpr9ucwv57pju0luz4ywe2m", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xqg6ev2zam6qwgfmpr9ucwv57pju0luz4ywe2m", + "ownerAddress": "shareledger1xqg6ev2zam6qwgfmpr9ucwv57pju0luz4ywe2m", + "extraData": "" + } + }, + { + "id": "shareledger1xqsvatwltcudu2kpr4hec5fkrl7zp3plj3fj4f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xqsvatwltcudu2kpr4hec5fkrl7zp3plj3fj4f", + "ownerAddress": "shareledger1xqsvatwltcudu2kpr4hec5fkrl7zp3plj3fj4f", + "extraData": "" + } + }, + { + "id": "shareledger1xtaezwk6yym4fwnhfc48a63d2t50fu3mmg44hw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xtaezwk6yym4fwnhfc48a63d2t50fu3mmg44hw", + "ownerAddress": "shareledger1xtaezwk6yym4fwnhfc48a63d2t50fu3mmg44hw", + "extraData": "" + } + }, + { + "id": "shareledger1xtxunh8heetsjaxkj7h4a7ewjv0xndpfx7t7a4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xtxunh8heetsjaxkj7h4a7ewjv0xndpfx7t7a4", + "ownerAddress": "shareledger1xtxunh8heetsjaxkj7h4a7ewjv0xndpfx7t7a4", + "extraData": "" + } + }, + { + "id": "shareledger1xu2tc7dz50t3fztsc4dqc7k0ddxuafndpszwun", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xu2tc7dz50t3fztsc4dqc7k0ddxuafndpszwun", + "ownerAddress": "shareledger1xu2tc7dz50t3fztsc4dqc7k0ddxuafndpszwun", + "extraData": "" + } + }, + { + "id": "shareledger1xujqhun3fsr0qnzrecqnm77j356x9l3zcaan7r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xujqhun3fsr0qnzrecqnm77j356x9l3zcaan7r", + "ownerAddress": "shareledger1xujqhun3fsr0qnzrecqnm77j356x9l3zcaan7r", + "extraData": "" + } + }, + { + "id": "shareledger1xuwetznphv05vt53selmm7lx82stvyx527ns08", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xuwetznphv05vt53selmm7lx82stvyx527ns08", + "ownerAddress": "shareledger1xuwetznphv05vt53selmm7lx82stvyx527ns08", + "extraData": "" + } + }, + { + "id": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "ownerAddress": "shareledger1xvxr6w7rjhw8ace2jt8j9qguna0yqn7fcnjn5c", + "extraData": "" + } + }, + { + "id": "shareledger1xwd4yepl68974dd8kmkjgucjkrpmwh2q5qjmyx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xwd4yepl68974dd8kmkjgucjkrpmwh2q5qjmyx", + "ownerAddress": "shareledger1xwd4yepl68974dd8kmkjgucjkrpmwh2q5qjmyx", + "extraData": "" + } + }, + { + "id": "shareledger1xx6awfcqfp9qghvpx3uxvampjay45ez8zwxes5", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xx6awfcqfp9qghvpx3uxvampjay45ez8zwxes5", + "ownerAddress": "shareledger1xx6awfcqfp9qghvpx3uxvampjay45ez8zwxes5", + "extraData": "" + } + }, + { + "id": "shareledger1xxaf2c0ujavt2g8ghq6ewev77kgf4x250e0hxd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xxaf2c0ujavt2g8ghq6ewev77kgf4x250e0hxd", + "ownerAddress": "shareledger1xxaf2c0ujavt2g8ghq6ewev77kgf4x250e0hxd", + "extraData": "" + } + }, + { + "id": "shareledger1xxd3q9xgsknu7uvw5lz047atxwhfhc8xm9d53a", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xxd3q9xgsknu7uvw5lz047atxwhfhc8xm9d53a", + "ownerAddress": "shareledger1xxd3q9xgsknu7uvw5lz047atxwhfhc8xm9d53a", + "extraData": "" + } + }, + { + "id": "shareledger1xxwl2r5pfnfkm3hpg3dyuhm84cnj5u6y9kfs8d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xxwl2r5pfnfkm3hpg3dyuhm84cnj5u6y9kfs8d", + "ownerAddress": "shareledger1xxwl2r5pfnfkm3hpg3dyuhm84cnj5u6y9kfs8d", + "extraData": "" + } + }, + { + "id": "shareledger1xy49c20ptj0n6jlacfvyr46cnqh0n89wk4n3nl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xy49c20ptj0n6jlacfvyr46cnqh0n89wk4n3nl", + "ownerAddress": "shareledger1xy49c20ptj0n6jlacfvyr46cnqh0n89wk4n3nl", + "extraData": "" + } + }, + { + "id": "shareledger1xydwa7wsk0pkkzzh8a6v0hh80jnufz6ak7cf5c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xydwa7wsk0pkkzzh8a6v0hh80jnufz6ak7cf5c", + "ownerAddress": "shareledger1xydwa7wsk0pkkzzh8a6v0hh80jnufz6ak7cf5c", + "extraData": "" + } + }, + { + "id": "shareledger1xz7qu5sqgm9mxkx7a5na984w3x5twhjvudku2p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xz7qu5sqgm9mxkx7a5na984w3x5twhjvudku2p", + "ownerAddress": "shareledger1xz7qu5sqgm9mxkx7a5na984w3x5twhjvudku2p", + "extraData": "" + } + }, + { + "id": "shareledger1xz8rjyrq6cfg6x9a3dgatg45xyjtzc0x3lsj97", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xz8rjyrq6cfg6x9a3dgatg45xyjtzc0x3lsj97", + "ownerAddress": "shareledger1xz8rjyrq6cfg6x9a3dgatg45xyjtzc0x3lsj97", + "extraData": "" + } + }, + { + "id": "shareledger1xznwds2dcgwghu9h5ws349wd97mayq94lqg2ly", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xznwds2dcgwghu9h5ws349wd97mayq94lqg2ly", + "ownerAddress": "shareledger1xznwds2dcgwghu9h5ws349wd97mayq94lqg2ly", + "extraData": "" + } + }, + { + "id": "shareledger1xzru608vj7hk47vcr37pueg60jg9ugmeu28e80", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1xzru608vj7hk47vcr37pueg60jg9ugmeu28e80", + "ownerAddress": "shareledger1xzru608vj7hk47vcr37pueg60jg9ugmeu28e80", + "extraData": "" + } + }, + { + "id": "shareledger1y0rpcac0n82x2lcu60yj76xnsnd2jctdt6939s", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y0rpcac0n82x2lcu60yj76xnsnd2jctdt6939s", + "ownerAddress": "shareledger1y0rpcac0n82x2lcu60yj76xnsnd2jctdt6939s", + "extraData": "" + } + }, + { + "id": "shareledger1y0sz53rah3wj4zxzx8f9cquhazhjkkmfpq9thj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y0sz53rah3wj4zxzx8f9cquhazhjkkmfpq9thj", + "ownerAddress": "shareledger1y0sz53rah3wj4zxzx8f9cquhazhjkkmfpq9thj", + "extraData": "" + } + }, + { + "id": "shareledger1y22wald653cfzy4v6uk8w5e4kha2eukhh728xv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y22wald653cfzy4v6uk8w5e4kha2eukhh728xv", + "ownerAddress": "shareledger1y22wald653cfzy4v6uk8w5e4kha2eukhh728xv", + "extraData": "" + } + }, + { + "id": "shareledger1y2k4jhmtm2ua2u2az3wrcgdfv0t6l7ug2d9843", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y2k4jhmtm2ua2u2az3wrcgdfv0t6l7ug2d9843", + "ownerAddress": "shareledger1y2k4jhmtm2ua2u2az3wrcgdfv0t6l7ug2d9843", + "extraData": "" + } + }, + { + "id": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "ownerAddress": "shareledger1y3fgrec0l0auhr7xte58jht7y4cz0sc8h6d7pr", + "extraData": "" + } + }, + { + "id": "shareledger1y3l66ejenc5g8l83ch34ysx0ty6ccm6numwzv8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y3l66ejenc5g8l83ch34ysx0ty6ccm6numwzv8", + "ownerAddress": "shareledger1y3l66ejenc5g8l83ch34ysx0ty6ccm6numwzv8", + "extraData": "" + } + }, + { + "id": "shareledger1y4quspa9ux6hkkpah5f9zakum6usa5hsgcwt6l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y4quspa9ux6hkkpah5f9zakum6usa5hsgcwt6l", + "ownerAddress": "shareledger1y4quspa9ux6hkkpah5f9zakum6usa5hsgcwt6l", + "extraData": "" + } + }, + { + "id": "shareledger1y7wfdqa9cdy67ssplrz5lraummjemj9dr7wcz8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y7wfdqa9cdy67ssplrz5lraummjemj9dr7wcz8", + "ownerAddress": "shareledger1y7wfdqa9cdy67ssplrz5lraummjemj9dr7wcz8", + "extraData": "" + } + }, + { + "id": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "ownerAddress": "shareledger1y833lgd4pgdrjcpwa9ad4n45ykvuj6pu9x0ckd", + "extraData": "" + } + }, + { + "id": "shareledger1y8c7nfxwcpw0xk6kj7jsdmqs3ykq0dk2aeekhw", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y8c7nfxwcpw0xk6kj7jsdmqs3ykq0dk2aeekhw", + "ownerAddress": "shareledger1y8c7nfxwcpw0xk6kj7jsdmqs3ykq0dk2aeekhw", + "extraData": "" + } + }, + { + "id": "shareledger1y8ndqe23tn8uemc6vj5wja43a0m9ssx9y5qcqc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y8ndqe23tn8uemc6vj5wja43a0m9ssx9y5qcqc", + "ownerAddress": "shareledger1y8ndqe23tn8uemc6vj5wja43a0m9ssx9y5qcqc", + "extraData": "" + } + }, + { + "id": "shareledger1y9crusdpy6j6nvqm98yegrqpf770pvs2yvlt48", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y9crusdpy6j6nvqm98yegrqpf770pvs2yvlt48", + "ownerAddress": "shareledger1y9crusdpy6j6nvqm98yegrqpf770pvs2yvlt48", + "extraData": "" + } + }, + { + "id": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "ownerAddress": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "extraData": "" + } + }, + { + "id": "shareledger1ya62ptqm80r9e52ek27h60vfse4fjy2hfnntxd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ya62ptqm80r9e52ek27h60vfse4fjy2hfnntxd", + "ownerAddress": "shareledger1ya62ptqm80r9e52ek27h60vfse4fjy2hfnntxd", + "extraData": "" + } + }, + { + "id": "shareledger1ya8z4u49srfqxgxyd85v7v37amkzpw4002782g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ya8z4u49srfqxgxyd85v7v37amkzpw4002782g", + "ownerAddress": "shareledger1ya8z4u49srfqxgxyd85v7v37amkzpw4002782g", + "extraData": "" + } + }, + { + "id": "shareledger1yafhvg88cgka94294np0fjnqcfm6mtu3qf6yxl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yafhvg88cgka94294np0fjnqcfm6mtu3qf6yxl", + "ownerAddress": "shareledger1yafhvg88cgka94294np0fjnqcfm6mtu3qf6yxl", + "extraData": "" + } + }, + { + "id": "shareledger1yamwn33rf607qsgg7pwuasmnxpa756zqnue7eg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yamwn33rf607qsgg7pwuasmnxpa756zqnue7eg", + "ownerAddress": "shareledger1yamwn33rf607qsgg7pwuasmnxpa756zqnue7eg", + "extraData": "" + } + }, + { + "id": "shareledger1yc59w63ywu4jshq7vuy2trv37jxe9x80zpzad3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yc59w63ywu4jshq7vuy2trv37jxe9x80zpzad3", + "ownerAddress": "shareledger1yc59w63ywu4jshq7vuy2trv37jxe9x80zpzad3", + "extraData": "" + } + }, + { + "id": "shareledger1ycv22l6zrr5luq9cyflrhfr59ll4pkx706hlxp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ycv22l6zrr5luq9cyflrhfr59ll4pkx706hlxp", + "ownerAddress": "shareledger1ycv22l6zrr5luq9cyflrhfr59ll4pkx706hlxp", + "extraData": "" + } + }, + { + "id": "shareledger1ydagr25a0cf0a5ndr0ym9w54t4krf65pj3dndq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ydagr25a0cf0a5ndr0ym9w54t4krf65pj3dndq", + "ownerAddress": "shareledger1ydagr25a0cf0a5ndr0ym9w54t4krf65pj3dndq", + "extraData": "" + } + }, + { + "id": "shareledger1ydqjwl4f9t9mt2adjkagax98qkgp4w860hd4sd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ydqjwl4f9t9mt2adjkagax98qkgp4w860hd4sd", + "ownerAddress": "shareledger1ydqjwl4f9t9mt2adjkagax98qkgp4w860hd4sd", + "extraData": "" + } + }, + { + "id": "shareledger1ye50kw52xaj9976uau20qunaach5sq8c8rc8pq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ye50kw52xaj9976uau20qunaach5sq8c8rc8pq", + "ownerAddress": "shareledger1ye50kw52xaj9976uau20qunaach5sq8c8rc8pq", + "extraData": "" + } + }, + { + "id": "shareledger1ygwhe63lxksdmwtnce85jlxr2x2tdhsm7eqvea", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ygwhe63lxksdmwtnce85jlxr2x2tdhsm7eqvea", + "ownerAddress": "shareledger1ygwhe63lxksdmwtnce85jlxr2x2tdhsm7eqvea", + "extraData": "" + } + }, + { + "id": "shareledger1yhhlgv53fcz3j8f9lmr0ycwffpnzlfdjysxtuz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yhhlgv53fcz3j8f9lmr0ycwffpnzlfdjysxtuz", + "ownerAddress": "shareledger1yhhlgv53fcz3j8f9lmr0ycwffpnzlfdjysxtuz", + "extraData": "" + } + }, + { + "id": "shareledger1yhxmq30pzy2246uy2e5ltfgmz0xslxlfnjkrkq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yhxmq30pzy2246uy2e5ltfgmz0xslxlfnjkrkq", + "ownerAddress": "shareledger1yhxmq30pzy2246uy2e5ltfgmz0xslxlfnjkrkq", + "extraData": "" + } + }, + { + "id": "shareledger1yj7spuhku7z83fjvjd6rc5aa40ul9k3we85wyl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yj7spuhku7z83fjvjd6rc5aa40ul9k3we85wyl", + "ownerAddress": "shareledger1yj7spuhku7z83fjvjd6rc5aa40ul9k3we85wyl", + "extraData": "" + } + }, + { + "id": "shareledger1yk5vc8fr80w0y2hgs5u8x6zgapask9gcstv6ad", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yk5vc8fr80w0y2hgs5u8x6zgapask9gcstv6ad", + "ownerAddress": "shareledger1yk5vc8fr80w0y2hgs5u8x6zgapask9gcstv6ad", + "extraData": "" + } + }, + { + "id": "shareledger1yleayhxff2dfjf45yyr5ha8mfkjpefa4mrng45", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yleayhxff2dfjf45yyr5ha8mfkjpefa4mrng45", + "ownerAddress": "shareledger1yleayhxff2dfjf45yyr5ha8mfkjpefa4mrng45", + "extraData": "" + } + }, + { + "id": "shareledger1ylnq864kjwtey58nzc7khtzujn4a0mr2k7fspx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ylnq864kjwtey58nzc7khtzujn4a0mr2k7fspx", + "ownerAddress": "shareledger1ylnq864kjwtey58nzc7khtzujn4a0mr2k7fspx", + "extraData": "" + } + }, + { + "id": "shareledger1ym4cuw3fznyw5lwqjlt2av42lfpwfmkep5ez09", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ym4cuw3fznyw5lwqjlt2av42lfpwfmkep5ez09", + "ownerAddress": "shareledger1ym4cuw3fznyw5lwqjlt2av42lfpwfmkep5ez09", + "extraData": "" + } + }, + { + "id": "shareledger1ymns4rej40zap5uzfxvzfvs9nuqr4vgh07r2xl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ymns4rej40zap5uzfxvzfvs9nuqr4vgh07r2xl", + "ownerAddress": "shareledger1ymns4rej40zap5uzfxvzfvs9nuqr4vgh07r2xl", + "extraData": "" + } + }, + { + "id": "shareledger1ymsk9cak2zjcfh3zkmp2sch4ukncef9d42qvmx", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ymsk9cak2zjcfh3zkmp2sch4ukncef9d42qvmx", + "ownerAddress": "shareledger1ymsk9cak2zjcfh3zkmp2sch4ukncef9d42qvmx", + "extraData": "" + } + }, + { + "id": "shareledger1ymvef9xvv82wus6z3r8hyygksqvtd4lelgh4lk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ymvef9xvv82wus6z3r8hyygksqvtd4lelgh4lk", + "ownerAddress": "shareledger1ymvef9xvv82wus6z3r8hyygksqvtd4lelgh4lk", + "extraData": "" + } + }, + { + "id": "shareledger1yn77jff3sn68nqul0w4wjsmda9yqzrjrvf5nr3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yn77jff3sn68nqul0w4wjsmda9yqzrjrvf5nr3", + "ownerAddress": "shareledger1yn77jff3sn68nqul0w4wjsmda9yqzrjrvf5nr3", + "extraData": "" + } + }, + { + "id": "shareledger1yn8dzt7srhvcwsaa9d2d4wjpr225vzduzzp0yh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yn8dzt7srhvcwsaa9d2d4wjpr225vzduzzp0yh", + "ownerAddress": "shareledger1yn8dzt7srhvcwsaa9d2d4wjpr225vzduzzp0yh", + "extraData": "" + } + }, + { + "id": "shareledger1ynhr08gcaraacds8sze5rf23dlsrclav9cszxc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ynhr08gcaraacds8sze5rf23dlsrclav9cszxc", + "ownerAddress": "shareledger1ynhr08gcaraacds8sze5rf23dlsrclav9cszxc", + "extraData": "" + } + }, + { + "id": "shareledger1ynlqepmdn9efuc7hclj7m649p06mt29ce9zlcd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ynlqepmdn9efuc7hclj7m649p06mt29ce9zlcd", + "ownerAddress": "shareledger1ynlqepmdn9efuc7hclj7m649p06mt29ce9zlcd", + "extraData": "" + } + }, + { + "id": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "ownerAddress": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "extraData": "" + } + }, + { + "id": "shareledger1yp3dna29vmxtjw2zl9sl0ala6a8z0eedq0yypc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yp3dna29vmxtjw2zl9sl0ala6a8z0eedq0yypc", + "ownerAddress": "shareledger1yp3dna29vmxtjw2zl9sl0ala6a8z0eedq0yypc", + "extraData": "" + } + }, + { + "id": "shareledger1yp55znumhv958kznpva39athxzyajk4hvavxm3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yp55znumhv958kznpva39athxzyajk4hvavxm3", + "ownerAddress": "shareledger1yp55znumhv958kznpva39athxzyajk4hvavxm3", + "extraData": "" + } + }, + { + "id": "shareledger1yp9ldvklkrjum504jguh8j67kesnx7k6ajce8k", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yp9ldvklkrjum504jguh8j67kesnx7k6ajce8k", + "ownerAddress": "shareledger1yp9ldvklkrjum504jguh8j67kesnx7k6ajce8k", + "extraData": "" + } + }, + { + "id": "shareledger1yqs8946t7stskw32xj2cks77n7yvwn2lmkpr8t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yqs8946t7stskw32xj2cks77n7yvwn2lmkpr8t", + "ownerAddress": "shareledger1yqs8946t7stskw32xj2cks77n7yvwn2lmkpr8t", + "extraData": "" + } + }, + { + "id": "shareledger1yr5w09jaulv5c9k90zmt0gww5ptdsy3r5nurmm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yr5w09jaulv5c9k90zmt0gww5ptdsy3r5nurmm", + "ownerAddress": "shareledger1yr5w09jaulv5c9k90zmt0gww5ptdsy3r5nurmm", + "extraData": "" + } + }, + { + "id": "shareledger1yraysjg9ypzczgj760rw34ph3wrp72u6c5qg0l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yraysjg9ypzczgj760rw34ph3wrp72u6c5qg0l", + "ownerAddress": "shareledger1yraysjg9ypzczgj760rw34ph3wrp72u6c5qg0l", + "extraData": "" + } + }, + { + "id": "shareledger1yrndv25862h4dg2h9tcvs3jf2g93kuxkazaxsy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yrndv25862h4dg2h9tcvs3jf2g93kuxkazaxsy", + "ownerAddress": "shareledger1yrndv25862h4dg2h9tcvs3jf2g93kuxkazaxsy", + "extraData": "" + } + }, + { + "id": "shareledger1ysrf0mn8frp6fnwf8m5yj79s7pfydlyzecd4r7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ysrf0mn8frp6fnwf8m5yj79s7pfydlyzecd4r7", + "ownerAddress": "shareledger1ysrf0mn8frp6fnwf8m5yj79s7pfydlyzecd4r7", + "extraData": "" + } + }, + { + "id": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "ownerAddress": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "extraData": "" + } + }, + { + "id": "shareledger1yt847sukq7lqpp7c634zenndjanvsnxa9ucndc", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yt847sukq7lqpp7c634zenndjanvsnxa9ucndc", + "ownerAddress": "shareledger1yt847sukq7lqpp7c634zenndjanvsnxa9ucndc", + "extraData": "" + } + }, + { + "id": "shareledger1yte3fyhu6eay9fnd6rh5cassduv8f93chhf08n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yte3fyhu6eay9fnd6rh5cassduv8f93chhf08n", + "ownerAddress": "shareledger1yte3fyhu6eay9fnd6rh5cassduv8f93chhf08n", + "extraData": "" + } + }, + { + "id": "shareledger1ytrw6cw56umn4a9l2qk2079edmyxs5h07jugqn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ytrw6cw56umn4a9l2qk2079edmyxs5h07jugqn", + "ownerAddress": "shareledger1ytrw6cw56umn4a9l2qk2079edmyxs5h07jugqn", + "extraData": "" + } + }, + { + "id": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "ownerAddress": "shareledger1yvge094eauf9xgh8yfv2ewvqrlqan4tcge42gy", + "extraData": "" + } + }, + { + "id": "shareledger1yvtfrn8mdq42kr8mfjn3zutjjp6gal5j77kmqf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yvtfrn8mdq42kr8mfjn3zutjjp6gal5j77kmqf", + "ownerAddress": "shareledger1yvtfrn8mdq42kr8mfjn3zutjjp6gal5j77kmqf", + "extraData": "" + } + }, + { + "id": "shareledger1ywdvgpwla7x98xs3ceevnxm5sctls5zmrc779v", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ywdvgpwla7x98xs3ceevnxm5sctls5zmrc779v", + "ownerAddress": "shareledger1ywdvgpwla7x98xs3ceevnxm5sctls5zmrc779v", + "extraData": "" + } + }, + { + "id": "shareledger1yx4yfepjclv3swgqufjnvdshn6evem36tevvm9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yx4yfepjclv3swgqufjnvdshn6evem36tevvm9", + "ownerAddress": "shareledger1yx4yfepjclv3swgqufjnvdshn6evem36tevvm9", + "extraData": "" + } + }, + { + "id": "shareledger1yxqg98a5wlpldfdjkp0vs9u9sn5qdgc00wkahm", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yxqg98a5wlpldfdjkp0vs9u9sn5qdgc00wkahm", + "ownerAddress": "shareledger1yxqg98a5wlpldfdjkp0vs9u9sn5qdgc00wkahm", + "extraData": "" + } + }, + { + "id": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "ownerAddress": "shareledger1yy46gp2wf2xw62a3klg0u9t93ke9rtf7gshhmu", + "extraData": "" + } + }, + { + "id": "shareledger1yy5lvl3um6pa7lcmy3qw28k92gsg04vkh2680d", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yy5lvl3um6pa7lcmy3qw28k92gsg04vkh2680d", + "ownerAddress": "shareledger1yy5lvl3um6pa7lcmy3qw28k92gsg04vkh2680d", + "extraData": "" + } + }, + { + "id": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "ownerAddress": "shareledger1yy9pegj9xxd0dmhyya5n6dxhdkh500f22xv0tn", + "extraData": "" + } + }, + { + "id": "shareledger1z003jwxr85egmnav7lnzgj0tlerflsxtjusl6r", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z003jwxr85egmnav7lnzgj0tlerflsxtjusl6r", + "ownerAddress": "shareledger1z003jwxr85egmnav7lnzgj0tlerflsxtjusl6r", + "extraData": "" + } + }, + { + "id": "shareledger1z0anr8ljgdd2wufwxdrk4jkgsydklfdkcxrj8l", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z0anr8ljgdd2wufwxdrk4jkgsydklfdkcxrj8l", + "ownerAddress": "shareledger1z0anr8ljgdd2wufwxdrk4jkgsydklfdkcxrj8l", + "extraData": "" + } + }, + { + "id": "shareledger1z0awjcwn6q9wuydhu8qd2gw6wwldn9pc9yxrmp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z0awjcwn6q9wuydhu8qd2gw6wwldn9pc9yxrmp", + "ownerAddress": "shareledger1z0awjcwn6q9wuydhu8qd2gw6wwldn9pc9yxrmp", + "extraData": "" + } + }, + { + "id": "shareledger1z0e9t5zn7denszqp3v9anhpawa84x8kdcj9yzq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z0e9t5zn7denszqp3v9anhpawa84x8kdcj9yzq", + "ownerAddress": "shareledger1z0e9t5zn7denszqp3v9anhpawa84x8kdcj9yzq", + "extraData": "" + } + }, + { + "id": "shareledger1z0hct2xl6ty9c6ccrwmz7t8e7n6tuhhnf26kne", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z0hct2xl6ty9c6ccrwmz7t8e7n6tuhhnf26kne", + "ownerAddress": "shareledger1z0hct2xl6ty9c6ccrwmz7t8e7n6tuhhnf26kne", + "extraData": "" + } + }, + { + "id": "shareledger1z22ehgtccq3zfkkd4p7sur9x7320agz5jvvfhz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z22ehgtccq3zfkkd4p7sur9x7320agz5jvvfhz", + "ownerAddress": "shareledger1z22ehgtccq3zfkkd4p7sur9x7320agz5jvvfhz", + "extraData": "" + } + }, + { + "id": "shareledger1z3ca3rq2lxhcn7xvca4h32evfmjc6h46mq9l0n", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z3ca3rq2lxhcn7xvca4h32evfmjc6h46mq9l0n", + "ownerAddress": "shareledger1z3ca3rq2lxhcn7xvca4h32evfmjc6h46mq9l0n", + "extraData": "" + } + }, + { + "id": "shareledger1z3l977ja8y9tfjv08kqrd8zj577r9zcxfp0ga7", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z3l977ja8y9tfjv08kqrd8zj577r9zcxfp0ga7", + "ownerAddress": "shareledger1z3l977ja8y9tfjv08kqrd8zj577r9zcxfp0ga7", + "extraData": "" + } + }, + { + "id": "shareledger1z4ns76aa0ptq327x8nauq4axfs32aqcuy5scf3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z4ns76aa0ptq327x8nauq4axfs32aqcuy5scf3", + "ownerAddress": "shareledger1z4ns76aa0ptq327x8nauq4axfs32aqcuy5scf3", + "extraData": "" + } + }, + { + "id": "shareledger1z5yxaeayc892tg438fz959xakupwdkucfnn3cj", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z5yxaeayc892tg438fz959xakupwdkucfnn3cj", + "ownerAddress": "shareledger1z5yxaeayc892tg438fz959xakupwdkucfnn3cj", + "extraData": "" + } + }, + { + "id": "shareledger1z6azx2ql98v25y03r7qc8m3laa6gk6fz376zrk", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z6azx2ql98v25y03r7qc8m3laa6gk6fz376zrk", + "ownerAddress": "shareledger1z6azx2ql98v25y03r7qc8m3laa6gk6fz376zrk", + "extraData": "" + } + }, + { + "id": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "ownerAddress": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "extraData": "" + } + }, + { + "id": "shareledger1z7uh9ze53tne2u7k8junyzpzv4yuhlaenzzu2p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z7uh9ze53tne2u7k8junyzpzv4yuhlaenzzu2p", + "ownerAddress": "shareledger1z7uh9ze53tne2u7k8junyzpzv4yuhlaenzzu2p", + "extraData": "" + } + }, + { + "id": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "ownerAddress": "shareledger1z7xkd6nf3rkqacxr7qkdtx0v5tdpy6yh5z4a30", + "extraData": "" + } + }, + { + "id": "shareledger1z8762xysa86uhf033hfgxxp0c408fl8tyn69y9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z8762xysa86uhf033hfgxxp0c408fl8tyn69y9", + "ownerAddress": "shareledger1z8762xysa86uhf033hfgxxp0c408fl8tyn69y9", + "extraData": "" + } + }, + { + "id": "shareledger1z87cv90jkgdgwhqwegrm6h0978qc2ufqm6xnfd", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z87cv90jkgdgwhqwegrm6h0978qc2ufqm6xnfd", + "ownerAddress": "shareledger1z87cv90jkgdgwhqwegrm6h0978qc2ufqm6xnfd", + "extraData": "" + } + }, + { + "id": "shareledger1z8c32l466eptzcry0gw9hnnu2juju5ngykyzeg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z8c32l466eptzcry0gw9hnnu2juju5ngykyzeg", + "ownerAddress": "shareledger1z8c32l466eptzcry0gw9hnnu2juju5ngykyzeg", + "extraData": "" + } + }, + { + "id": "shareledger1z8faclzt0u8hnja9uz3yllcfw8m88r0adp82c2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1z8faclzt0u8hnja9uz3yllcfw8m88r0adp82c2", + "ownerAddress": "shareledger1z8faclzt0u8hnja9uz3yllcfw8m88r0adp82c2", + "extraData": "" + } + }, + { + "id": "shareledger1zavhj0qsfash6srfqnxh4ft35msn3xrspnwr6f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zavhj0qsfash6srfqnxh4ft35msn3xrspnwr6f", + "ownerAddress": "shareledger1zavhj0qsfash6srfqnxh4ft35msn3xrspnwr6f", + "extraData": "" + } + }, + { + "id": "shareledger1zceum754ahlcz2zv20q6gwqpmg8u90vv6lstvl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zceum754ahlcz2zv20q6gwqpmg8u90vv6lstvl", + "ownerAddress": "shareledger1zceum754ahlcz2zv20q6gwqpmg8u90vv6lstvl", + "extraData": "" + } + }, + { + "id": "shareledger1zdwc4pjw8cygac5my3mq897vtxh8c7hgxuykrq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zdwc4pjw8cygac5my3mq897vtxh8c7hgxuykrq", + "ownerAddress": "shareledger1zdwc4pjw8cygac5my3mq897vtxh8c7hgxuykrq", + "extraData": "" + } + }, + { + "id": "shareledger1zfme9z9cdsvafgn09ca0nwz7fg7t0dgt7kn4r9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zfme9z9cdsvafgn09ca0nwz7fg7t0dgt7kn4r9", + "ownerAddress": "shareledger1zfme9z9cdsvafgn09ca0nwz7fg7t0dgt7kn4r9", + "extraData": "" + } + }, + { + "id": "shareledger1zfsmq2akazrg9ptcz3arymu23f8t0kxlg9k23q", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zfsmq2akazrg9ptcz3arymu23f8t0kxlg9k23q", + "ownerAddress": "shareledger1zfsmq2akazrg9ptcz3arymu23f8t0kxlg9k23q", + "extraData": "" + } + }, + { + "id": "shareledger1zfztnd5etgjg07ees0yshfd9ttyylch0aqrhac", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zfztnd5etgjg07ees0yshfd9ttyylch0aqrhac", + "ownerAddress": "shareledger1zfztnd5etgjg07ees0yshfd9ttyylch0aqrhac", + "extraData": "" + } + }, + { + "id": "shareledger1zglsp8j55gv9rgnvf4vx5kutus3v0y6td93ua4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zglsp8j55gv9rgnvf4vx5kutus3v0y6td93ua4", + "ownerAddress": "shareledger1zglsp8j55gv9rgnvf4vx5kutus3v0y6td93ua4", + "extraData": "" + } + }, + { + "id": "shareledger1zhf6yjwkaqw03608glu9fpwcquwytvmtd4dz28", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zhf6yjwkaqw03608glu9fpwcquwytvmtd4dz28", + "ownerAddress": "shareledger1zhf6yjwkaqw03608glu9fpwcquwytvmtd4dz28", + "extraData": "" + } + }, + { + "id": "shareledger1zjpneg5t68gekzfpv9yg5ngd795ggwj328rvlg", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zjpneg5t68gekzfpv9yg5ngd795ggwj328rvlg", + "ownerAddress": "shareledger1zjpneg5t68gekzfpv9yg5ngd795ggwj328rvlg", + "extraData": "" + } + }, + { + "id": "shareledger1zl78rk92ll4yu4jwedee8gxyq6tamk5qut3jrl", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zl78rk92ll4yu4jwedee8gxyq6tamk5qut3jrl", + "ownerAddress": "shareledger1zl78rk92ll4yu4jwedee8gxyq6tamk5qut3jrl", + "extraData": "" + } + }, + { + "id": "shareledger1zlfghptywsk7jmwp89xfa3lnrgu5rdp5e4nfsq", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zlfghptywsk7jmwp89xfa3lnrgu5rdp5e4nfsq", + "ownerAddress": "shareledger1zlfghptywsk7jmwp89xfa3lnrgu5rdp5e4nfsq", + "extraData": "" + } + }, + { + "id": "shareledger1zlg73azp8vyj9k6q03m0yjclxpzl9g25wywq9c", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zlg73azp8vyj9k6q03m0yjclxpzl9g25wywq9c", + "ownerAddress": "shareledger1zlg73azp8vyj9k6q03m0yjclxpzl9g25wywq9c", + "extraData": "" + } + }, + { + "id": "shareledger1zn6k9xnras22rhj5zgjwx6dazd475ayp224xj4", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zn6k9xnras22rhj5zgjwx6dazd475ayp224xj4", + "ownerAddress": "shareledger1zn6k9xnras22rhj5zgjwx6dazd475ayp224xj4", + "extraData": "" + } + }, + { + "id": "shareledger1znx68ug9yx3077g0cxuxqp3ufnk4xfj2g0cx26", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1znx68ug9yx3077g0cxuxqp3ufnk4xfj2g0cx26", + "ownerAddress": "shareledger1znx68ug9yx3077g0cxuxqp3ufnk4xfj2g0cx26", + "extraData": "" + } + }, + { + "id": "shareledger1zp3dlz3a7ct5vl7gkma7nsne8ercpckrrgdh5g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zp3dlz3a7ct5vl7gkma7nsne8ercpckrrgdh5g", + "ownerAddress": "shareledger1zp3dlz3a7ct5vl7gkma7nsne8ercpckrrgdh5g", + "extraData": "" + } + }, + { + "id": "shareledger1zq4shag3gdxtu2chxcmv2fxw3zagk8xpnsrcna", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zq4shag3gdxtu2chxcmv2fxw3zagk8xpnsrcna", + "ownerAddress": "shareledger1zq4shag3gdxtu2chxcmv2fxw3zagk8xpnsrcna", + "extraData": "" + } + }, + { + "id": "shareledger1zqscrmy9qad6fgspmcjkre77f69f72fqg7mj7p", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zqscrmy9qad6fgspmcjkre77f69f72fqg7mj7p", + "ownerAddress": "shareledger1zqscrmy9qad6fgspmcjkre77f69f72fqg7mj7p", + "extraData": "" + } + }, + { + "id": "shareledger1zr46c3gk5tc6aln20ru0u4vchgkdqgn80n52x8", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zr46c3gk5tc6aln20ru0u4vchgkdqgn80n52x8", + "ownerAddress": "shareledger1zr46c3gk5tc6aln20ru0u4vchgkdqgn80n52x8", + "extraData": "" + } + }, + { + "id": "shareledger1zrx9l4k7cfxurl07wn8gnayxv3v0qyydwlevnt", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zrx9l4k7cfxurl07wn8gnayxv3v0qyydwlevnt", + "ownerAddress": "shareledger1zrx9l4k7cfxurl07wn8gnayxv3v0qyydwlevnt", + "extraData": "" + } + }, + { + "id": "shareledger1zsdsl43c3kfn0qtehqjr5mt4mn6ajl3rsr0vce", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zsdsl43c3kfn0qtehqjr5mt4mn6ajl3rsr0vce", + "ownerAddress": "shareledger1zsdsl43c3kfn0qtehqjr5mt4mn6ajl3rsr0vce", + "extraData": "" + } + }, + { + "id": "shareledger1zsnxq4u3scx6qqn78qadwtlg3rhf95nulst02w", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zsnxq4u3scx6qqn78qadwtlg3rhf95nulst02w", + "ownerAddress": "shareledger1zsnxq4u3scx6qqn78qadwtlg3rhf95nulst02w", + "extraData": "" + } + }, + { + "id": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "ownerAddress": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "extraData": "" + } + }, + { + "id": "shareledger1zsxv94cgxk8vrj4j4947wtq4sdanazdmjc5dr9", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zsxv94cgxk8vrj4j4947wtq4sdanazdmjc5dr9", + "ownerAddress": "shareledger1zsxv94cgxk8vrj4j4947wtq4sdanazdmjc5dr9", + "extraData": "" + } + }, + { + "id": "shareledger1ztv60kwmjzwesvc62vg6qttnylx4uxyxs2h4tz", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1ztv60kwmjzwesvc62vg6qttnylx4uxyxs2h4tz", + "ownerAddress": "shareledger1ztv60kwmjzwesvc62vg6qttnylx4uxyxs2h4tz", + "extraData": "" + } + }, + { + "id": "shareledger1zu8ryx2qg8ex00v3whdadk68gu3plv4yxtp00g", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zu8ryx2qg8ex00v3whdadk68gu3plv4yxtp00g", + "ownerAddress": "shareledger1zu8ryx2qg8ex00v3whdadk68gu3plv4yxtp00g", + "extraData": "" + } + }, + { + "id": "shareledger1zufs2vj0elt682eew83n0hd8hzgdsejayujet2", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zufs2vj0elt682eew83n0hd8hzgdsejayujet2", + "ownerAddress": "shareledger1zufs2vj0elt682eew83n0hd8hzgdsejayujet2", + "extraData": "" + } + }, + { + "id": "shareledger1zupjvrdx5j4hvy9ey7w7wj3gxxefpd6ml83nml", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zupjvrdx5j4hvy9ey7w7wj3gxxefpd6ml83nml", + "ownerAddress": "shareledger1zupjvrdx5j4hvy9ey7w7wj3gxxefpd6ml83nml", + "extraData": "" + } + }, + { + "id": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "ownerAddress": "shareledger1zv5whcn8gkuwfvue2nnwe3vqdrvq0tethw2wty", + "extraData": "" + } + }, + { + "id": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "ownerAddress": "shareledger1zv8hjudf838rc5e4pakqc8yk475dhuh3kzccug", + "extraData": "" + } + }, + { + "id": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "ownerAddress": "shareledger1zvheht79t6xwl7km2leskhwtmywhnnq5mnnhmp", + "extraData": "" + } + }, + { + "id": "shareledger1zwmvaz7gudrkgshyq48p3lmfn4u4d72cd5k6yp", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zwmvaz7gudrkgshyq48p3lmfn4u4d72cd5k6yp", + "ownerAddress": "shareledger1zwmvaz7gudrkgshyq48p3lmfn4u4d72cd5k6yp", + "extraData": "" + } + }, + { + "id": "shareledger1zwpea3p82ed9jvtwc3nup0grkch8ysk0supjwv", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zwpea3p82ed9jvtwc3nup0grkch8ysk0supjwv", + "ownerAddress": "shareledger1zwpea3p82ed9jvtwc3nup0grkch8ysk0supjwv", + "extraData": "" + } + }, + { + "id": "shareledger1zx4kljxwgh7l59zxxq0ygfq6ht0l2a5xxft27f", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zx4kljxwgh7l59zxxq0ygfq6ht0l2a5xxft27f", + "ownerAddress": "shareledger1zx4kljxwgh7l59zxxq0ygfq6ht0l2a5xxft27f", + "extraData": "" + } + }, + { + "id": "shareledger1zx60fhxa2hfmdkqgcsr7y322qe4qh39vhgt0uf", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zx60fhxa2hfmdkqgcsr7y322qe4qh39vhgt0uf", + "ownerAddress": "shareledger1zx60fhxa2hfmdkqgcsr7y322qe4qh39vhgt0uf", + "extraData": "" + } + }, + { + "id": "shareledger1zxa426fzxcntasmwwqvx55cgfvqlsa2svxp9gh", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zxa426fzxcntasmwwqvx55cgfvqlsa2svxp9gh", + "ownerAddress": "shareledger1zxa426fzxcntasmwwqvx55cgfvqlsa2svxp9gh", + "extraData": "" + } + }, + { + "id": "shareledger1zy065f655sn2yk9a3rrrcl08jxu99m3d7rnk7t", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zy065f655sn2yk9a3rrrcl08jxu99m3d7rnk7t", + "ownerAddress": "shareledger1zy065f655sn2yk9a3rrrcl08jxu99m3d7rnk7t", + "extraData": "" + } + }, + { + "id": "shareledger1zykn3mry9ld0jdrfrdw5lsza0zxqqur0n45mym", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zykn3mry9ld0jdrfrdw5lsza0zxqqur0n45mym", + "ownerAddress": "shareledger1zykn3mry9ld0jdrfrdw5lsza0zxqqur0n45mym", + "extraData": "" + } + }, + { + "id": "shareledger1zz8mpdsk28vm8523ecaez3kh3haxn73kf395d3", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1zz8mpdsk28vm8523ecaez3kh3haxn73kf395d3", + "ownerAddress": "shareledger1zz8mpdsk28vm8523ecaez3kh3haxn73kf395d3", + "extraData": "" + } + }, + { + "id": "uid-159654", + "data": { + "issuerAddress": "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "backupAddress": "shareledger1s432u6zv95wpluxhf4qru2ewy58kc3w4tkzm3v", + "ownerAddress": "shareledger1s432u6zv95wpluxhf4qru2ewy58kc3w4tkzm3v", + "extraData": "http://sharering.network" + } + } + ] + }, + "mint": { + "minter": { + "annual_provisions": "0.000000000000000000", + "inflation": "0.130000000000000000" + }, + "params": { + "blocks_per_year": "6311520", + "goal_bonded": "0.670000000000000000", + "inflation_max": "0.000000000000000000", + "inflation_min": "0.000000000000000000", + "inflation_rate_change": "0.000000000000000000", + "mint_denom": "nshr" + } + }, + "params": null, + "slashing": { + "params": { + "signed_blocks_window": "100", + "min_signed_per_window": "0.500000000000000000", + "downtime_jail_duration": "600s", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" + }, + "signing_infos": [ + { + "address": "shareledgervalcons1hqaa8jxkse4mmc4h9es208ayyj43txkft36gsa", + "validator_signing_info": { + "address": "shareledgervalcons1hqaa8jxkse4mmc4h9es208ayyj43txkft36gsa", + "start_height": "0", + "index_offset": "2073620", + "jailed_until": "1970-01-01T00:00:00Z", + "tombstoned": false, + "missed_blocks_counter": "0" + } + }, + { + "address": "shareledgervalcons1na0de04j7ljsp6wh28k9gul8vp9ncwhz8uajhg", + "validator_signing_info": { + "address": "shareledgervalcons1na0de04j7ljsp6wh28k9gul8vp9ncwhz8uajhg", + "start_height": "0", + "index_offset": "234174", + "jailed_until": "2022-01-18T07:08:07.069850866Z", + "tombstoned": false, + "missed_blocks_counter": "10" + } + }, + { + "address": "shareledgervalcons1y8r4fznx6rjug0q593hr5zlrv5agd395z2n6m9", + "validator_signing_info": { + "address": "shareledgervalcons1y8r4fznx6rjug0q593hr5zlrv5agd395z2n6m9", + "start_height": "0", + "index_offset": "79746", + "jailed_until": "2022-01-20T05:27:47.888675933Z", + "tombstoned": false, + "missed_blocks_counter": "0" + } + }, + { + "address": "shareledgervalcons1yh39aanelyufuczl8gty5v2a3y5537f5u3r8pl", + "validator_signing_info": { + "address": "shareledgervalcons1yh39aanelyufuczl8gty5v2a3y5537f5u3r8pl", + "start_height": "0", + "index_offset": "2", + "jailed_until": "2022-02-16T08:09:26.126822688Z", + "tombstoned": false, + "missed_blocks_counter": "2" + } + } + ], + "missed_blocks": [ + { + "address": "shareledgervalcons1na0de04j7ljsp6wh28k9gul8vp9ncwhz8uajhg", + "missed_blocks": [ + { + "index": "0", + "missed": false + }, + { + "index": "1", + "missed": false + }, + { + "index": "13", + "missed": false + }, + { + "index": "14", + "missed": false + }, + { + "index": "15", + "missed": false + }, + { + "index": "16", + "missed": false + }, + { + "index": "17", + "missed": false + }, + { + "index": "18", + "missed": false + }, + { + "index": "19", + "missed": false + }, + { + "index": "20", + "missed": false + }, + { + "index": "21", + "missed": false + }, + { + "index": "22", + "missed": false + }, + { + "index": "23", + "missed": false + }, + { + "index": "24", + "missed": false + }, + { + "index": "25", + "missed": false + }, + { + "index": "26", + "missed": false + }, + { + "index": "27", + "missed": false + }, + { + "index": "28", + "missed": false + }, + { + "index": "29", + "missed": false + }, + { + "index": "30", + "missed": false + }, + { + "index": "31", + "missed": false + }, + { + "index": "32", + "missed": false + }, + { + "index": "33", + "missed": false + }, + { + "index": "34", + "missed": false + }, + { + "index": "35", + "missed": false + }, + { + "index": "36", + "missed": false + }, + { + "index": "42", + "missed": false + }, + { + "index": "43", + "missed": false + }, + { + "index": "44", + "missed": false + }, + { + "index": "45", + "missed": false + }, + { + "index": "46", + "missed": false + }, + { + "index": "47", + "missed": false + }, + { + "index": "48", + "missed": false + }, + { + "index": "49", + "missed": false + }, + { + "index": "50", + "missed": false + }, + { + "index": "51", + "missed": false + }, + { + "index": "52", + "missed": false + }, + { + "index": "53", + "missed": false + }, + { + "index": "54", + "missed": false + }, + { + "index": "55", + "missed": false + }, + { + "index": "56", + "missed": false + }, + { + "index": "57", + "missed": true + }, + { + "index": "58", + "missed": true + }, + { + "index": "59", + "missed": true + }, + { + "index": "60", + "missed": true + }, + { + "index": "61", + "missed": true + }, + { + "index": "62", + "missed": true + }, + { + "index": "63", + "missed": true + }, + { + "index": "64", + "missed": true + }, + { + "index": "65", + "missed": true + }, + { + "index": "66", + "missed": true + }, + { + "index": "67", + "missed": false + } + ] + }, + { + "address": "shareledgervalcons1y8r4fznx6rjug0q593hr5zlrv5agd395z2n6m9", + "missed_blocks": [ + { + "index": "0", + "missed": false + }, + { + "index": "1", + "missed": false + } + ] + }, + { + "address": "shareledgervalcons1yh39aanelyufuczl8gty5v2a3y5537f5u3r8pl", + "missed_blocks": [ + { + "index": "0", + "missed": true + }, + { + "index": "1", + "missed": true + } + ] + }, + { + "address": "shareledgervalcons1hqaa8jxkse4mmc4h9es208ayyj43txkft36gsa", + "missed_blocks": [] + } + ] + }, + "staking": { + "params": { + "unbonding_time": "900s", + "max_validators": 100, + "max_entries": 7, + "historical_entries": 0, + "bond_denom": "nshr" + }, + "last_total_power": "191", + "last_validator_powers": [ + { + "address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "power": "72" + }, + { + "address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "power": "11" + }, + { + "address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "power": "108" + } + ], + "validators": [ + { + "operator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "CZp/ZRvmohuTMbvH/jDnDAbTOaLwQCToGgb+bZ/CEdw=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "72702846000000000", + "delegator_shares": "74157754962013088.434806521000000000", + "description": { + "moniker": "node3", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "unbonding_height": "1839500", + "unbonding_time": "2022-02-10T05:17:47.888675933Z", + "commission": { + "commission_rates": { + "rate": "0.300000000000000000", + "max_rate": "1.000000000000000000", + "max_change_rate": "1.000000000000000000" + }, + "update_time": "2021-07-22T10:02:42.385775195Z" + }, + "min_self_delegation": "1" + }, + { + "operator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "VEeE31lZUFGcsoJHhe3NavaWrtvi3+FHYJY9PUhgELc=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "11410055000000000", + "delegator_shares": "11747731031521262.221989517000000000", + "description": { + "moniker": "node0", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "unbonding_height": "1832763", + "unbonding_time": "2022-02-08T06:58:07.069850866Z", + "commission": { + "commission_rates": { + "rate": "0.150000000000000000", + "max_rate": "1.000000000000000000", + "max_change_rate": "1.000000000000000000" + }, + "update_time": "2022-01-05T05:20:50.738073795Z" + }, + "min_self_delegation": "1" + }, + { + "operator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "OaXzGMQNz+vWXWTkztTPrb4C6HMRtt34axZLdkQz/Wk=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "108587760000000000", + "delegator_shares": "108587760000000000.000000000000000000", + "description": { + "moniker": "node2", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.400000000000000000", + "max_rate": "1.000000000000000000", + "max_change_rate": "1.000000000000000000" + }, + "update_time": "2021-07-22T10:03:28.346640801Z" + }, + "min_self_delegation": "1" + }, + { + "operator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "06LG6DYzDwsU19tSau4xXBj0x3I18B8pBIn90GCYMDk=" + }, + "jailed": true, + "status": "BOND_STATUS_UNBONDING", + "tokens": "89539664000000000", + "delegator_shares": "92406218157034427.526724613000000000", + "description": { + "moniker": "node1", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "unbonding_height": "1993931", + "unbonding_time": "2022-03-09T07:59:26.126822688Z", + "commission": { + "commission_rates": { + "rate": "0.150000000000000000", + "max_rate": "1.000000000000000000", + "max_change_rate": "1.000000000000000000" + }, + "update_time": "2022-01-05T05:34:24.639766678Z" + }, + "min_self_delegation": "1" + } + ], + "delegations": [ + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "738338184.903213268000000000" + }, + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1038582334861233.909172379000000000" + }, + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "50000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1052456415441.514441918000000000" + }, + { + "delegator_address": "shareledger1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8glahgf", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "1000000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1000000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "48472741203.063218386000000000" + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "4985351376060.114051014000000000" + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "70000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1zsrv6twrrvnyfyvzee02z6m7v02raac9h9z4vn", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "60282274835.684928896000000000" + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "132909565.395803131000000000" + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "917119917595.092364028000000000" + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "2024000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1170733786678.183503964000000000" + }, + { + "delegator_address": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1544388813558637.427181340000000000" + }, + { + "delegator_address": "shareledger1rpwq3amlc3a79k0culzl7yd4vkrp5xhvm5huya", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "2554331576004287.354010196000000000" + }, + { + "delegator_address": "shareledger1rvnmn7ra90sgjgcghyuj9ug4fkpr8qxj6ssxlx", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "2500000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "11108336301.327850812000000000" + }, + { + "delegator_address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "120000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1ra48y4sf7m8x7c6j6aa7f9gpln8dgjtfdsayty", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "40869329179.720903989000000000" + }, + { + "delegator_address": "shareledger1r7wkuptecxxs3ls6j3d6l7dnvr2ymqj3lvrwrd", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "999000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "173457431.511117858000000000" + }, + { + "delegator_address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "12000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1y9y0askepj7s66cqmcek3xm04309l3kwe3wk53", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "10000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1ysw9e8mlp6t5mgmqjypyr8wdm2v2ya8nu4jk70", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "10000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1029594601.561628074000000000" + }, + { + "delegator_address": "shareledger1yntnt854u056q98455czpnrfw8prvrnxmc2cwj", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1093253849211.591779166000000000" + }, + { + "delegator_address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "11007361201301.377948970000000000" + }, + { + "delegator_address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "500000000000.000000000000000000" + }, + { + "delegator_address": "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "5000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "3029548545452.313981359000000000" + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "9000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "3000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger195zfh552gcuucjk8cxkn9srlr6rsmkz4l0lyvg", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "6044028260398.962043288000000000" + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "74482677.681767929000000000" + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "34588039436479.913963646000000000" + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "8018000000000.000000000000000000" + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "5108733778530.232303150000000000" + }, + { + "delegator_address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "204005405567538.026145294000000000" + }, + { + "delegator_address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "205919949906927.176570149000000000" + }, + { + "delegator_address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "102175305702549.251993091000000000" + }, + { + "delegator_address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "150000000000.000000000000000000" + }, + { + "delegator_address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1000000000.000000000000000000" + }, + { + "delegator_address": "shareledger19lu4qg87t7tsl3sn0q2ez5q0yvp6ltzdaqqy3f", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "575000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1x7m7pa84t5tftvnesl2h5xujjxqgdqac56w5rs", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "20152680067078.421351536000000000" + }, + { + "delegator_address": "shareledger18sjqrgvua4f79xh2650y47wm5udxeucqc6qs5n", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "989000000000.000000000000000000" + }, + { + "delegator_address": "shareledger18ncqa238qk0xxpgq5v9yz88p79r0mc3tt0yyvx", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "82756000000000.000000000000000000" + }, + { + "delegator_address": "shareledger18aqza5jx3sd39uv7stkqyqmaf596sjvc3sztvm", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "180000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger18aqza5jx3sd39uv7stkqyqmaf596sjvc3sztvm", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "81738677743301.598504509000000000" + }, + { + "delegator_address": "shareledger1gstlm6gmf3adehy70ms3tqj9tad4rnggugjkxs", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "200000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1frz7vk0ygjc9d45df77dxpe2pdfu9w2uuyglvp", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "347610000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "22334377595990.551064897000000000" + }, + { + "delegator_address": "shareledger1fja6aazgvw6zfrh59xjc6w0jdpfhdkharz72lr", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "2132683424843.053841436000000000" + }, + { + "delegator_address": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "5200000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1flam2k2a7af4rn3aqhw0jvs598pt0pld704a6d", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "13937911.847962764000000000" + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "8078797304025.910016870000000000" + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "3208000000000.000000000000000000" + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "5000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger12s58e566wu0hveqe7ms84qn74huevymn5dfm0u", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "15032510892198.587285270000000000" + }, + { + "delegator_address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "616727166335415.216751516000000000" + }, + { + "delegator_address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "1000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "325957.667551376000000000" + }, + { + "delegator_address": "shareledger1v2vlsm6yk7032x9ysexy0kca3lt7t852t5mhwp", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "500000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "7301214337425941.521504644000000000" + }, + { + "delegator_address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "1105000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1v3penclwr9jj2mtr6yyufkxpxd9vvu6ml7chyq", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "715000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1vklhnft4mmy3skymrw6wnrl929zrsjyt3zd8jh", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "16378000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "1036206920004530.926032628000000000" + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "39081896759998.917799642000000000" + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "6095051000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1015100000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "12355135218739.536896523000000000" + }, + { + "delegator_address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "10539000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1dn3vh22xcuygxdmk5k8n2f5dysrjx3n9rznz0f", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "5070808451245.669825499000000000" + }, + { + "delegator_address": "shareledger1dk37gqa9n8d8c0x36fgllgzd4vllsgenx7sf8t", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1007180899868.804201352000000000" + }, + { + "delegator_address": "shareledger1d7h6de406trldye3rnl7fj83g2663ug4w7dup6", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1021732589777.278303892000000000" + }, + { + "delegator_address": "shareledger1w4l5fchs69d9avlgvdehq9ypvdh4xyev3p490g", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "1000000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "1020011719513991.267794997000000000" + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1011043229.793155699000000000" + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "595604855.281665221000000000" + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "1009849730.303266499000000000" + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "5518000000000.000000000000000000" + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "2597000000000.000000000000000000" + }, + { + "delegator_address": "shareledger10t9emwzsuhtdwev0eqhue4thr2au5f2px73fer", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "2920274011692.267274676000000000" + }, + { + "delegator_address": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "1009849515150.771327119000000000" + }, + { + "delegator_address": "shareledger1033ln3mvwqmn2ae6evzlj2ldh6dpk3dlevjn5j", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "979000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "288286488437255.860918905000000000" + }, + { + "delegator_address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "100000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1044pfjan847rrg9gt3awyqw55u063z0hnck429", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "19139403852555.105753389000000000" + }, + { + "delegator_address": "shareledger10uzq7ada7nj0ypn7xn0jdpzjcr8dt9ygm5gfjz", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "79579000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "3026519534038.845305817000000000" + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "123000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "1004000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "323355625302.938183915000000000" + }, + { + "delegator_address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "325277.930796559000000000" + }, + { + "delegator_address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1007338043.399827007000000000" + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "95000000000.000000000000000000" + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "125000000000.000000000000000000" + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "295000000000.000000000000000000" + }, + { + "delegator_address": "shareledger13rr4s7a9ry9glrdk9vhpsjqe0jsyqsru84hdkq", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "10000000000.000000000000000000" + }, + { + "delegator_address": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "9480000000000.000000000000000000" + }, + { + "delegator_address": "shareledger135nzqrwqvdxj09pd0zt57x7g2thsfffp3e43ty", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "5000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "71982855.699865549000000000" + }, + { + "delegator_address": "shareledger1j9u8mkphcy5d2srzztm4lydwppktjjhd85spg5", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1007338396.582361943000000000" + }, + { + "delegator_address": "shareledger1n6p3s9ufeek9a6c95j60jun84w4kkp35k90wly", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "10000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "2419000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "238000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14yaj9fcr223mtgs4dr6k7ppuhu4h7kh245qmk6", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "120000000000.000000000000000000" + }, + { + "delegator_address": "shareledger149uvlj2vwcur9uw9zfkgv5nemytmmcge97jsaf", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "683000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "2000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14nxvdgzzzdyhn9mn6syyca7twdfhfj5zvvq5at", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1500000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "789000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "991000000000.000000000000000000" + }, + { + "delegator_address": "shareledger14mr0afvxh53pd8jel62erw07z49wvcpafe9uzk", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "996257674219.955962282000000000" + }, + { + "delegator_address": "shareledger1k50w05quyw803jel4dn773x6rexk75aphnyupp", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "9980000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "100000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "50000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "499000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1cvv90zd5y74xax7vazzawrzpujrw0vejwaevh5", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "859000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "432828.081979654000000000" + }, + { + "delegator_address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "891947229.407388702000000000" + }, + { + "delegator_address": "shareledger1cektte2pw58dlycx9tfdtp3t559phzfmrg5ml8", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "999000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "489777014848.124093653000000000" + }, + { + "delegator_address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "3000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1ea3aua0rmfg764w06736q6w4qj5q5ekev0npuv", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "3000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "9311822522565.952870039000000000" + }, + { + "delegator_address": "shareledger1644600asaxdptvf574jspvd7twlq9mdn42ur9t", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1341774744247.706108957000000000" + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "shares": "63560056192990503.198771035000000000" + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "6185513275626643.577101798000000000" + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "100001968000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1mrzlepu0kfz5x0h40fa6d20te0maja7e4c97ts", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "86856036543956016.931971215000000000" + }, + { + "delegator_address": "shareledger1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9w7z28p", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1000000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1uxeh0qtls6a5rqw7qpq4aeeplufvw0s8km4dxh", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "50000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "1008189088957.761963315000000000" + }, + { + "delegator_address": "shareledger1un3pf45a397vh9muverny6n26y2zqfvclmneel", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "2043466943582.539962612000000000" + }, + { + "delegator_address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "163603378764957.653743279000000000" + }, + { + "delegator_address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "shares": "1000000000000.000000000000000000" + }, + { + "delegator_address": "shareledger17h8le488erqyea8apnh9crvkks2gj4tsfzvcxw", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "1007338043399.827007214000000000" + }, + { + "delegator_address": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "validator_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "shares": "66923649101505.824856174000000000" + }, + { + "delegator_address": "shareledger1ladn3pw8vp7a7xh4ez624r2zdy3wr6jvh2e7rd", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "shares": "2043465135766.791463778000000000" + } + ], + "unbonding_delegations": [ + { + "delegator_address": "shareledger1p8jjjmtsm9vg3cks9a6ugafgga3a9p65fnkwyw", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "entries": [ + { + "creation_height": "1988102", + "completion_time": "2022-03-08T07:03:47.349611553Z", + "initial_balance": "500000000000000", + "balance": "500000000000000" + }, + { + "creation_height": "2005309", + "completion_time": "2022-03-11T08:35:44.483308418Z", + "initial_balance": "129000000000", + "balance": "129000000000" + } + ] + }, + { + "delegator_address": "shareledger1z6qpn2nxt99ma6enza3dzfp7prux55h8ynkdts", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "entries": [ + { + "creation_height": "1992847", + "completion_time": "2022-03-09T03:20:18.463279751Z", + "initial_balance": "52484227000000000", + "balance": "52484227000000000" + } + ] + }, + { + "delegator_address": "shareledger194y04q628wv0eq062pm9qrwyejdzks5tvztcm9", + "validator_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "entries": [ + { + "creation_height": "1960298", + "completion_time": "2022-03-03T08:13:10.629280179Z", + "initial_balance": "1979000000000", + "balance": "1979000000000" + } + ] + }, + { + "delegator_address": "shareledger19mag0eyv0nznfzhxt2lc5xfu4d58ewjqrzfz5z", + "validator_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "entries": [ + { + "creation_height": "1993383", + "completion_time": "2022-03-09T05:37:39.444178785Z", + "initial_balance": "400004000000000", + "balance": "400004000000000" + } + ] + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_address": "shareledgervaloper1ml6wjyy6hw0gynuzqvvaw4urhcpegcy9xr8002", + "entries": [ + { + "creation_height": "1994075", + "completion_time": "2022-03-09T08:36:23.505691502Z", + "initial_balance": "2879318000000000", + "balance": "2879318000000000" + } + ] + } + ], + "redelegations": [ + { + "delegator_address": "shareledger1tl03794zkluwkldfcjqe3frphtakl375kuzvsm", + "validator_src_address": "shareledgervaloper1pasya6jtvglu9q36nl3tqh5drqzeh0s9098x32", + "validator_dst_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "entries": [ + { + "creation_height": "2046282", + "completion_time": "2022-03-18T15:38:23.937079319Z", + "initial_balance": "1000000000000", + "shares_dst": "1000000000000.000000000000000000" + } + ] + }, + { + "delegator_address": "shareledger10yzqsenp5yestl6wlyq5rmm4tdms44p680v7tl", + "validator_src_address": "shareledgervaloper1w4l5fchs69d9avlgvdehq9ypvdh4xyeveusq8r", + "validator_dst_address": "shareledgervaloper1pdn82hmc36pqfh5qg8q2vcjc60l7h6w8qzcjqz", + "entries": [ + { + "creation_height": "2005313", + "completion_time": "2022-03-11T08:36:46.080349394Z", + "initial_balance": "1000000000000000", + "shares_dst": "1020011719513883.795344222000000000" + } + ] + } + ], + "exported": true + }, + "transfer": { + "denom_traces": [], + "params": { + "receive_enabled": true, + "send_enabled": true + }, + "port_id": "transfer" + }, + "upgrade": {}, + "vesting": {} + } +} \ No newline at end of file diff --git a/deploy/testnet_config/nginx/nginx.conf b/deploy/testnet_config/nginx/nginx.conf new file mode 100644 index 00000000..1ea28436 --- /dev/null +++ b/deploy/testnet_config/nginx/nginx.conf @@ -0,0 +1,41 @@ +upstream lcd { + server snode0:1317; + server snode2:1317; +} + +server { + listen 1317; + location / { + proxy_pass http://lcd; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} + +upstream rpc { + server snode0:26657; + server snode2:26657; +} + +server { + listen 26657; + location / { + proxy_pass http://rpc; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} + +upstream grpc { + server snode0:9090; + server snode2:9090; +} + +server { + listen 9090 http2; + location / { + grpc_pass grpc://grpc; + } +} \ No newline at end of file diff --git a/deploy/testnet_config/node0/config/app.toml b/deploy/testnet_config/node0/config/app.toml new file mode 100644 index 00000000..a82d30f4 --- /dev/null +++ b/deploy/testnet_config/node0/config/app.toml @@ -0,0 +1,199 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Base Configuration ### +############################################################################### + +# The minimum gas prices a validator is willing to accept for processing a +# transaction. A transaction's fees must meet the minimum of any denomination +# specified in this config (e.g. 0.25token1;0.0001token2). +minimum-gas-prices = "0stake" + +# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals +# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) +# everything: all saved states will be deleted, storing only the current state; pruning at 10 block intervals +# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' +pruning = "default" + +# These are applied if and only if the pruning strategy is custom. +pruning-keep-recent = "0" +pruning-keep-every = "0" +pruning-interval = "0" + +# HaltHeight contains a non-zero block height at which a node will gracefully +# halt and shutdown that can be used to assist upgrades and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-height = 0 + +# HaltTime contains a non-zero minimum block time (in Unix seconds) at which +# a node will gracefully halt and shutdown that can be used to assist upgrades +# and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-time = 0 + +# MinRetainBlocks defines the minimum block height offset from the current +# block being committed, such that all blocks past this offset are pruned +# from Tendermint. It is used as part of the process of determining the +# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates +# that no blocks should be pruned. +# +# This configuration value is only responsible for pruning Tendermint blocks. +# It has no bearing on application state pruning which is determined by the +# "pruning-*" configurations. +# +# Note: Tendermint block pruning is dependant on this parameter in conunction +# with the unbonding (safety threshold) period, state pruning and state sync +# snapshot parameters to determine the correct minimum value of +# ResponseCommit.RetainHeight. +min-retain-blocks = 0 + +# InterBlockCache enables inter-block caching. +inter-block-cache = true + +# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, +# which informs Tendermint what to index. If empty, all events will be indexed. +# +# Example: +# ["message.sender", "message.recipient"] +index-events = [] + +############################################################################### +### Telemetry Configuration ### +############################################################################### + +[telemetry] + +# Prefixed with keys to separate services. +service-name = "" + +# Enabled enables the application telemetry functionality. When enabled, +# an in-memory sink is also enabled by default. Operators may also enabled +# other sinks such as Prometheus. +enabled = false + +# Enable prefixing gauge values with hostname. +enable-hostname = false + +# Enable adding hostname to labels. +enable-hostname-label = false + +# Enable adding service to labels. +enable-service-label = false + +# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. +prometheus-retention-time = 0 + +# GlobalLabels defines a global set of name/value label tuples applied to all +# metrics emitted using the wrapper functions defined in telemetry package. +# +# Example: +# [["chain_id", "cosmoshub-1"]] +global-labels = [ +] + +############################################################################### +### API Configuration ### +############################################################################### + +[api] + +# Enable defines if the API server should be enabled. +enable = true + +# Swagger defines if swagger documentation should automatically be registered. +swagger = true + +# Address defines the API server to listen on. +address = "tcp://0.0.0.0:1317" + +# MaxOpenConnections defines the number of maximum open connections. +max-open-connections = 1000 + +# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). +rpc-read-timeout = 10 + +# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). +rpc-write-timeout = 0 + +# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). +rpc-max-body-bytes = 1000000 + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enabled-unsafe-cors = false + +############################################################################### +### Rosetta Configuration ### +############################################################################### + +[rosetta] + +# Enable defines if the Rosetta API server should be enabled. +enable = false + +# Address defines the Rosetta API server to listen on. +address = ":8080" + +# Network defines the name of the blockchain that will be returned by Rosetta. +blockchain = "app" + +# Network defines the name of the network that will be returned by Rosetta. +network = "network" + +# Retries defines the number of retries when connecting to the node before failing. +retries = 3 + +# Offline defines if Rosetta server should run in offline mode. +offline = false + +############################################################################### +### gRPC Configuration ### +############################################################################### + +[grpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the gRPC server address to bind to. +address = "0.0.0.0:9090" + +############################################################################### +### gRPC Web Configuration ### +############################################################################### + +[grpc-web] + +# GRPCWebEnable defines if the gRPC-web should be enabled. +# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. +enable = true + +# Address defines the gRPC-web server address to bind to. +address = "0.0.0.0:9091" + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enable-unsafe-cors = false + +############################################################################### +### State Sync Configuration ### +############################################################################### + +# State sync snapshots allow other nodes to rapidly join the network without replaying historical +# blocks, instead downloading and applying a snapshot of the application state at a given height. +[state-sync] + +# snapshot-interval specifies the block interval at which local state sync snapshots are +# taken (0 to disable). Must be a multiple of pruning-keep-every. +snapshot-interval = 0 + +# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). +snapshot-keep-recent = 2 + +[wasm] +# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries +query_gas_limit = 300000 +# This is the number of wasm vm instances we keep cached in memory for speed-up +# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally +lru_size = 0 \ No newline at end of file diff --git a/deploy/testnet_config/node0/config/client.toml b/deploy/testnet_config/node0/config/client.toml new file mode 100644 index 00000000..5bc4aa1a --- /dev/null +++ b/deploy/testnet_config/node0/config/client.toml @@ -0,0 +1,17 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Client Configuration ### +############################################################################### + +# The network chain ID +chain-id = "ShareRing-Lifestyle" +# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) +keyring-backend = "test" +# CLI output format (text|json) +output = "text" +# : to Tendermint RPC interface for this chain +node = "tcp://localhost:26657" +# Transaction broadcasting mode (sync|async|block) +broadcast-mode = "sync" diff --git a/deploy/testnet_config/node0/config/config.toml b/deploy/testnet_config/node0/config/config.toml new file mode 100644 index 00000000..662e86d9 --- /dev/null +++ b/deploy/testnet_config/node0/config/config.toml @@ -0,0 +1,401 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or +# relative to the home directory (e.g. "data"). The home directory is +# "$HOME/.tendermint" by default, but could be changed via $TMHOME env variable +# or --home cmd flag. + +####################################################################### +### Main Base Config Options ### +####################################################################### + +# TCP or UNIX socket address of the ABCI application, +# or the name of an ABCI application compiled in with the Tendermint binary +proxy_app = "tcp://127.0.0.1:26658" + +# A custom human readable name for this node +moniker = "snode0" + +# If this node is many blocks behind the tip of the chain, FastSync +# allows them to catchup quickly by downloading blocks in parallel +# and verifying their commits +fast_sync = true + +# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb +# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) +# - pure go +# - stable +# * cleveldb (uses levigo wrapper) +# - fast +# - requires gcc +# - use cleveldb build tag (go build -tags cleveldb) +# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) +# - EXPERIMENTAL +# - may be faster is some use-cases (random reads - indexer) +# - use boltdb build tag (go build -tags boltdb) +# * rocksdb (uses github.com/tecbot/gorocksdb) +# - EXPERIMENTAL +# - requires gcc +# - use rocksdb build tag (go build -tags rocksdb) +# * badgerdb (uses github.com/dgraph-io/badger) +# - EXPERIMENTAL +# - use badgerdb build tag (go build -tags badgerdb) +db_backend = "goleveldb" + +# Database directory +db_dir = "data" + +# Output level for logging, including package level options +log_level = "info" + +# Output format: 'plain' (colored text) or 'json' +log_format = "plain" + +##### additional base config options ##### + +# Path to the JSON file containing the initial validator set and other meta data +genesis_file = "config/genesis.json" + +# Path to the JSON file containing the private key to use as a validator in the consensus protocol +priv_validator_key_file = "config/priv_validator_key.json" + +# Path to the JSON file containing the last sign state of a validator +priv_validator_state_file = "data/priv_validator_state.json" + +# TCP or UNIX socket address for Tendermint to listen on for +# connections from an external PrivValidator process +priv_validator_laddr = "" + +# Path to the JSON file containing the private key to use for node authentication in the p2p protocol +node_key_file = "config/node_key.json" + +# Mechanism to connect to the ABCI application: socket | grpc +abci = "socket" + +# If true, query the ABCI app on connecting to a new peer +# so the app can decide if we should keep the connection or not +filter_peers = false + + +####################################################################### +### Advanced Configuration Options ### +####################################################################### + +####################################################### +### RPC Server Configuration Options ### +####################################################### +[rpc] + +# TCP or UNIX socket address for the RPC server to listen on +laddr = "tcp://127.0.0.1:26657" + +# A list of origins a cross-domain request can be executed from +# Default value '[]' disables cors support +# Use '["*"]' to allow any origin +cors_allowed_origins = [] + +# A list of methods the client is allowed to use with cross-domain requests +cors_allowed_methods = ["HEAD", "GET", "POST", ] + +# A list of non simple headers the client is allowed to use with cross-domain requests +cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] + +# TCP or UNIX socket address for the gRPC server to listen on +# NOTE: This server only supports /broadcast_tx_commit +grpc_laddr = "" + +# Maximum number of simultaneous connections. +# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +grpc_max_open_connections = 900 + +# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool +unsafe = false + +# Maximum number of simultaneous connections (including WebSocket). +# Does not include gRPC connections. See grpc_max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +max_open_connections = 900 + +# Maximum number of unique clientIDs that can /subscribe +# If you're using /broadcast_tx_commit, set to the estimated maximum number +# of broadcast_tx_commit calls per block. +max_subscription_clients = 100 + +# Maximum number of unique queries a given client can /subscribe to +# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to +# the estimated # maximum number of broadcast_tx_commit calls per block. +max_subscriptions_per_client = 5 + +# How long to wait for a tx to be committed during /broadcast_tx_commit. +# WARNING: Using a value larger than 10s will result in increasing the +# global HTTP write timeout, which applies to all connections and endpoints. +# See https://github.com/tendermint/tendermint/issues/3435 +timeout_broadcast_tx_commit = "10s" + +# Maximum size of request body, in bytes +max_body_bytes = 1000000 + +# Maximum size of request header, in bytes +max_header_bytes = 1048576 + +# The path to a file containing certificate that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# If the certificate is signed by a certificate authority, +# the certFile should be the concatenation of the server's certificate, any intermediates, +# and the CA's certificate. +# NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_cert_file = "" + +# The path to a file containing matching private key that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_key_file = "" + +# pprof listen address (https://golang.org/pkg/net/http/pprof) +pprof_laddr = "localhost:6060" + +####################################################### +### P2P Configuration Options ### +####################################################### +[p2p] + +# Address to listen for incoming connections +laddr = "tcp://0.0.0.0:26656" + +# Address to advertise to peers for them to dial +# If empty, will use the same port as the laddr, +# and will introspect on the listener or use UPnP +# to figure out the address. ip and port are required +# example: 159.89.10.97:26656 +external_address = "" + +# Comma separated list of seed nodes to connect to +seeds = "" + +# Comma separated list of nodes to keep persistent connections to +persistent_peers = "" + +# UPNP port forwarding +upnp = false + +# Path to address book +addr_book_file = "config/addrbook.json" + +# Set true for strict address routability rules +# Set false for private or local networks +addr_book_strict = true + +# Maximum number of inbound peers +max_num_inbound_peers = 40 + +# Maximum number of outbound peers to connect to, excluding persistent peers +max_num_outbound_peers = 10 + +# List of node IDs, to which a connection will be (re)established ignoring any existing limits +unconditional_peer_ids = "" + +# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) +persistent_peers_max_dial_period = "0s" + +# Time to wait before flushing messages out on the connection +flush_throttle_timeout = "100ms" + +# Maximum size of a message packet payload, in bytes +max_packet_msg_payload_size = 1024 + +# Rate at which packets can be sent, in bytes/second +send_rate = 5120000 + +# Rate at which packets can be received, in bytes/second +recv_rate = 5120000 + +# Set true to enable the peer-exchange reactor +pex = true + +# Seed mode, in which node constantly crawls the network and looks for +# peers. If another node asks it for addresses, it responds and disconnects. +# +# Does not work if the peer-exchange reactor is disabled. +seed_mode = false + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +private_peer_ids = "" + +# Toggle to disable guard against peers connecting from the same ip. +allow_duplicate_ip = false + +# Peer connection configuration. +handshake_timeout = "20s" +dial_timeout = "3s" + +####################################################### +### Mempool Configuration Option ### +####################################################### +[mempool] + +recheck = true +broadcast = true +wal_dir = "" + +# Maximum number of transactions in the mempool +size = 5000 + +# Limit the total size of all txs in the mempool. +# This only accounts for raw transactions (e.g. given 1MB transactions and +# max_txs_bytes=5MB, mempool will only accept 5 transactions). +max_txs_bytes = 1073741824 + +# Size of the cache (used to filter transactions we saw earlier) in transactions +cache_size = 10000 + +# Do not remove invalid transactions from the cache (default: false) +# Set to true if it's not possible for any invalid transaction to become valid +# again in the future. +keep-invalid-txs-in-cache = false + +# Maximum size of a single transaction. +# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. +max_tx_bytes = 1048576 + +# Maximum size of a batch of transactions to send to a peer +# Including space needed by encoding (one varint per transaction). +# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 +max_batch_bytes = 0 + +####################################################### +### State Sync Configuration Options ### +####################################################### +[statesync] +# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine +# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in +# the network to take and serve state machine snapshots. State sync is not attempted if the node +# has any local state (LastBlockHeight > 0). The node will have a truncated block history, +# starting from the height of the snapshot. +enable = false + +# RPC servers (comma-separated) for light client verification of the synced state machine and +# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding +# header hash obtained from a trusted source, and a period during which validators can be trusted. +# +# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 +# weeks) during which they can be financially punished (slashed) for misbehavior. +rpc_servers = "" +trust_height = 0 +trust_hash = "" +trust_period = "168h0m0s" + +# Time to spend discovering snapshots before initiating a restore. +discovery_time = "15s" + +# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). +# Will create a new, randomly named directory within, and remove it when done. +temp_dir = "" + +# The timeout duration before re-requesting a chunk, possibly from a different +# peer (default: 1 minute). +chunk_request_timeout = "10s" + +# The number of concurrent chunk fetchers to run (default: 1). +chunk_fetchers = "4" + +####################################################### +### Fast Sync Configuration Connections ### +####################################################### +[fastsync] + +# Fast Sync version to use: +# 1) "v0" (default) - the legacy fast sync implementation +# 2) "v1" - refactor of v0 version for better testability +# 2) "v2" - complete redesign of v0, optimized for testability & readability +version = "v0" + +####################################################### +### Consensus Configuration Options ### +####################################################### +[consensus] + +wal_file = "data/cs.wal/wal" + +# How long we wait for a proposal block before prevoting nil +timeout_propose = "3s" +# 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) +timeout_prevote = "1s" +# How much the timeout_prevote increases with each round +timeout_prevote_delta = "500ms" +# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) +timeout_precommit = "1s" +# How much the timeout_precommit increases with each round +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 = "5s" + +# 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 +# if the same consensus key was used to sign {double_sign_check_height} last blocks. +# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. +double_sign_check_height = 0 + +# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) +skip_timeout_commit = false + +# EmptyBlocks mode and possible interval between empty blocks +create_empty_blocks = true +create_empty_blocks_interval = "0s" + +# Reactor sleep duration parameters +peer_gossip_sleep_duration = "100ms" +peer_query_maj23_sleep_duration = "2s" + +####################################################### +### Transaction Indexer Configuration Options ### +####################################################### +[tx_index] + +# What indexer to use for transactions +# +# The application will set which txs to index. In some cases a node operator will be able +# to decide which txs to index based on configuration set in the application. +# +# Options: +# 1) "null" +# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. +indexer = "kv" + +####################################################### +### Instrumentation Configuration Options ### +####################################################### +[instrumentation] + +# When true, Prometheus metrics are served under /metrics on +# PrometheusListenAddr. +# Check out the documentation for the list of available metrics. +prometheus = false + +# Address to listen for Prometheus collector(s) connections +prometheus_listen_addr = ":26660" + +# Maximum number of simultaneous connections. +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +max_open_connections = 3 + +# Instrumentation namespace +namespace = "tendermint" diff --git a/deploy/testnet_config/node0/config/node_key.json b/deploy/testnet_config/node0/config/node_key.json new file mode 100644 index 00000000..f32f78e6 --- /dev/null +++ b/deploy/testnet_config/node0/config/node_key.json @@ -0,0 +1 @@ +{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"D+gsKGl90rFmBrNLOFLc6rd+PXSPF11kJS2KXd7Cx9p2V/PNpBKv2za93gCagK/ZfcTpayZl+HF1EJy2nMDFfA=="}} \ No newline at end of file diff --git a/deploy/testnet_config/node0/config/priv_validator_key.json b/deploy/testnet_config/node0/config/priv_validator_key.json new file mode 100644 index 00000000..e2b39f2a --- /dev/null +++ b/deploy/testnet_config/node0/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "address": "9F5EDCBEB2F7E500E9D751EC5473E7604B3C3AE2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VEeE31lZUFGcsoJHhe3NavaWrtvi3+FHYJY9PUhgELc=" + }, + "priv_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "0zAgpGD4TFagrmHVoMJhQhBKdAGPbT2xm4NnToAdrJ1UR4TfWVlQUZyygkeF7c1q9pau2+Lf4Udglj09SGAQtw==" + } +} \ No newline at end of file diff --git a/deploy/testnet_config/node0/data/priv_validator_state.json b/deploy/testnet_config/node0/data/priv_validator_state.json new file mode 100644 index 00000000..48f3b67e --- /dev/null +++ b/deploy/testnet_config/node0/data/priv_validator_state.json @@ -0,0 +1,5 @@ +{ + "height": "0", + "round": 0, + "step": 0 +} \ No newline at end of file diff --git a/deploy/testnet_config/node1/config/app.toml b/deploy/testnet_config/node1/config/app.toml new file mode 100644 index 00000000..a82d30f4 --- /dev/null +++ b/deploy/testnet_config/node1/config/app.toml @@ -0,0 +1,199 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Base Configuration ### +############################################################################### + +# The minimum gas prices a validator is willing to accept for processing a +# transaction. A transaction's fees must meet the minimum of any denomination +# specified in this config (e.g. 0.25token1;0.0001token2). +minimum-gas-prices = "0stake" + +# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals +# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) +# everything: all saved states will be deleted, storing only the current state; pruning at 10 block intervals +# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' +pruning = "default" + +# These are applied if and only if the pruning strategy is custom. +pruning-keep-recent = "0" +pruning-keep-every = "0" +pruning-interval = "0" + +# HaltHeight contains a non-zero block height at which a node will gracefully +# halt and shutdown that can be used to assist upgrades and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-height = 0 + +# HaltTime contains a non-zero minimum block time (in Unix seconds) at which +# a node will gracefully halt and shutdown that can be used to assist upgrades +# and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-time = 0 + +# MinRetainBlocks defines the minimum block height offset from the current +# block being committed, such that all blocks past this offset are pruned +# from Tendermint. It is used as part of the process of determining the +# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates +# that no blocks should be pruned. +# +# This configuration value is only responsible for pruning Tendermint blocks. +# It has no bearing on application state pruning which is determined by the +# "pruning-*" configurations. +# +# Note: Tendermint block pruning is dependant on this parameter in conunction +# with the unbonding (safety threshold) period, state pruning and state sync +# snapshot parameters to determine the correct minimum value of +# ResponseCommit.RetainHeight. +min-retain-blocks = 0 + +# InterBlockCache enables inter-block caching. +inter-block-cache = true + +# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, +# which informs Tendermint what to index. If empty, all events will be indexed. +# +# Example: +# ["message.sender", "message.recipient"] +index-events = [] + +############################################################################### +### Telemetry Configuration ### +############################################################################### + +[telemetry] + +# Prefixed with keys to separate services. +service-name = "" + +# Enabled enables the application telemetry functionality. When enabled, +# an in-memory sink is also enabled by default. Operators may also enabled +# other sinks such as Prometheus. +enabled = false + +# Enable prefixing gauge values with hostname. +enable-hostname = false + +# Enable adding hostname to labels. +enable-hostname-label = false + +# Enable adding service to labels. +enable-service-label = false + +# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. +prometheus-retention-time = 0 + +# GlobalLabels defines a global set of name/value label tuples applied to all +# metrics emitted using the wrapper functions defined in telemetry package. +# +# Example: +# [["chain_id", "cosmoshub-1"]] +global-labels = [ +] + +############################################################################### +### API Configuration ### +############################################################################### + +[api] + +# Enable defines if the API server should be enabled. +enable = true + +# Swagger defines if swagger documentation should automatically be registered. +swagger = true + +# Address defines the API server to listen on. +address = "tcp://0.0.0.0:1317" + +# MaxOpenConnections defines the number of maximum open connections. +max-open-connections = 1000 + +# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). +rpc-read-timeout = 10 + +# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). +rpc-write-timeout = 0 + +# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). +rpc-max-body-bytes = 1000000 + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enabled-unsafe-cors = false + +############################################################################### +### Rosetta Configuration ### +############################################################################### + +[rosetta] + +# Enable defines if the Rosetta API server should be enabled. +enable = false + +# Address defines the Rosetta API server to listen on. +address = ":8080" + +# Network defines the name of the blockchain that will be returned by Rosetta. +blockchain = "app" + +# Network defines the name of the network that will be returned by Rosetta. +network = "network" + +# Retries defines the number of retries when connecting to the node before failing. +retries = 3 + +# Offline defines if Rosetta server should run in offline mode. +offline = false + +############################################################################### +### gRPC Configuration ### +############################################################################### + +[grpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the gRPC server address to bind to. +address = "0.0.0.0:9090" + +############################################################################### +### gRPC Web Configuration ### +############################################################################### + +[grpc-web] + +# GRPCWebEnable defines if the gRPC-web should be enabled. +# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. +enable = true + +# Address defines the gRPC-web server address to bind to. +address = "0.0.0.0:9091" + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enable-unsafe-cors = false + +############################################################################### +### State Sync Configuration ### +############################################################################### + +# State sync snapshots allow other nodes to rapidly join the network without replaying historical +# blocks, instead downloading and applying a snapshot of the application state at a given height. +[state-sync] + +# snapshot-interval specifies the block interval at which local state sync snapshots are +# taken (0 to disable). Must be a multiple of pruning-keep-every. +snapshot-interval = 0 + +# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). +snapshot-keep-recent = 2 + +[wasm] +# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries +query_gas_limit = 300000 +# This is the number of wasm vm instances we keep cached in memory for speed-up +# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally +lru_size = 0 \ No newline at end of file diff --git a/deploy/testnet_config/node1/config/client.toml b/deploy/testnet_config/node1/config/client.toml new file mode 100644 index 00000000..5bc4aa1a --- /dev/null +++ b/deploy/testnet_config/node1/config/client.toml @@ -0,0 +1,17 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Client Configuration ### +############################################################################### + +# The network chain ID +chain-id = "ShareRing-Lifestyle" +# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) +keyring-backend = "test" +# CLI output format (text|json) +output = "text" +# : to Tendermint RPC interface for this chain +node = "tcp://localhost:26657" +# Transaction broadcasting mode (sync|async|block) +broadcast-mode = "sync" diff --git a/deploy/testnet_config/node1/config/config.toml b/deploy/testnet_config/node1/config/config.toml new file mode 100644 index 00000000..89dba39f --- /dev/null +++ b/deploy/testnet_config/node1/config/config.toml @@ -0,0 +1,401 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or +# relative to the home directory (e.g. "data"). The home directory is +# "$HOME/.tendermint" by default, but could be changed via $TMHOME env variable +# or --home cmd flag. + +####################################################################### +### Main Base Config Options ### +####################################################################### + +# TCP or UNIX socket address of the ABCI application, +# or the name of an ABCI application compiled in with the Tendermint binary +proxy_app = "tcp://127.0.0.1:26658" + +# A custom human readable name for this node +moniker = "snode1" + +# If this node is many blocks behind the tip of the chain, FastSync +# allows them to catchup quickly by downloading blocks in parallel +# and verifying their commits +fast_sync = true + +# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb +# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) +# - pure go +# - stable +# * cleveldb (uses levigo wrapper) +# - fast +# - requires gcc +# - use cleveldb build tag (go build -tags cleveldb) +# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) +# - EXPERIMENTAL +# - may be faster is some use-cases (random reads - indexer) +# - use boltdb build tag (go build -tags boltdb) +# * rocksdb (uses github.com/tecbot/gorocksdb) +# - EXPERIMENTAL +# - requires gcc +# - use rocksdb build tag (go build -tags rocksdb) +# * badgerdb (uses github.com/dgraph-io/badger) +# - EXPERIMENTAL +# - use badgerdb build tag (go build -tags badgerdb) +db_backend = "goleveldb" + +# Database directory +db_dir = "data" + +# Output level for logging, including package level options +log_level = "info" + +# Output format: 'plain' (colored text) or 'json' +log_format = "plain" + +##### additional base config options ##### + +# Path to the JSON file containing the initial validator set and other meta data +genesis_file = "config/genesis.json" + +# Path to the JSON file containing the private key to use as a validator in the consensus protocol +priv_validator_key_file = "config/priv_validator_key.json" + +# Path to the JSON file containing the last sign state of a validator +priv_validator_state_file = "data/priv_validator_state.json" + +# TCP or UNIX socket address for Tendermint to listen on for +# connections from an external PrivValidator process +priv_validator_laddr = "" + +# Path to the JSON file containing the private key to use for node authentication in the p2p protocol +node_key_file = "config/node_key.json" + +# Mechanism to connect to the ABCI application: socket | grpc +abci = "socket" + +# If true, query the ABCI app on connecting to a new peer +# so the app can decide if we should keep the connection or not +filter_peers = false + + +####################################################################### +### Advanced Configuration Options ### +####################################################################### + +####################################################### +### RPC Server Configuration Options ### +####################################################### +[rpc] + +# TCP or UNIX socket address for the RPC server to listen on +laddr = "tcp://127.0.0.1:26657" + +# A list of origins a cross-domain request can be executed from +# Default value '[]' disables cors support +# Use '["*"]' to allow any origin +cors_allowed_origins = [] + +# A list of methods the client is allowed to use with cross-domain requests +cors_allowed_methods = ["HEAD", "GET", "POST", ] + +# A list of non simple headers the client is allowed to use with cross-domain requests +cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] + +# TCP or UNIX socket address for the gRPC server to listen on +# NOTE: This server only supports /broadcast_tx_commit +grpc_laddr = "" + +# Maximum number of simultaneous connections. +# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +grpc_max_open_connections = 900 + +# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool +unsafe = false + +# Maximum number of simultaneous connections (including WebSocket). +# Does not include gRPC connections. See grpc_max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +max_open_connections = 900 + +# Maximum number of unique clientIDs that can /subscribe +# If you're using /broadcast_tx_commit, set to the estimated maximum number +# of broadcast_tx_commit calls per block. +max_subscription_clients = 100 + +# Maximum number of unique queries a given client can /subscribe to +# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to +# the estimated # maximum number of broadcast_tx_commit calls per block. +max_subscriptions_per_client = 5 + +# How long to wait for a tx to be committed during /broadcast_tx_commit. +# WARNING: Using a value larger than 10s will result in increasing the +# global HTTP write timeout, which applies to all connections and endpoints. +# See https://github.com/tendermint/tendermint/issues/3435 +timeout_broadcast_tx_commit = "10s" + +# Maximum size of request body, in bytes +max_body_bytes = 1000000 + +# Maximum size of request header, in bytes +max_header_bytes = 1048576 + +# The path to a file containing certificate that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# If the certificate is signed by a certificate authority, +# the certFile should be the concatenation of the server's certificate, any intermediates, +# and the CA's certificate. +# NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_cert_file = "" + +# The path to a file containing matching private key that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_key_file = "" + +# pprof listen address (https://golang.org/pkg/net/http/pprof) +pprof_laddr = "localhost:6060" + +####################################################### +### P2P Configuration Options ### +####################################################### +[p2p] + +# Address to listen for incoming connections +laddr = "tcp://0.0.0.0:26656" + +# Address to advertise to peers for them to dial +# If empty, will use the same port as the laddr, +# and will introspect on the listener or use UPnP +# to figure out the address. ip and port are required +# example: 159.89.10.97:26656 +external_address = "" + +# Comma separated list of seed nodes to connect to +seeds = "" + +# Comma separated list of nodes to keep persistent connections to +persistent_peers = "" + +# UPNP port forwarding +upnp = false + +# Path to address book +addr_book_file = "config/addrbook.json" + +# Set true for strict address routability rules +# Set false for private or local networks +addr_book_strict = true + +# Maximum number of inbound peers +max_num_inbound_peers = 40 + +# Maximum number of outbound peers to connect to, excluding persistent peers +max_num_outbound_peers = 10 + +# List of node IDs, to which a connection will be (re)established ignoring any existing limits +unconditional_peer_ids = "" + +# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) +persistent_peers_max_dial_period = "0s" + +# Time to wait before flushing messages out on the connection +flush_throttle_timeout = "100ms" + +# Maximum size of a message packet payload, in bytes +max_packet_msg_payload_size = 1024 + +# Rate at which packets can be sent, in bytes/second +send_rate = 5120000 + +# Rate at which packets can be received, in bytes/second +recv_rate = 5120000 + +# Set true to enable the peer-exchange reactor +pex = true + +# Seed mode, in which node constantly crawls the network and looks for +# peers. If another node asks it for addresses, it responds and disconnects. +# +# Does not work if the peer-exchange reactor is disabled. +seed_mode = false + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +private_peer_ids = "" + +# Toggle to disable guard against peers connecting from the same ip. +allow_duplicate_ip = false + +# Peer connection configuration. +handshake_timeout = "20s" +dial_timeout = "3s" + +####################################################### +### Mempool Configuration Option ### +####################################################### +[mempool] + +recheck = true +broadcast = true +wal_dir = "" + +# Maximum number of transactions in the mempool +size = 5000 + +# Limit the total size of all txs in the mempool. +# This only accounts for raw transactions (e.g. given 1MB transactions and +# max_txs_bytes=5MB, mempool will only accept 5 transactions). +max_txs_bytes = 1073741824 + +# Size of the cache (used to filter transactions we saw earlier) in transactions +cache_size = 10000 + +# Do not remove invalid transactions from the cache (default: false) +# Set to true if it's not possible for any invalid transaction to become valid +# again in the future. +keep-invalid-txs-in-cache = false + +# Maximum size of a single transaction. +# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. +max_tx_bytes = 1048576 + +# Maximum size of a batch of transactions to send to a peer +# Including space needed by encoding (one varint per transaction). +# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 +max_batch_bytes = 0 + +####################################################### +### State Sync Configuration Options ### +####################################################### +[statesync] +# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine +# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in +# the network to take and serve state machine snapshots. State sync is not attempted if the node +# has any local state (LastBlockHeight > 0). The node will have a truncated block history, +# starting from the height of the snapshot. +enable = false + +# RPC servers (comma-separated) for light client verification of the synced state machine and +# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding +# header hash obtained from a trusted source, and a period during which validators can be trusted. +# +# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 +# weeks) during which they can be financially punished (slashed) for misbehavior. +rpc_servers = "" +trust_height = 0 +trust_hash = "" +trust_period = "168h0m0s" + +# Time to spend discovering snapshots before initiating a restore. +discovery_time = "15s" + +# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). +# Will create a new, randomly named directory within, and remove it when done. +temp_dir = "" + +# The timeout duration before re-requesting a chunk, possibly from a different +# peer (default: 1 minute). +chunk_request_timeout = "10s" + +# The number of concurrent chunk fetchers to run (default: 1). +chunk_fetchers = "4" + +####################################################### +### Fast Sync Configuration Connections ### +####################################################### +[fastsync] + +# Fast Sync version to use: +# 1) "v0" (default) - the legacy fast sync implementation +# 2) "v1" - refactor of v0 version for better testability +# 2) "v2" - complete redesign of v0, optimized for testability & readability +version = "v0" + +####################################################### +### Consensus Configuration Options ### +####################################################### +[consensus] + +wal_file = "data/cs.wal/wal" + +# How long we wait for a proposal block before prevoting nil +timeout_propose = "3s" +# 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) +timeout_prevote = "1s" +# How much the timeout_prevote increases with each round +timeout_prevote_delta = "500ms" +# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) +timeout_precommit = "1s" +# How much the timeout_precommit increases with each round +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 = "5s" + +# 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 +# if the same consensus key was used to sign {double_sign_check_height} last blocks. +# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. +double_sign_check_height = 0 + +# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) +skip_timeout_commit = false + +# EmptyBlocks mode and possible interval between empty blocks +create_empty_blocks = true +create_empty_blocks_interval = "0s" + +# Reactor sleep duration parameters +peer_gossip_sleep_duration = "100ms" +peer_query_maj23_sleep_duration = "2s" + +####################################################### +### Transaction Indexer Configuration Options ### +####################################################### +[tx_index] + +# What indexer to use for transactions +# +# The application will set which txs to index. In some cases a node operator will be able +# to decide which txs to index based on configuration set in the application. +# +# Options: +# 1) "null" +# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. +indexer = "kv" + +####################################################### +### Instrumentation Configuration Options ### +####################################################### +[instrumentation] + +# When true, Prometheus metrics are served under /metrics on +# PrometheusListenAddr. +# Check out the documentation for the list of available metrics. +prometheus = false + +# Address to listen for Prometheus collector(s) connections +prometheus_listen_addr = ":26660" + +# Maximum number of simultaneous connections. +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +max_open_connections = 3 + +# Instrumentation namespace +namespace = "tendermint" diff --git a/deploy/testnet_config/node1/config/node_key.json b/deploy/testnet_config/node1/config/node_key.json new file mode 100644 index 00000000..2f0ebd4d --- /dev/null +++ b/deploy/testnet_config/node1/config/node_key.json @@ -0,0 +1 @@ +{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"Q2nF4D2S9/UpxHOPjrn8FhH8VBUuxeVFjy4m3Rp0rLI/5hgw5dWH+DkqUt1LwLICiTZtfxAPBcIq3NN65edFHw=="}} \ No newline at end of file diff --git a/deploy/testnet_config/node1/config/priv_validator_key.json b/deploy/testnet_config/node1/config/priv_validator_key.json new file mode 100644 index 00000000..f526574e --- /dev/null +++ b/deploy/testnet_config/node1/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "address": "25E25EF679F9389E605F3A164A315D892948F934", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "06LG6DYzDwsU19tSau4xXBj0x3I18B8pBIn90GCYMDk=" + }, + "priv_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "55bhV6zM4e6PoVUbXYdLpbvGl7a4s6CD4YAE/n/udq3TosboNjMPCxTX21Jq7jFcGPTHcjXwHykEif3QYJgwOQ==" + } +} \ No newline at end of file diff --git a/deploy/testnet_config/node1/data/priv_validator_state.json b/deploy/testnet_config/node1/data/priv_validator_state.json new file mode 100644 index 00000000..48f3b67e --- /dev/null +++ b/deploy/testnet_config/node1/data/priv_validator_state.json @@ -0,0 +1,5 @@ +{ + "height": "0", + "round": 0, + "step": 0 +} \ No newline at end of file diff --git a/deploy/testnet_config/node2/config/app.toml b/deploy/testnet_config/node2/config/app.toml new file mode 100644 index 00000000..a82d30f4 --- /dev/null +++ b/deploy/testnet_config/node2/config/app.toml @@ -0,0 +1,199 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Base Configuration ### +############################################################################### + +# The minimum gas prices a validator is willing to accept for processing a +# transaction. A transaction's fees must meet the minimum of any denomination +# specified in this config (e.g. 0.25token1;0.0001token2). +minimum-gas-prices = "0stake" + +# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals +# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) +# everything: all saved states will be deleted, storing only the current state; pruning at 10 block intervals +# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' +pruning = "default" + +# These are applied if and only if the pruning strategy is custom. +pruning-keep-recent = "0" +pruning-keep-every = "0" +pruning-interval = "0" + +# HaltHeight contains a non-zero block height at which a node will gracefully +# halt and shutdown that can be used to assist upgrades and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-height = 0 + +# HaltTime contains a non-zero minimum block time (in Unix seconds) at which +# a node will gracefully halt and shutdown that can be used to assist upgrades +# and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-time = 0 + +# MinRetainBlocks defines the minimum block height offset from the current +# block being committed, such that all blocks past this offset are pruned +# from Tendermint. It is used as part of the process of determining the +# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates +# that no blocks should be pruned. +# +# This configuration value is only responsible for pruning Tendermint blocks. +# It has no bearing on application state pruning which is determined by the +# "pruning-*" configurations. +# +# Note: Tendermint block pruning is dependant on this parameter in conunction +# with the unbonding (safety threshold) period, state pruning and state sync +# snapshot parameters to determine the correct minimum value of +# ResponseCommit.RetainHeight. +min-retain-blocks = 0 + +# InterBlockCache enables inter-block caching. +inter-block-cache = true + +# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, +# which informs Tendermint what to index. If empty, all events will be indexed. +# +# Example: +# ["message.sender", "message.recipient"] +index-events = [] + +############################################################################### +### Telemetry Configuration ### +############################################################################### + +[telemetry] + +# Prefixed with keys to separate services. +service-name = "" + +# Enabled enables the application telemetry functionality. When enabled, +# an in-memory sink is also enabled by default. Operators may also enabled +# other sinks such as Prometheus. +enabled = false + +# Enable prefixing gauge values with hostname. +enable-hostname = false + +# Enable adding hostname to labels. +enable-hostname-label = false + +# Enable adding service to labels. +enable-service-label = false + +# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. +prometheus-retention-time = 0 + +# GlobalLabels defines a global set of name/value label tuples applied to all +# metrics emitted using the wrapper functions defined in telemetry package. +# +# Example: +# [["chain_id", "cosmoshub-1"]] +global-labels = [ +] + +############################################################################### +### API Configuration ### +############################################################################### + +[api] + +# Enable defines if the API server should be enabled. +enable = true + +# Swagger defines if swagger documentation should automatically be registered. +swagger = true + +# Address defines the API server to listen on. +address = "tcp://0.0.0.0:1317" + +# MaxOpenConnections defines the number of maximum open connections. +max-open-connections = 1000 + +# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). +rpc-read-timeout = 10 + +# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). +rpc-write-timeout = 0 + +# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). +rpc-max-body-bytes = 1000000 + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enabled-unsafe-cors = false + +############################################################################### +### Rosetta Configuration ### +############################################################################### + +[rosetta] + +# Enable defines if the Rosetta API server should be enabled. +enable = false + +# Address defines the Rosetta API server to listen on. +address = ":8080" + +# Network defines the name of the blockchain that will be returned by Rosetta. +blockchain = "app" + +# Network defines the name of the network that will be returned by Rosetta. +network = "network" + +# Retries defines the number of retries when connecting to the node before failing. +retries = 3 + +# Offline defines if Rosetta server should run in offline mode. +offline = false + +############################################################################### +### gRPC Configuration ### +############################################################################### + +[grpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the gRPC server address to bind to. +address = "0.0.0.0:9090" + +############################################################################### +### gRPC Web Configuration ### +############################################################################### + +[grpc-web] + +# GRPCWebEnable defines if the gRPC-web should be enabled. +# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. +enable = true + +# Address defines the gRPC-web server address to bind to. +address = "0.0.0.0:9091" + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enable-unsafe-cors = false + +############################################################################### +### State Sync Configuration ### +############################################################################### + +# State sync snapshots allow other nodes to rapidly join the network without replaying historical +# blocks, instead downloading and applying a snapshot of the application state at a given height. +[state-sync] + +# snapshot-interval specifies the block interval at which local state sync snapshots are +# taken (0 to disable). Must be a multiple of pruning-keep-every. +snapshot-interval = 0 + +# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). +snapshot-keep-recent = 2 + +[wasm] +# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries +query_gas_limit = 300000 +# This is the number of wasm vm instances we keep cached in memory for speed-up +# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally +lru_size = 0 \ No newline at end of file diff --git a/deploy/testnet_config/node2/config/client.toml b/deploy/testnet_config/node2/config/client.toml new file mode 100644 index 00000000..5bc4aa1a --- /dev/null +++ b/deploy/testnet_config/node2/config/client.toml @@ -0,0 +1,17 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Client Configuration ### +############################################################################### + +# The network chain ID +chain-id = "ShareRing-Lifestyle" +# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) +keyring-backend = "test" +# CLI output format (text|json) +output = "text" +# : to Tendermint RPC interface for this chain +node = "tcp://localhost:26657" +# Transaction broadcasting mode (sync|async|block) +broadcast-mode = "sync" diff --git a/deploy/testnet_config/node2/config/config.toml b/deploy/testnet_config/node2/config/config.toml new file mode 100644 index 00000000..61655747 --- /dev/null +++ b/deploy/testnet_config/node2/config/config.toml @@ -0,0 +1,401 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or +# relative to the home directory (e.g. "data"). The home directory is +# "$HOME/.tendermint" by default, but could be changed via $TMHOME env variable +# or --home cmd flag. + +####################################################################### +### Main Base Config Options ### +####################################################################### + +# TCP or UNIX socket address of the ABCI application, +# or the name of an ABCI application compiled in with the Tendermint binary +proxy_app = "tcp://127.0.0.1:26658" + +# A custom human readable name for this node +moniker = "snode2" + +# If this node is many blocks behind the tip of the chain, FastSync +# allows them to catchup quickly by downloading blocks in parallel +# and verifying their commits +fast_sync = true + +# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb +# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) +# - pure go +# - stable +# * cleveldb (uses levigo wrapper) +# - fast +# - requires gcc +# - use cleveldb build tag (go build -tags cleveldb) +# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) +# - EXPERIMENTAL +# - may be faster is some use-cases (random reads - indexer) +# - use boltdb build tag (go build -tags boltdb) +# * rocksdb (uses github.com/tecbot/gorocksdb) +# - EXPERIMENTAL +# - requires gcc +# - use rocksdb build tag (go build -tags rocksdb) +# * badgerdb (uses github.com/dgraph-io/badger) +# - EXPERIMENTAL +# - use badgerdb build tag (go build -tags badgerdb) +db_backend = "goleveldb" + +# Database directory +db_dir = "data" + +# Output level for logging, including package level options +log_level = "info" + +# Output format: 'plain' (colored text) or 'json' +log_format = "plain" + +##### additional base config options ##### + +# Path to the JSON file containing the initial validator set and other meta data +genesis_file = "config/genesis.json" + +# Path to the JSON file containing the private key to use as a validator in the consensus protocol +priv_validator_key_file = "config/priv_validator_key.json" + +# Path to the JSON file containing the last sign state of a validator +priv_validator_state_file = "data/priv_validator_state.json" + +# TCP or UNIX socket address for Tendermint to listen on for +# connections from an external PrivValidator process +priv_validator_laddr = "" + +# Path to the JSON file containing the private key to use for node authentication in the p2p protocol +node_key_file = "config/node_key.json" + +# Mechanism to connect to the ABCI application: socket | grpc +abci = "socket" + +# If true, query the ABCI app on connecting to a new peer +# so the app can decide if we should keep the connection or not +filter_peers = false + + +####################################################################### +### Advanced Configuration Options ### +####################################################################### + +####################################################### +### RPC Server Configuration Options ### +####################################################### +[rpc] + +# TCP or UNIX socket address for the RPC server to listen on +laddr = "tcp://127.0.0.1:26657" + +# A list of origins a cross-domain request can be executed from +# Default value '[]' disables cors support +# Use '["*"]' to allow any origin +cors_allowed_origins = [] + +# A list of methods the client is allowed to use with cross-domain requests +cors_allowed_methods = ["HEAD", "GET", "POST", ] + +# A list of non simple headers the client is allowed to use with cross-domain requests +cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] + +# TCP or UNIX socket address for the gRPC server to listen on +# NOTE: This server only supports /broadcast_tx_commit +grpc_laddr = "" + +# Maximum number of simultaneous connections. +# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +grpc_max_open_connections = 900 + +# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool +unsafe = false + +# Maximum number of simultaneous connections (including WebSocket). +# Does not include gRPC connections. See grpc_max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +max_open_connections = 900 + +# Maximum number of unique clientIDs that can /subscribe +# If you're using /broadcast_tx_commit, set to the estimated maximum number +# of broadcast_tx_commit calls per block. +max_subscription_clients = 100 + +# Maximum number of unique queries a given client can /subscribe to +# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to +# the estimated # maximum number of broadcast_tx_commit calls per block. +max_subscriptions_per_client = 5 + +# How long to wait for a tx to be committed during /broadcast_tx_commit. +# WARNING: Using a value larger than 10s will result in increasing the +# global HTTP write timeout, which applies to all connections and endpoints. +# See https://github.com/tendermint/tendermint/issues/3435 +timeout_broadcast_tx_commit = "10s" + +# Maximum size of request body, in bytes +max_body_bytes = 1000000 + +# Maximum size of request header, in bytes +max_header_bytes = 1048576 + +# The path to a file containing certificate that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# If the certificate is signed by a certificate authority, +# the certFile should be the concatenation of the server's certificate, any intermediates, +# and the CA's certificate. +# NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_cert_file = "" + +# The path to a file containing matching private key that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_key_file = "" + +# pprof listen address (https://golang.org/pkg/net/http/pprof) +pprof_laddr = "localhost:6060" + +####################################################### +### P2P Configuration Options ### +####################################################### +[p2p] + +# Address to listen for incoming connections +laddr = "tcp://0.0.0.0:26656" + +# Address to advertise to peers for them to dial +# If empty, will use the same port as the laddr, +# and will introspect on the listener or use UPnP +# to figure out the address. ip and port are required +# example: 159.89.10.97:26656 +external_address = "" + +# Comma separated list of seed nodes to connect to +seeds = "" + +# Comma separated list of nodes to keep persistent connections to +persistent_peers = "" + +# UPNP port forwarding +upnp = false + +# Path to address book +addr_book_file = "config/addrbook.json" + +# Set true for strict address routability rules +# Set false for private or local networks +addr_book_strict = true + +# Maximum number of inbound peers +max_num_inbound_peers = 40 + +# Maximum number of outbound peers to connect to, excluding persistent peers +max_num_outbound_peers = 10 + +# List of node IDs, to which a connection will be (re)established ignoring any existing limits +unconditional_peer_ids = "" + +# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) +persistent_peers_max_dial_period = "0s" + +# Time to wait before flushing messages out on the connection +flush_throttle_timeout = "100ms" + +# Maximum size of a message packet payload, in bytes +max_packet_msg_payload_size = 1024 + +# Rate at which packets can be sent, in bytes/second +send_rate = 5120000 + +# Rate at which packets can be received, in bytes/second +recv_rate = 5120000 + +# Set true to enable the peer-exchange reactor +pex = true + +# Seed mode, in which node constantly crawls the network and looks for +# peers. If another node asks it for addresses, it responds and disconnects. +# +# Does not work if the peer-exchange reactor is disabled. +seed_mode = false + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +private_peer_ids = "" + +# Toggle to disable guard against peers connecting from the same ip. +allow_duplicate_ip = false + +# Peer connection configuration. +handshake_timeout = "20s" +dial_timeout = "3s" + +####################################################### +### Mempool Configuration Option ### +####################################################### +[mempool] + +recheck = true +broadcast = true +wal_dir = "" + +# Maximum number of transactions in the mempool +size = 5000 + +# Limit the total size of all txs in the mempool. +# This only accounts for raw transactions (e.g. given 1MB transactions and +# max_txs_bytes=5MB, mempool will only accept 5 transactions). +max_txs_bytes = 1073741824 + +# Size of the cache (used to filter transactions we saw earlier) in transactions +cache_size = 10000 + +# Do not remove invalid transactions from the cache (default: false) +# Set to true if it's not possible for any invalid transaction to become valid +# again in the future. +keep-invalid-txs-in-cache = false + +# Maximum size of a single transaction. +# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. +max_tx_bytes = 1048576 + +# Maximum size of a batch of transactions to send to a peer +# Including space needed by encoding (one varint per transaction). +# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 +max_batch_bytes = 0 + +####################################################### +### State Sync Configuration Options ### +####################################################### +[statesync] +# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine +# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in +# the network to take and serve state machine snapshots. State sync is not attempted if the node +# has any local state (LastBlockHeight > 0). The node will have a truncated block history, +# starting from the height of the snapshot. +enable = false + +# RPC servers (comma-separated) for light client verification of the synced state machine and +# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding +# header hash obtained from a trusted source, and a period during which validators can be trusted. +# +# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 +# weeks) during which they can be financially punished (slashed) for misbehavior. +rpc_servers = "" +trust_height = 0 +trust_hash = "" +trust_period = "168h0m0s" + +# Time to spend discovering snapshots before initiating a restore. +discovery_time = "15s" + +# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). +# Will create a new, randomly named directory within, and remove it when done. +temp_dir = "" + +# The timeout duration before re-requesting a chunk, possibly from a different +# peer (default: 1 minute). +chunk_request_timeout = "10s" + +# The number of concurrent chunk fetchers to run (default: 1). +chunk_fetchers = "4" + +####################################################### +### Fast Sync Configuration Connections ### +####################################################### +[fastsync] + +# Fast Sync version to use: +# 1) "v0" (default) - the legacy fast sync implementation +# 2) "v1" - refactor of v0 version for better testability +# 2) "v2" - complete redesign of v0, optimized for testability & readability +version = "v0" + +####################################################### +### Consensus Configuration Options ### +####################################################### +[consensus] + +wal_file = "data/cs.wal/wal" + +# How long we wait for a proposal block before prevoting nil +timeout_propose = "3s" +# 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) +timeout_prevote = "1s" +# How much the timeout_prevote increases with each round +timeout_prevote_delta = "500ms" +# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) +timeout_precommit = "1s" +# How much the timeout_precommit increases with each round +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 = "5s" + +# 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 +# if the same consensus key was used to sign {double_sign_check_height} last blocks. +# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. +double_sign_check_height = 0 + +# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) +skip_timeout_commit = false + +# EmptyBlocks mode and possible interval between empty blocks +create_empty_blocks = true +create_empty_blocks_interval = "0s" + +# Reactor sleep duration parameters +peer_gossip_sleep_duration = "100ms" +peer_query_maj23_sleep_duration = "2s" + +####################################################### +### Transaction Indexer Configuration Options ### +####################################################### +[tx_index] + +# What indexer to use for transactions +# +# The application will set which txs to index. In some cases a node operator will be able +# to decide which txs to index based on configuration set in the application. +# +# Options: +# 1) "null" +# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. +indexer = "kv" + +####################################################### +### Instrumentation Configuration Options ### +####################################################### +[instrumentation] + +# When true, Prometheus metrics are served under /metrics on +# PrometheusListenAddr. +# Check out the documentation for the list of available metrics. +prometheus = false + +# Address to listen for Prometheus collector(s) connections +prometheus_listen_addr = ":26660" + +# Maximum number of simultaneous connections. +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +max_open_connections = 3 + +# Instrumentation namespace +namespace = "tendermint" diff --git a/deploy/testnet_config/node2/config/node_key.json b/deploy/testnet_config/node2/config/node_key.json new file mode 100644 index 00000000..2dc0329a --- /dev/null +++ b/deploy/testnet_config/node2/config/node_key.json @@ -0,0 +1 @@ +{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"HdwRmFlINiO1nTwUEAbMvH1/QOCm9czXLnO4yhqzFBMxkARXQRk0/VmLdWkm6iGyh3PrDizJNIdgF4zRc886bA=="}} \ No newline at end of file diff --git a/deploy/testnet_config/node2/config/priv_validator_key.json b/deploy/testnet_config/node2/config/priv_validator_key.json new file mode 100644 index 00000000..652536c3 --- /dev/null +++ b/deploy/testnet_config/node2/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "address": "B83BD3C8D6866BBDE2B72E60A79FA424AB159AC9", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "OaXzGMQNz+vWXWTkztTPrb4C6HMRtt34axZLdkQz/Wk=" + }, + "priv_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "k+vBxDu5fwYqBvlO7n5uODuQgb3TolbVIfqg+86zKdY5pfMYxA3P69ZdZOTO1M+tvgLocxG23fhrFkt2RDP9aQ==" + } +} \ No newline at end of file diff --git a/deploy/testnet_config/node2/data/priv_validator_state.json b/deploy/testnet_config/node2/data/priv_validator_state.json new file mode 100644 index 00000000..48f3b67e --- /dev/null +++ b/deploy/testnet_config/node2/data/priv_validator_state.json @@ -0,0 +1,5 @@ +{ + "height": "0", + "round": 0, + "step": 0 +} \ No newline at end of file diff --git a/deploy/testnet_config/node3/config/app.toml b/deploy/testnet_config/node3/config/app.toml new file mode 100644 index 00000000..a82d30f4 --- /dev/null +++ b/deploy/testnet_config/node3/config/app.toml @@ -0,0 +1,199 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Base Configuration ### +############################################################################### + +# The minimum gas prices a validator is willing to accept for processing a +# transaction. A transaction's fees must meet the minimum of any denomination +# specified in this config (e.g. 0.25token1;0.0001token2). +minimum-gas-prices = "0stake" + +# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals +# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) +# everything: all saved states will be deleted, storing only the current state; pruning at 10 block intervals +# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' +pruning = "default" + +# These are applied if and only if the pruning strategy is custom. +pruning-keep-recent = "0" +pruning-keep-every = "0" +pruning-interval = "0" + +# HaltHeight contains a non-zero block height at which a node will gracefully +# halt and shutdown that can be used to assist upgrades and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-height = 0 + +# HaltTime contains a non-zero minimum block time (in Unix seconds) at which +# a node will gracefully halt and shutdown that can be used to assist upgrades +# and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-time = 0 + +# MinRetainBlocks defines the minimum block height offset from the current +# block being committed, such that all blocks past this offset are pruned +# from Tendermint. It is used as part of the process of determining the +# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates +# that no blocks should be pruned. +# +# This configuration value is only responsible for pruning Tendermint blocks. +# It has no bearing on application state pruning which is determined by the +# "pruning-*" configurations. +# +# Note: Tendermint block pruning is dependant on this parameter in conunction +# with the unbonding (safety threshold) period, state pruning and state sync +# snapshot parameters to determine the correct minimum value of +# ResponseCommit.RetainHeight. +min-retain-blocks = 0 + +# InterBlockCache enables inter-block caching. +inter-block-cache = true + +# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, +# which informs Tendermint what to index. If empty, all events will be indexed. +# +# Example: +# ["message.sender", "message.recipient"] +index-events = [] + +############################################################################### +### Telemetry Configuration ### +############################################################################### + +[telemetry] + +# Prefixed with keys to separate services. +service-name = "" + +# Enabled enables the application telemetry functionality. When enabled, +# an in-memory sink is also enabled by default. Operators may also enabled +# other sinks such as Prometheus. +enabled = false + +# Enable prefixing gauge values with hostname. +enable-hostname = false + +# Enable adding hostname to labels. +enable-hostname-label = false + +# Enable adding service to labels. +enable-service-label = false + +# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. +prometheus-retention-time = 0 + +# GlobalLabels defines a global set of name/value label tuples applied to all +# metrics emitted using the wrapper functions defined in telemetry package. +# +# Example: +# [["chain_id", "cosmoshub-1"]] +global-labels = [ +] + +############################################################################### +### API Configuration ### +############################################################################### + +[api] + +# Enable defines if the API server should be enabled. +enable = true + +# Swagger defines if swagger documentation should automatically be registered. +swagger = true + +# Address defines the API server to listen on. +address = "tcp://0.0.0.0:1317" + +# MaxOpenConnections defines the number of maximum open connections. +max-open-connections = 1000 + +# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). +rpc-read-timeout = 10 + +# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). +rpc-write-timeout = 0 + +# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). +rpc-max-body-bytes = 1000000 + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enabled-unsafe-cors = false + +############################################################################### +### Rosetta Configuration ### +############################################################################### + +[rosetta] + +# Enable defines if the Rosetta API server should be enabled. +enable = false + +# Address defines the Rosetta API server to listen on. +address = ":8080" + +# Network defines the name of the blockchain that will be returned by Rosetta. +blockchain = "app" + +# Network defines the name of the network that will be returned by Rosetta. +network = "network" + +# Retries defines the number of retries when connecting to the node before failing. +retries = 3 + +# Offline defines if Rosetta server should run in offline mode. +offline = false + +############################################################################### +### gRPC Configuration ### +############################################################################### + +[grpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the gRPC server address to bind to. +address = "0.0.0.0:9090" + +############################################################################### +### gRPC Web Configuration ### +############################################################################### + +[grpc-web] + +# GRPCWebEnable defines if the gRPC-web should be enabled. +# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. +enable = true + +# Address defines the gRPC-web server address to bind to. +address = "0.0.0.0:9091" + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enable-unsafe-cors = false + +############################################################################### +### State Sync Configuration ### +############################################################################### + +# State sync snapshots allow other nodes to rapidly join the network without replaying historical +# blocks, instead downloading and applying a snapshot of the application state at a given height. +[state-sync] + +# snapshot-interval specifies the block interval at which local state sync snapshots are +# taken (0 to disable). Must be a multiple of pruning-keep-every. +snapshot-interval = 0 + +# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). +snapshot-keep-recent = 2 + +[wasm] +# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries +query_gas_limit = 300000 +# This is the number of wasm vm instances we keep cached in memory for speed-up +# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally +lru_size = 0 \ No newline at end of file diff --git a/deploy/testnet_config/node3/config/client.toml b/deploy/testnet_config/node3/config/client.toml new file mode 100644 index 00000000..5bc4aa1a --- /dev/null +++ b/deploy/testnet_config/node3/config/client.toml @@ -0,0 +1,17 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Client Configuration ### +############################################################################### + +# The network chain ID +chain-id = "ShareRing-Lifestyle" +# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) +keyring-backend = "test" +# CLI output format (text|json) +output = "text" +# : to Tendermint RPC interface for this chain +node = "tcp://localhost:26657" +# Transaction broadcasting mode (sync|async|block) +broadcast-mode = "sync" diff --git a/deploy/testnet_config/node3/config/config.toml b/deploy/testnet_config/node3/config/config.toml new file mode 100644 index 00000000..ddcbd6a1 --- /dev/null +++ b/deploy/testnet_config/node3/config/config.toml @@ -0,0 +1,401 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or +# relative to the home directory (e.g. "data"). The home directory is +# "$HOME/.tendermint" by default, but could be changed via $TMHOME env variable +# or --home cmd flag. + +####################################################################### +### Main Base Config Options ### +####################################################################### + +# TCP or UNIX socket address of the ABCI application, +# or the name of an ABCI application compiled in with the Tendermint binary +proxy_app = "tcp://127.0.0.1:26658" + +# A custom human readable name for this node +moniker = "snode3" + +# If this node is many blocks behind the tip of the chain, FastSync +# allows them to catchup quickly by downloading blocks in parallel +# and verifying their commits +fast_sync = true + +# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb +# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) +# - pure go +# - stable +# * cleveldb (uses levigo wrapper) +# - fast +# - requires gcc +# - use cleveldb build tag (go build -tags cleveldb) +# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) +# - EXPERIMENTAL +# - may be faster is some use-cases (random reads - indexer) +# - use boltdb build tag (go build -tags boltdb) +# * rocksdb (uses github.com/tecbot/gorocksdb) +# - EXPERIMENTAL +# - requires gcc +# - use rocksdb build tag (go build -tags rocksdb) +# * badgerdb (uses github.com/dgraph-io/badger) +# - EXPERIMENTAL +# - use badgerdb build tag (go build -tags badgerdb) +db_backend = "goleveldb" + +# Database directory +db_dir = "data" + +# Output level for logging, including package level options +log_level = "info" + +# Output format: 'plain' (colored text) or 'json' +log_format = "plain" + +##### additional base config options ##### + +# Path to the JSON file containing the initial validator set and other meta data +genesis_file = "config/genesis.json" + +# Path to the JSON file containing the private key to use as a validator in the consensus protocol +priv_validator_key_file = "config/priv_validator_key.json" + +# Path to the JSON file containing the last sign state of a validator +priv_validator_state_file = "data/priv_validator_state.json" + +# TCP or UNIX socket address for Tendermint to listen on for +# connections from an external PrivValidator process +priv_validator_laddr = "" + +# Path to the JSON file containing the private key to use for node authentication in the p2p protocol +node_key_file = "config/node_key.json" + +# Mechanism to connect to the ABCI application: socket | grpc +abci = "socket" + +# If true, query the ABCI app on connecting to a new peer +# so the app can decide if we should keep the connection or not +filter_peers = false + + +####################################################################### +### Advanced Configuration Options ### +####################################################################### + +####################################################### +### RPC Server Configuration Options ### +####################################################### +[rpc] + +# TCP or UNIX socket address for the RPC server to listen on +laddr = "tcp://127.0.0.1:26657" + +# A list of origins a cross-domain request can be executed from +# Default value '[]' disables cors support +# Use '["*"]' to allow any origin +cors_allowed_origins = [] + +# A list of methods the client is allowed to use with cross-domain requests +cors_allowed_methods = ["HEAD", "GET", "POST", ] + +# A list of non simple headers the client is allowed to use with cross-domain requests +cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] + +# TCP or UNIX socket address for the gRPC server to listen on +# NOTE: This server only supports /broadcast_tx_commit +grpc_laddr = "" + +# Maximum number of simultaneous connections. +# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +grpc_max_open_connections = 900 + +# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool +unsafe = false + +# Maximum number of simultaneous connections (including WebSocket). +# Does not include gRPC connections. See grpc_max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +max_open_connections = 900 + +# Maximum number of unique clientIDs that can /subscribe +# If you're using /broadcast_tx_commit, set to the estimated maximum number +# of broadcast_tx_commit calls per block. +max_subscription_clients = 100 + +# Maximum number of unique queries a given client can /subscribe to +# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to +# the estimated # maximum number of broadcast_tx_commit calls per block. +max_subscriptions_per_client = 5 + +# How long to wait for a tx to be committed during /broadcast_tx_commit. +# WARNING: Using a value larger than 10s will result in increasing the +# global HTTP write timeout, which applies to all connections and endpoints. +# See https://github.com/tendermint/tendermint/issues/3435 +timeout_broadcast_tx_commit = "10s" + +# Maximum size of request body, in bytes +max_body_bytes = 1000000 + +# Maximum size of request header, in bytes +max_header_bytes = 1048576 + +# The path to a file containing certificate that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# If the certificate is signed by a certificate authority, +# the certFile should be the concatenation of the server's certificate, any intermediates, +# and the CA's certificate. +# NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_cert_file = "" + +# The path to a file containing matching private key that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_key_file = "" + +# pprof listen address (https://golang.org/pkg/net/http/pprof) +pprof_laddr = "localhost:6060" + +####################################################### +### P2P Configuration Options ### +####################################################### +[p2p] + +# Address to listen for incoming connections +laddr = "tcp://0.0.0.0:26656" + +# Address to advertise to peers for them to dial +# If empty, will use the same port as the laddr, +# and will introspect on the listener or use UPnP +# to figure out the address. ip and port are required +# example: 159.89.10.97:26656 +external_address = "" + +# Comma separated list of seed nodes to connect to +seeds = "" + +# Comma separated list of nodes to keep persistent connections to +persistent_peers = "" + +# UPNP port forwarding +upnp = false + +# Path to address book +addr_book_file = "config/addrbook.json" + +# Set true for strict address routability rules +# Set false for private or local networks +addr_book_strict = true + +# Maximum number of inbound peers +max_num_inbound_peers = 40 + +# Maximum number of outbound peers to connect to, excluding persistent peers +max_num_outbound_peers = 10 + +# List of node IDs, to which a connection will be (re)established ignoring any existing limits +unconditional_peer_ids = "" + +# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) +persistent_peers_max_dial_period = "0s" + +# Time to wait before flushing messages out on the connection +flush_throttle_timeout = "100ms" + +# Maximum size of a message packet payload, in bytes +max_packet_msg_payload_size = 1024 + +# Rate at which packets can be sent, in bytes/second +send_rate = 5120000 + +# Rate at which packets can be received, in bytes/second +recv_rate = 5120000 + +# Set true to enable the peer-exchange reactor +pex = true + +# Seed mode, in which node constantly crawls the network and looks for +# peers. If another node asks it for addresses, it responds and disconnects. +# +# Does not work if the peer-exchange reactor is disabled. +seed_mode = false + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +private_peer_ids = "" + +# Toggle to disable guard against peers connecting from the same ip. +allow_duplicate_ip = false + +# Peer connection configuration. +handshake_timeout = "20s" +dial_timeout = "3s" + +####################################################### +### Mempool Configuration Option ### +####################################################### +[mempool] + +recheck = true +broadcast = true +wal_dir = "" + +# Maximum number of transactions in the mempool +size = 5000 + +# Limit the total size of all txs in the mempool. +# This only accounts for raw transactions (e.g. given 1MB transactions and +# max_txs_bytes=5MB, mempool will only accept 5 transactions). +max_txs_bytes = 1073741824 + +# Size of the cache (used to filter transactions we saw earlier) in transactions +cache_size = 10000 + +# Do not remove invalid transactions from the cache (default: false) +# Set to true if it's not possible for any invalid transaction to become valid +# again in the future. +keep-invalid-txs-in-cache = false + +# Maximum size of a single transaction. +# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. +max_tx_bytes = 1048576 + +# Maximum size of a batch of transactions to send to a peer +# Including space needed by encoding (one varint per transaction). +# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 +max_batch_bytes = 0 + +####################################################### +### State Sync Configuration Options ### +####################################################### +[statesync] +# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine +# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in +# the network to take and serve state machine snapshots. State sync is not attempted if the node +# has any local state (LastBlockHeight > 0). The node will have a truncated block history, +# starting from the height of the snapshot. +enable = false + +# RPC servers (comma-separated) for light client verification of the synced state machine and +# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding +# header hash obtained from a trusted source, and a period during which validators can be trusted. +# +# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 +# weeks) during which they can be financially punished (slashed) for misbehavior. +rpc_servers = "" +trust_height = 0 +trust_hash = "" +trust_period = "168h0m0s" + +# Time to spend discovering snapshots before initiating a restore. +discovery_time = "15s" + +# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). +# Will create a new, randomly named directory within, and remove it when done. +temp_dir = "" + +# The timeout duration before re-requesting a chunk, possibly from a different +# peer (default: 1 minute). +chunk_request_timeout = "10s" + +# The number of concurrent chunk fetchers to run (default: 1). +chunk_fetchers = "4" + +####################################################### +### Fast Sync Configuration Connections ### +####################################################### +[fastsync] + +# Fast Sync version to use: +# 1) "v0" (default) - the legacy fast sync implementation +# 2) "v1" - refactor of v0 version for better testability +# 2) "v2" - complete redesign of v0, optimized for testability & readability +version = "v0" + +####################################################### +### Consensus Configuration Options ### +####################################################### +[consensus] + +wal_file = "data/cs.wal/wal" + +# How long we wait for a proposal block before prevoting nil +timeout_propose = "3s" +# 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) +timeout_prevote = "1s" +# How much the timeout_prevote increases with each round +timeout_prevote_delta = "500ms" +# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) +timeout_precommit = "1s" +# How much the timeout_precommit increases with each round +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 = "5s" + +# 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 +# if the same consensus key was used to sign {double_sign_check_height} last blocks. +# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. +double_sign_check_height = 0 + +# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) +skip_timeout_commit = false + +# EmptyBlocks mode and possible interval between empty blocks +create_empty_blocks = true +create_empty_blocks_interval = "0s" + +# Reactor sleep duration parameters +peer_gossip_sleep_duration = "100ms" +peer_query_maj23_sleep_duration = "2s" + +####################################################### +### Transaction Indexer Configuration Options ### +####################################################### +[tx_index] + +# What indexer to use for transactions +# +# The application will set which txs to index. In some cases a node operator will be able +# to decide which txs to index based on configuration set in the application. +# +# Options: +# 1) "null" +# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. +indexer = "kv" + +####################################################### +### Instrumentation Configuration Options ### +####################################################### +[instrumentation] + +# When true, Prometheus metrics are served under /metrics on +# PrometheusListenAddr. +# Check out the documentation for the list of available metrics. +prometheus = false + +# Address to listen for Prometheus collector(s) connections +prometheus_listen_addr = ":26660" + +# Maximum number of simultaneous connections. +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +max_open_connections = 3 + +# Instrumentation namespace +namespace = "tendermint" diff --git a/deploy/testnet_config/node3/config/node_key.json b/deploy/testnet_config/node3/config/node_key.json new file mode 100644 index 00000000..4ae511de --- /dev/null +++ b/deploy/testnet_config/node3/config/node_key.json @@ -0,0 +1 @@ +{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"5pgJjgS538vkOFjPQaqW0daG5oIEs7S7Ag9t5gxlUELrCnhHInG9GU4vdSlcujCCOoNaYlqogJiHdrW5r1JFqw=="}} \ No newline at end of file diff --git a/deploy/testnet_config/node3/config/priv_validator_key.json b/deploy/testnet_config/node3/config/priv_validator_key.json new file mode 100644 index 00000000..d29f2f3f --- /dev/null +++ b/deploy/testnet_config/node3/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "address": "21C7548A66D0E5C43C142C6E3A0BE3653A86C4B4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "CZp/ZRvmohuTMbvH/jDnDAbTOaLwQCToGgb+bZ/CEdw=" + }, + "priv_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "BmP93pJUO+vD1LuHLrxVj5jI0Znaiw3EoJL5j68IKIEJmn9lG+aiG5Mxu8f+MOcMBtM5ovBAJOgaBv5tn8IR3A==" + } +} \ No newline at end of file diff --git a/deploy/testnet_config/node3/data/priv_validator_state.json b/deploy/testnet_config/node3/data/priv_validator_state.json new file mode 100644 index 00000000..48f3b67e --- /dev/null +++ b/deploy/testnet_config/node3/data/priv_validator_state.json @@ -0,0 +1,5 @@ +{ + "height": "0", + "round": 0, + "step": 0 +} \ No newline at end of file diff --git a/deploy/testnet_config/script/setup.sh b/deploy/testnet_config/script/setup.sh new file mode 100644 index 00000000..cbc43610 --- /dev/null +++ b/deploy/testnet_config/script/setup.sh @@ -0,0 +1,12 @@ +shareledger config keyring-backend test +shareledger config chain-id ShareRing-Lifestyle + +echo 'work like grass pyramid august topic exit wood reunion until retire frown bean cherry stage attack shed oxygen chronic return kiss hint hat future' | shareledger keys add authority --recover --index 0 +echo 'bird pizza tobacco omit cricket noodle hold wagon opinion shiver scout nature discover almost permit ceiling endless total sight cattle crisp calm popular flat' | shareledger keys add treasurer --recover --index 0 +echo 'decline electric decade treat scissors floor fade fade exile swim destroy unusual noodle cabin toy print cover limb old report that balance pelican member' | shareledger keys add operator --recover --index 0 +echo 'mule inform panel original wagon guard open inquiry inner vivid latin live lumber solar tank claw celery tattoo focus raven bunker cargo turn noble' | shareledger keys add shrp-loader --recover --index 0 + +echo 'lawsuit icon drill call jaguar party text chunk woman mention dawn frost net illness tail garlic exotic orange cage grape analyst jealous road cupboard' | shareledger keys add node0 --recover --index 0 +echo 'honey salad ride tackle border mail safe upset grape oven define coffee erase aunt stem skirt urban below ignore skill key indicate never rule' | shareledger keys add node1 --recover --index 0 +echo 'avocado blue utility tell hawk gorilla auction morning dolphin offer beyond unhappy orphan soccer asset route kite edge question tuna fragile company total minute' | shareledger keys add node2 --recover --index 0 +echo 'mango stuff casino shoulder tattoo labor civil master guitar blouse coral cabbage rose obscure winter copy learn hour explain surge tip disorder track life' | shareledger keys add node3 --recover --index 0 diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 83074f44..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,67 +0,0 @@ -version: '3' - -services: - shareledgernode0: - container_name: shareledgernode0 - image: "shareledger/mynode" - ports: - - "26656-26657:26656-26657" - environment: - - ID=0 - - LOG=${LOG:-shareledger.log} - volumes: - - ./build:/shareledger:Z - networks: - localnet: - ipv4_address: 172.194.4.2 - - shareledgernode1: - container_name: shareledgernode1 - image: "shareledger/mynode" - ports: - - "26658-26659:26656-26657" - environment: - - ID=1 - - LOG=${LOG:-shareledger.log} - volumes: - - ./build:/shareledger:Z - networks: - localnet: - ipv4_address: 172.194.4.3 - - shareledgernode2: - container_name: shareledgernode2 - image: "shareledger/mynode" - ports: - - "26660-26661:26656-26657" - environment: - - ID=2 - - LOG=${LOG:-shareledger.log} - volumes: - - ./build:/shareledger:Z - networks: - localnet: - ipv4_address: 172.194.4.4 - - shareledgernode3: - container_name: shareledgernode3 - image: "shareledger/mynode" - ports: - - "26662-26663:26656-26657" - environment: - - ID=3 - - LOG=${LOG:-shareledger.log} - volumes: - - ./build:/shareledger:Z - networks: - localnet: - ipv4_address: 172.194.4.5 - -networks: - localnet: - driver: bridge - ipam: - driver: default - config: - - - subnet: 172.194.4.0/16 diff --git a/docs/configuration.md b/docs/configuration.md deleted file mode 100644 index a7ff6946..00000000 --- a/docs/configuration.md +++ /dev/null @@ -1,7 +0,0 @@ - -## Add authority account and treasurer account to genesis - -``` -./shareledger add-genesis-authority
-./shareledger add-genesis-treasurer
-``` \ No newline at end of file diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 00000000..1167d565 --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,6 @@ +package docs + +import "embed" + +//go:embed static +var Docs embed.FS diff --git a/docs/gentlemint.md b/docs/gentlemint.md deleted file mode 100644 index 710ee73b..00000000 --- a/docs/gentlemint.md +++ /dev/null @@ -1,40 +0,0 @@ -# -IdSigner management is moved to `gentlemint` module - -### Enroll id signer -``` -./slcli tx gentlemint enroll-id-signer shareledger1s884xxxz4k4es35gk9xtx8gsdvl2axmggfaw2u shareledger1s884xxxz4k4es35gk9xtx8gsdvl2axmggfaw2u --from authority --fees 10shr --yes -``` -### Remoke id signer -``` -./slcli tx gentlemint revoke-id-signer shareledger1s884xxxz4k4es35gk9xtx8gsdvl2axmggfaw2u shareledger1s884xxxz4k4es35gk9xtx8gsdvl2axmggfaw2u --from authority --fees 10shr --yes -``` - -## Account type -### Authority -- Enroll SHRP loaders -``` -./slcli tx gentlemint enroll-loaders shareledger1c6jwfsh6s7y2xtw0gn7p3ndl4zmhjrkzlqqqnm --key-seed=./authority-seed.json -y -b=block -``` - -### Account operator -- Create and revoke id signer, document issuer accounts -### Id signer -- Has right to create id -### Document issuer -- Hash right to issuer document - -### SHRP loader -``` -./slcli tx gentlemint load-shrp shareledger1c6jwfsh6s7y2xtw0gn7p3ndl4zmhjrkzlqqqnm 1 --key-seed=./authority-seed.json -y -b=block -``` - -## Transfer coin -### Transfer SHRP -``` -./slcli tx gentlemint send-shrp shareledger1cgp90s8r8svjh998uykktrr3wvruun779e29nl 1 --key-seed=./treasurer-seed.json -y -b=block -``` -### Transfer SHR -``` -./slcli tx gentlemint send-shr shareledger1cgp90s8r8svjh998uykktrr3wvruun779e29nl 1 --key-seed=./treasurer-seed.json -y -b=block -``` \ No newline at end of file diff --git a/docs/keys.md b/docs/keys.md deleted file mode 100644 index c62a22e6..00000000 --- a/docs/keys.md +++ /dev/null @@ -1,8 +0,0 @@ - -## Get private key from mnemonic - -`./slcli get-key-from-mnemonic --mnemonic --amount ` - -``` -./slcli get-key-from-mnemonic --mnemonic "jungle scan artwork opinion ridge laugh sight outer merry problem tourist whale title toast bachelor fluid turtle card elevator amused dragon whip mother broken" --amount 2 -``` \ No newline at end of file diff --git a/docs/migrate-genesis.md b/docs/migrate-genesis.md deleted file mode 100644 index 97d45785..00000000 --- a/docs/migrate-genesis.md +++ /dev/null @@ -1,22 +0,0 @@ -# Shareledger migrate genesis file -There are differents of the state so that we need to migrate the genesis file. - -## v0.0.1 to v1.1.0 -Moving data from old version to new version of identity module. - -``` -./shareledger custom-migrate 0.0.1 ./old-genesis.json ./new-genesis.json ./ouput-genesis.json -``` -* `old-genesis.json`: The genesis file that is exported from current blockchain. -* `new-genesis.json`: The genesis file that is exported from new blockchain. This file is just the template. -* `ouput-genesis.json`: output genesis file. - -## v1.1.0 to v1.1.1 -Decimalization, remove old `identity` data. - -``` -./shareledger custom-migrate 1.1.0 ./input-genesis.json ./ouput-genesis.json -``` -* `input-genesis.json`: The genesis file that is exported from current blockchain. -* `ouput-genesis.json`: output genesis file. - diff --git a/docs/rate.md b/docs/rate.md deleted file mode 100644 index 8b721fe6..00000000 --- a/docs/rate.md +++ /dev/null @@ -1,20 +0,0 @@ -# Rate -Rate is the ration between SHRP and SHR. -eg: -rate = 200 --> 1SHRP = 200SHR - -The rate decimal is 10^6, it means we add six 0 number after the rate do present the decimal. -Eg: -1SHRP=200SHR --> rate = 200*10^6 = 200,000,000 -1SHRP=0.002SHR --> rate = 0.002*10^6 = 2,000 - -# Command -## Set rate -``` -./slcli tx gentlemint set-exchange 1000000 --key-seed=./treasurer-seed.json -y -b=block -``` - -## Get rate -``` -./slcli query gentlemint get-exchange -``` \ No newline at end of file diff --git a/docs/start-single-node.md b/docs/start-single-node.md deleted file mode 100644 index ec63c4cc..00000000 --- a/docs/start-single-node.md +++ /dev/null @@ -1,46 +0,0 @@ -# Start single node for test - -``` -#!/usr/bin/env bash - -rm -rf ~/.shareledger -rm -rf ~/.slcli - -./shareledger init test --chain-id=testing - -./slcli config output json -./slcli config indent true -./slcli config trust-node true -./slcli config chain-id testing -./slcli config keyring-backend test - -echo "valve wash okay biology tissue term fire cross solid sword bulb right team enact raven rare frog repeat dust when zebra focus task voice" |./slcli keys add authority --recover --index 0 -echo "valve wash okay biology tissue term fire cross solid sword bulb right team enact raven rare frog repeat dust when zebra focus task voice" |./slcli keys add treasurer --recover --index 1 -echo "valve wash okay biology tissue term fire cross solid sword bulb right team enact raven rare frog repeat dust when zebra focus task voice" |./slcli keys add validator --recover --index 2 -echo "valve wash okay biology tissue term fire cross solid sword bulb right team enact raven rare frog repeat dust when zebra focus task voice" |./slcli keys add account-operator --recover --index 3 -echo "valve wash okay biology tissue term fire cross solid sword bulb right team enact raven rare frog repeat dust when zebra focus task voice" |./slcli keys add issuer --recover --index 4 -echo "valve wash okay biology tissue term fire cross solid sword bulb right team enact raven rare frog repeat dust when zebra focus task voice" |./slcli keys add idsigner --recover --index 5 - -./shareledger add-genesis-authority $(./slcli keys show authority -a) -./shareledger add-genesis-treasurer $(./slcli keys show treasurer -a) -./shareledger add-genesis-validator $(./slcli keys show validator -a) -./shareledger add-genesis-account-operator $(./slcli keys show account-operator -a) - -./shareledger add-genesis-account $(./slcli keys show authority -a) 1000000shr,1000000shrp -./shareledger add-genesis-account $(./slcli keys show treasurer -a) 1000000shr,1000000shrp -./shareledger add-genesis-account $(./slcli keys show validator -a) 1000000shr,1000000shrp -./shareledger add-genesis-account $(./slcli keys show account-operator -a) 1000000shr,1000000shrp -./shareledger add-genesis-account $(./slcli keys show issuer -a) 1000000shr,1000000shrp -./shareledger add-genesis-account $(./slcli keys show idsigner -a) 1000000shr,1000000shrp - - -./shareledger gentx --name "validator" --keyring-backend test --amount 1000000shr - -echo "Collecting genesis txs..." -./shareledger collect-gentxs - -echo "Validating genesis file..." -./shareledger validate-genesis - -./shareledger start -``` \ No newline at end of file diff --git a/docs/start-testnet.md b/docs/start-testnet.md deleted file mode 100644 index 71478866..00000000 --- a/docs/start-testnet.md +++ /dev/null @@ -1,8 +0,0 @@ -# -## Create testnet node data -``` -./shareledger testnet -``` -By default the above command creates 2 directories: -* __testnet__: That inlcudes 4 nodes data and config -* __special-accounts__: All keys of special account such as: authority, treasurer and account operator account. diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml new file mode 100644 index 00000000..500ef77e --- /dev/null +++ b/docs/static/openapi.yml @@ -0,0 +1,48974 @@ +swagger: '2.0' +info: + title: HTTP API Console + name: '' + description: '' +paths: + /cosmos/auth/v1beta1/accounts: + get: + summary: Accounts returns all the existing accounts + description: 'Since: cosmos-sdk 0.43' + operationId: CosmosAuthV1Beta1Accounts + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accounts: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: accounts are the existing accounts + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAccountsResponse is the response type for the Query/Accounts + RPC method. + + + Since: cosmos-sdk 0.43 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/auth/v1beta1/accounts/{address}': + get: + summary: Account returns account details based on address. + operationId: CosmosAuthV1Beta1Account + responses: + '200': + description: A successful response. + schema: + type: object + properties: + account: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + QueryAccountResponse is the response type for the Query/Account + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: address + description: address defines the address to query for. + in: path + required: true + type: string + tags: + - Query + /cosmos/auth/v1beta1/params: + get: + summary: Params queries all parameters. + operationId: CosmosAuthV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + max_memo_characters: + type: string + format: uint64 + tx_sig_limit: + type: string + format: uint64 + tx_size_cost_per_byte: + type: string + format: uint64 + sig_verify_cost_ed25519: + type: string + format: uint64 + sig_verify_cost_secp256k1: + type: string + format: uint64 + description: >- + QueryParamsResponse is the response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + '/cosmos/bank/v1beta1/balances/{address}': + get: + summary: AllBalances queries the balance of all coins for a single account. + operationId: CosmosBankV1Beta1AllBalances + responses: + '200': + description: A successful response. + schema: + type: object + properties: + balances: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: balances is the balances of all the coins. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAllBalancesResponse is the response type for the + Query/AllBalances RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + description: address is the address to query balances for. + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/bank/v1beta1/balances/{address}/by_denom': + get: + summary: Balance queries the balance of a single coin for a single account. + operationId: CosmosBankV1Beta1Balance + responses: + '200': + description: A successful response. + schema: + type: object + properties: + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: >- + QueryBalanceResponse is the response type for the Query/Balance + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + description: address is the address to query balances for. + in: path + required: true + type: string + - name: denom + description: denom is the coin denom to query balances for. + in: query + required: false + type: string + tags: + - Query + /cosmos/bank/v1beta1/denoms_metadata: + get: + summary: >- + DenomsMetadata queries the client metadata for all registered coin + denominations. + operationId: CosmosBankV1Beta1DenomsMetadata + responses: + '200': + description: A successful response. + schema: + type: object + properties: + metadatas: + type: array + items: + type: object + properties: + description: + type: string + denom_units: + type: array + items: + type: object + properties: + denom: + type: string + description: >- + denom represents the string name of the given + denom unit (e.g uatom). + exponent: + type: integer + format: int64 + description: >- + exponent represents power of 10 exponent that one + must + + raise the base_denom to in order to equal the + given DenomUnit's denom + + 1 denom = 1^exponent base_denom + + (e.g. with a base_denom of uatom, one can create a + DenomUnit of 'atom' with + + exponent = 6, thus: 1 atom = 10^6 uatom). + aliases: + type: array + items: + type: string + title: >- + aliases is a list of string aliases for the given + denom + description: |- + DenomUnit represents a struct that describes a given + denomination unit of the basic token. + title: >- + denom_units represents the list of DenomUnit's for a + given coin + base: + type: string + description: >- + base represents the base denom (should be the DenomUnit + with exponent = 0). + display: + type: string + description: |- + display indicates the suggested denom that should be + displayed in clients. + name: + type: string + description: 'Since: cosmos-sdk 0.43' + title: 'name defines the name of the token (eg: Cosmos Atom)' + symbol: + type: string + description: >- + symbol is the token symbol usually shown on exchanges + (eg: ATOM). This can + + be the same as the display. + + + Since: cosmos-sdk 0.43 + description: |- + Metadata represents a struct that describes + a basic token. + description: >- + metadata provides the client information for all the + registered tokens. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryDenomsMetadataResponse is the response type for the + Query/DenomsMetadata RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/bank/v1beta1/denoms_metadata/{denom}': + get: + summary: DenomsMetadata queries the client metadata of a given coin denomination. + operationId: CosmosBankV1Beta1DenomMetadata + responses: + '200': + description: A successful response. + schema: + type: object + properties: + metadata: + type: object + properties: + description: + type: string + denom_units: + type: array + items: + type: object + properties: + denom: + type: string + description: >- + denom represents the string name of the given denom + unit (e.g uatom). + exponent: + type: integer + format: int64 + description: >- + exponent represents power of 10 exponent that one + must + + raise the base_denom to in order to equal the given + DenomUnit's denom + + 1 denom = 1^exponent base_denom + + (e.g. with a base_denom of uatom, one can create a + DenomUnit of 'atom' with + + exponent = 6, thus: 1 atom = 10^6 uatom). + aliases: + type: array + items: + type: string + title: >- + aliases is a list of string aliases for the given + denom + description: |- + DenomUnit represents a struct that describes a given + denomination unit of the basic token. + title: >- + denom_units represents the list of DenomUnit's for a given + coin + base: + type: string + description: >- + base represents the base denom (should be the DenomUnit + with exponent = 0). + display: + type: string + description: |- + display indicates the suggested denom that should be + displayed in clients. + name: + type: string + description: 'Since: cosmos-sdk 0.43' + title: 'name defines the name of the token (eg: Cosmos Atom)' + symbol: + type: string + description: >- + symbol is the token symbol usually shown on exchanges (eg: + ATOM). This can + + be the same as the display. + + + Since: cosmos-sdk 0.43 + description: |- + Metadata represents a struct that describes + a basic token. + description: >- + QueryDenomMetadataResponse is the response type for the + Query/DenomMetadata RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: denom + description: denom is the coin denom to query the metadata for. + in: path + required: true + type: string + tags: + - Query + /cosmos/bank/v1beta1/params: + get: + summary: Params queries the parameters of x/bank module. + operationId: CosmosBankV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + type: object + properties: + send_enabled: + type: array + items: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: >- + SendEnabled maps coin denom to a send_enabled status + (whether a denom is + + sendable). + default_send_enabled: + type: boolean + description: Params defines the parameters for the bank module. + description: >- + QueryParamsResponse defines the response type for querying x/bank + parameters. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /cosmos/bank/v1beta1/supply: + get: + summary: TotalSupply queries the total supply of all coins. + operationId: CosmosBankV1Beta1TotalSupply + responses: + '200': + description: A successful response. + schema: + type: object + properties: + supply: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + title: supply is the supply of the coins + pagination: + description: |- + pagination defines the pagination in the response. + + Since: cosmos-sdk 0.43 + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + title: >- + QueryTotalSupplyResponse is the response type for the + Query/TotalSupply RPC + + method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/bank/v1beta1/supply/{denom}': + get: + summary: SupplyOf queries the supply of a single coin. + operationId: CosmosBankV1Beta1SupplyOf + responses: + '200': + description: A successful response. + schema: + type: object + properties: + amount: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: >- + QuerySupplyOfResponse is the response type for the Query/SupplyOf + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: denom + description: denom is the coin denom to query balances for. + in: path + required: true + type: string + tags: + - Query + /cosmos/base/tendermint/v1beta1/blocks/latest: + get: + summary: GetLatestBlock returns the latest block. + operationId: CosmosBaseTendermintV1Beta1GetLatestBlock + responses: + '200': + description: A successful response. + schema: + type: object + properties: + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + block: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing + a block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + data: + type: object + properties: + txs: + type: array + items: + type: string + format: byte + description: >- + Txs that will be applied by state @ block.Height+1. + + NOTE: not all txs here are valid. We're just agreeing + on the order first. + + This means that block.AppHash does not include these + txs. + title: >- + Data contains the set of transactions included in the + block + evidence: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + duplicate_vote_evidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed + message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or + commit vote from validators for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed + message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or + commit vote from validators for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a + validator signed two conflicting votes. + light_client_attack_evidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules + for processing a block in the + blockchain, + + including all blockchain data structures + and the rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a + Tendermint block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included + in a Commit. + description: >- + Commit contains the evidence that a + block was committed by a set of + validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a + set of validators attempting to mislead a light + client. + last_commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included in a + Commit. + description: >- + Commit contains the evidence that a block was committed by + a set of validators. + description: >- + GetLatestBlockResponse is the response type for the + Query/GetLatestBlock RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Service + '/cosmos/base/tendermint/v1beta1/blocks/{height}': + get: + summary: GetBlockByHeight queries block for given height. + operationId: CosmosBaseTendermintV1Beta1GetBlockByHeight + responses: + '200': + description: A successful response. + schema: + type: object + properties: + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + block: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing + a block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + data: + type: object + properties: + txs: + type: array + items: + type: string + format: byte + description: >- + Txs that will be applied by state @ block.Height+1. + + NOTE: not all txs here are valid. We're just agreeing + on the order first. + + This means that block.AppHash does not include these + txs. + title: >- + Data contains the set of transactions included in the + block + evidence: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + duplicate_vote_evidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed + message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or + commit vote from validators for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed + message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or + commit vote from validators for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a + validator signed two conflicting votes. + light_client_attack_evidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules + for processing a block in the + blockchain, + + including all blockchain data structures + and the rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a + Tendermint block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included + in a Commit. + description: >- + Commit contains the evidence that a + block was committed by a set of + validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a + set of validators attempting to mislead a light + client. + last_commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included in a + Commit. + description: >- + Commit contains the evidence that a block was committed by + a set of validators. + description: >- + GetBlockByHeightResponse is the response type for the + Query/GetBlockByHeight RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: height + in: path + required: true + type: string + format: int64 + tags: + - Service + /cosmos/base/tendermint/v1beta1/node_info: + get: + summary: GetNodeInfo queries the current node info. + operationId: CosmosBaseTendermintV1Beta1GetNodeInfo + responses: + '200': + description: A successful response. + schema: + type: object + properties: + default_node_info: + type: object + properties: + protocol_version: + type: object + properties: + p2p: + type: string + format: uint64 + block: + type: string + format: uint64 + app: + type: string + format: uint64 + default_node_id: + type: string + listen_addr: + type: string + network: + type: string + version: + type: string + channels: + type: string + format: byte + moniker: + type: string + other: + type: object + properties: + tx_index: + type: string + rpc_address: + type: string + application_version: + type: object + properties: + name: + type: string + app_name: + type: string + version: + type: string + git_commit: + type: string + build_tags: + type: string + go_version: + type: string + build_deps: + type: array + items: + type: object + properties: + path: + type: string + title: module path + version: + type: string + title: module version + sum: + type: string + title: checksum + title: Module is the type for VersionInfo + cosmos_sdk_version: + type: string + title: 'Since: cosmos-sdk 0.43' + description: VersionInfo is the type for the GetNodeInfoResponse message. + description: >- + GetNodeInfoResponse is the request type for the Query/GetNodeInfo + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Service + /cosmos/base/tendermint/v1beta1/syncing: + get: + summary: GetSyncing queries node syncing. + operationId: CosmosBaseTendermintV1Beta1GetSyncing + responses: + '200': + description: A successful response. + schema: + type: object + properties: + syncing: + type: boolean + description: >- + GetSyncingResponse is the response type for the Query/GetSyncing + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Service + /cosmos/base/tendermint/v1beta1/validatorsets/latest: + get: + summary: GetLatestValidatorSet queries latest validator-set. + operationId: CosmosBaseTendermintV1Beta1GetLatestValidatorSet + responses: + '200': + description: A successful response. + schema: + type: object + properties: + block_height: + type: string + format: int64 + validators: + type: array + items: + type: object + properties: + address: + type: string + pub_key: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded message, + with an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + description: Validator is the type for the validator-set. + pagination: + description: pagination defines an pagination for the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + GetLatestValidatorSetResponse is the response type for the + Query/GetValidatorSetByHeight RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Service + '/cosmos/base/tendermint/v1beta1/validatorsets/{height}': + get: + summary: GetValidatorSetByHeight queries validator-set at a given height. + operationId: CosmosBaseTendermintV1Beta1GetValidatorSetByHeight + responses: + '200': + description: A successful response. + schema: + type: object + properties: + block_height: + type: string + format: int64 + validators: + type: array + items: + type: object + properties: + address: + type: string + pub_key: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded message, + with an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + description: Validator is the type for the validator-set. + pagination: + description: pagination defines an pagination for the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + GetValidatorSetByHeightResponse is the response type for the + Query/GetValidatorSetByHeight RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: height + in: path + required: true + type: string + format: int64 + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Service + /cosmos/distribution/v1beta1/community_pool: + get: + summary: CommunityPool queries the community pool coins. + operationId: CosmosDistributionV1Beta1CommunityPool + responses: + '200': + description: A successful response. + schema: + type: object + properties: + pool: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + description: pool defines community pool's coins. + description: >- + QueryCommunityPoolResponse is the response type for the + Query/CommunityPool + + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards': + get: + summary: |- + DelegationTotalRewards queries the total rewards accrued by a each + validator. + operationId: CosmosDistributionV1Beta1DelegationTotalRewards + responses: + '200': + description: A successful response. + schema: + type: object + properties: + rewards: + type: array + items: + type: object + properties: + validator_address: + type: string + reward: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a + decimal amount. + + + NOTE: The amount field is an Dec which implements the + custom method + + signatures required by gogoproto. + description: |- + DelegationDelegatorReward represents the properties + of a delegator's delegation reward. + description: rewards defines all the rewards accrued by a delegator. + total: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + description: total defines the sum of all the rewards. + description: |- + QueryDelegationTotalRewardsResponse is the response type for the + Query/DelegationTotalRewards RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: delegator_address + description: delegator_address defines the delegator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address}': + get: + summary: DelegationRewards queries the total rewards accrued by a delegation. + operationId: CosmosDistributionV1Beta1DelegationRewards + responses: + '200': + description: A successful response. + schema: + type: object + properties: + rewards: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + description: rewards defines the rewards accrued by a delegation. + description: |- + QueryDelegationRewardsResponse is the response type for the + Query/DelegationRewards RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: delegator_address + description: delegator_address defines the delegator address to query for. + in: path + required: true + type: string + - name: validator_address + description: validator_address defines the validator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/distribution/v1beta1/delegators/{delegator_address}/validators': + get: + summary: DelegatorValidators queries the validators of a delegator. + operationId: CosmosDistributionV1Beta1DelegatorValidators + responses: + '200': + description: A successful response. + schema: + type: object + properties: + validators: + type: array + items: + type: string + description: >- + validators defines the validators a delegator is delegating + for. + description: |- + QueryDelegatorValidatorsResponse is the response type for the + Query/DelegatorValidators RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: delegator_address + description: delegator_address defines the delegator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address': + get: + summary: DelegatorWithdrawAddress queries withdraw address of a delegator. + operationId: CosmosDistributionV1Beta1DelegatorWithdrawAddress + responses: + '200': + description: A successful response. + schema: + type: object + properties: + withdraw_address: + type: string + description: withdraw_address defines the delegator address to query for. + description: |- + QueryDelegatorWithdrawAddressResponse is the response type for the + Query/DelegatorWithdrawAddress RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: delegator_address + description: delegator_address defines the delegator address to query for. + in: path + required: true + type: string + tags: + - Query + /cosmos/distribution/v1beta1/params: + get: + summary: Params queries params of the distribution module. + operationId: CosmosDistributionV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + community_tax: + type: string + base_proposer_reward: + type: string + bonus_proposer_reward: + type: string + withdraw_addr_enabled: + type: boolean + description: >- + QueryParamsResponse is the response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/cosmos/distribution/v1beta1/validators/{validator_address}/commission': + get: + summary: ValidatorCommission queries accumulated commission for a validator. + operationId: CosmosDistributionV1Beta1ValidatorCommission + responses: + '200': + description: A successful response. + schema: + type: object + properties: + commission: + description: commission defines the commision the validator received. + type: object + properties: + commission: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a + decimal amount. + + + NOTE: The amount field is an Dec which implements the + custom method + + signatures required by gogoproto. + title: |- + QueryValidatorCommissionResponse is the response type for the + Query/ValidatorCommission RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: validator_address + description: validator_address defines the validator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards': + get: + summary: ValidatorOutstandingRewards queries rewards of a validator address. + operationId: CosmosDistributionV1Beta1ValidatorOutstandingRewards + responses: + '200': + description: A successful response. + schema: + type: object + properties: + rewards: + type: object + properties: + rewards: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a + decimal amount. + + + NOTE: The amount field is an Dec which implements the + custom method + + signatures required by gogoproto. + description: >- + ValidatorOutstandingRewards represents outstanding + (un-withdrawn) rewards + + for a validator inexpensive to track, allows simple sanity + checks. + description: >- + QueryValidatorOutstandingRewardsResponse is the response type for + the + + Query/ValidatorOutstandingRewards RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: validator_address + description: validator_address defines the validator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/distribution/v1beta1/validators/{validator_address}/slashes': + get: + summary: ValidatorSlashes queries slash events of a validator. + operationId: CosmosDistributionV1Beta1ValidatorSlashes + responses: + '200': + description: A successful response. + schema: + type: object + properties: + slashes: + type: array + items: + type: object + properties: + validator_period: + type: string + format: uint64 + fraction: + type: string + description: >- + ValidatorSlashEvent represents a validator slash event. + + Height is implicit within the store key. + + This is needed to calculate appropriate amount of staking + tokens + + for delegations which are withdrawn after a slash has + occurred. + description: slashes defines the slashes the validator received. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryValidatorSlashesResponse is the response type for the + Query/ValidatorSlashes RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: validator_address + description: validator_address defines the validator address to query for. + in: path + required: true + type: string + - name: starting_height + description: >- + starting_height defines the optional starting height to query the + slashes. + in: query + required: false + type: string + format: uint64 + - name: ending_height + description: >- + starting_height defines the optional ending height to query the + slashes. + in: query + required: false + type: string + format: uint64 + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + /cosmos/evidence/v1beta1/evidence: + get: + summary: AllEvidence queries all evidence. + operationId: CosmosEvidenceV1Beta1AllEvidence + responses: + '200': + description: A successful response. + schema: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: evidence returns all evidences. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAllEvidenceResponse is the response type for the + Query/AllEvidence RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/evidence/v1beta1/evidence/{evidence_hash}': + get: + summary: Evidence queries evidence based on evidence hash. + operationId: CosmosEvidenceV1Beta1Evidence + responses: + '200': + description: A successful response. + schema: + type: object + properties: + evidence: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + QueryEvidenceResponse is the response type for the Query/Evidence + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: evidence_hash + description: evidence_hash defines the hash of the requested evidence. + in: path + required: true + type: string + format: byte + tags: + - Query + '/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}': + get: + summary: Allowance returns fee granted to the grantee by the granter. + operationId: CosmosFeegrantV1Beta1Allowance + responses: + '200': + description: A successful response. + schema: + type: object + properties: + allowance: + description: allowance is a allowance granted for grantee by granter. + type: object + properties: + granter: + type: string + description: >- + granter is the address of the user granting an allowance + of their funds. + grantee: + type: string + description: >- + grantee is the address of the user being granted an + allowance of another user's funds. + allowance: + description: allowance can be any of basic and filtered fee allowance. + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + title: >- + Grant is stored in the KVStore to record a grant with full + context + description: >- + QueryAllowanceResponse is the response type for the + Query/Allowance RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: granter + description: >- + granter is the address of the user granting an allowance of their + funds. + in: path + required: true + type: string + - name: grantee + description: >- + grantee is the address of the user being granted an allowance of + another user's funds. + in: path + required: true + type: string + tags: + - Query + '/cosmos/feegrant/v1beta1/allowances/{grantee}': + get: + summary: Allowances returns all the grants for address. + operationId: CosmosFeegrantV1Beta1Allowances + responses: + '200': + description: A successful response. + schema: + type: object + properties: + allowances: + type: array + items: + type: object + properties: + granter: + type: string + description: >- + granter is the address of the user granting an allowance + of their funds. + grantee: + type: string + description: >- + grantee is the address of the user being granted an + allowance of another user's funds. + allowance: + description: >- + allowance can be any of basic and filtered fee + allowance. + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + title: >- + Grant is stored in the KVStore to record a grant with full + context + description: allowances are allowance's granted for grantee by granter. + pagination: + description: pagination defines an pagination for the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAllowancesResponse is the response type for the + Query/Allowances RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: grantee + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/gov/v1beta1/params/{params_type}': + get: + summary: Params queries all parameters of the gov module. + operationId: CosmosGovV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + voting_params: + description: voting_params defines the parameters related to voting. + type: object + properties: + voting_period: + type: string + description: Length of the voting period. + deposit_params: + description: deposit_params defines the parameters related to deposit. + type: object + properties: + min_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + description: Minimum deposit for a proposal to enter voting period. + max_deposit_period: + type: string + description: >- + Maximum period for Atom holders to deposit on a proposal. + Initial value: 2 + months. + tally_params: + description: tally_params defines the parameters related to tally. + type: object + properties: + quorum: + type: string + format: byte + description: >- + Minimum percentage of total stake needed to vote for a + result to be + considered valid. + threshold: + type: string + format: byte + description: >- + Minimum proportion of Yes votes for proposal to pass. + Default value: 0.5. + veto_threshold: + type: string + format: byte + description: >- + Minimum value of Veto votes to Total votes ratio for + proposal to be + vetoed. Default value: 1/3. + description: >- + QueryParamsResponse is the response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: params_type + description: >- + params_type defines which parameters to query for, can be one of + "voting", + + "tallying" or "deposit". + in: path + required: true + type: string + tags: + - Query + /cosmos/gov/v1beta1/proposals: + get: + summary: Proposals queries all proposals based on given status. + operationId: CosmosGovV1Beta1Proposals + responses: + '200': + description: A successful response. + schema: + type: object + properties: + proposals: + type: array + items: + type: object + properties: + proposal_id: + type: string + format: uint64 + content: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded message, + with an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + status: + type: string + enum: + - PROPOSAL_STATUS_UNSPECIFIED + - PROPOSAL_STATUS_DEPOSIT_PERIOD + - PROPOSAL_STATUS_VOTING_PERIOD + - PROPOSAL_STATUS_PASSED + - PROPOSAL_STATUS_REJECTED + - PROPOSAL_STATUS_FAILED + default: PROPOSAL_STATUS_UNSPECIFIED + description: >- + ProposalStatus enumerates the valid statuses of a + proposal. + + - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. + - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit + period. + - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting + period. + - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has + passed. + - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has + been rejected. + - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has + failed. + final_tally_result: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: >- + TallyResult defines a standard tally for a governance + proposal. + submit_time: + type: string + format: date-time + deposit_end_time: + type: string + format: date-time + total_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an + amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + voting_start_time: + type: string + format: date-time + voting_end_time: + type: string + format: date-time + description: >- + Proposal defines the core field members of a governance + proposal. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryProposalsResponse is the response type for the + Query/Proposals RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: proposal_status + description: |- + proposal_status defines the status of the proposals. + + - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. + - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit + period. + - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting + period. + - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has + passed. + - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has + been rejected. + - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has + failed. + in: query + required: false + type: string + enum: + - PROPOSAL_STATUS_UNSPECIFIED + - PROPOSAL_STATUS_DEPOSIT_PERIOD + - PROPOSAL_STATUS_VOTING_PERIOD + - PROPOSAL_STATUS_PASSED + - PROPOSAL_STATUS_REJECTED + - PROPOSAL_STATUS_FAILED + default: PROPOSAL_STATUS_UNSPECIFIED + - name: voter + description: voter defines the voter address for the proposals. + in: query + required: false + type: string + - name: depositor + description: depositor defines the deposit addresses from the proposals. + in: query + required: false + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/gov/v1beta1/proposals/{proposal_id}': + get: + summary: Proposal queries proposal details based on ProposalID. + operationId: CosmosGovV1Beta1Proposal + responses: + '200': + description: A successful response. + schema: + type: object + properties: + proposal: + type: object + properties: + proposal_id: + type: string + format: uint64 + content: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + status: + type: string + enum: + - PROPOSAL_STATUS_UNSPECIFIED + - PROPOSAL_STATUS_DEPOSIT_PERIOD + - PROPOSAL_STATUS_VOTING_PERIOD + - PROPOSAL_STATUS_PASSED + - PROPOSAL_STATUS_REJECTED + - PROPOSAL_STATUS_FAILED + default: PROPOSAL_STATUS_UNSPECIFIED + description: >- + ProposalStatus enumerates the valid statuses of a + proposal. + + - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. + - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit + period. + - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting + period. + - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has + passed. + - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has + been rejected. + - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has + failed. + final_tally_result: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: >- + TallyResult defines a standard tally for a governance + proposal. + submit_time: + type: string + format: date-time + deposit_end_time: + type: string + format: date-time + total_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + voting_start_time: + type: string + format: date-time + voting_end_time: + type: string + format: date-time + description: >- + Proposal defines the core field members of a governance + proposal. + description: >- + QueryProposalResponse is the response type for the Query/Proposal + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: proposal_id + description: proposal_id defines the unique id of the proposal. + in: path + required: true + type: string + format: uint64 + tags: + - Query + '/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits': + get: + summary: Deposits queries all deposits of a single proposal. + operationId: CosmosGovV1Beta1Deposits + responses: + '200': + description: A successful response. + schema: + type: object + properties: + deposits: + type: array + items: + type: object + properties: + proposal_id: + type: string + format: uint64 + depositor: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an + amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + description: >- + Deposit defines an amount deposited by an account address to + an active + + proposal. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryDepositsResponse is the response type for the Query/Deposits + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: proposal_id + description: proposal_id defines the unique id of the proposal. + in: path + required: true + type: string + format: uint64 + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}': + get: + summary: >- + Deposit queries single deposit information based proposalID, + depositAddr. + operationId: CosmosGovV1Beta1Deposit + responses: + '200': + description: A successful response. + schema: + type: object + properties: + deposit: + type: object + properties: + proposal_id: + type: string + format: uint64 + depositor: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + description: >- + Deposit defines an amount deposited by an account address to + an active + + proposal. + description: >- + QueryDepositResponse is the response type for the Query/Deposit + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: proposal_id + description: proposal_id defines the unique id of the proposal. + in: path + required: true + type: string + format: uint64 + - name: depositor + description: depositor defines the deposit addresses from the proposals. + in: path + required: true + type: string + tags: + - Query + '/cosmos/gov/v1beta1/proposals/{proposal_id}/tally': + get: + summary: TallyResult queries the tally of a proposal vote. + operationId: CosmosGovV1Beta1TallyResult + responses: + '200': + description: A successful response. + schema: + type: object + properties: + tally: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: >- + TallyResult defines a standard tally for a governance + proposal. + description: >- + QueryTallyResultResponse is the response type for the Query/Tally + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: proposal_id + description: proposal_id defines the unique id of the proposal. + in: path + required: true + type: string + format: uint64 + tags: + - Query + '/cosmos/gov/v1beta1/proposals/{proposal_id}/votes': + get: + summary: Votes queries votes of a given proposal. + operationId: CosmosGovV1Beta1Votes + responses: + '200': + description: A successful response. + schema: + type: object + properties: + votes: + type: array + items: + type: object + properties: + proposal_id: + type: string + format: uint64 + voter: + type: string + option: + description: >- + Deprecated: Prefer to use `options` instead. This field + is set in queries + + if and only if `len(options) == 1` and that option has + weight 1. In all + + other cases, this field will default to + VOTE_OPTION_UNSPECIFIED. + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + options: + type: array + items: + type: object + properties: + option: + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + description: >- + VoteOption enumerates the valid vote options for a + given governance proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + weight: + type: string + description: >- + WeightedVoteOption defines a unit of vote for vote + split. + + + Since: cosmos-sdk 0.43 + title: 'Since: cosmos-sdk 0.43' + description: >- + Vote defines a vote on a governance proposal. + + A Vote consists of a proposal ID, the voter, and the vote + option. + description: votes defined the queried votes. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryVotesResponse is the response type for the Query/Votes RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: proposal_id + description: proposal_id defines the unique id of the proposal. + in: path + required: true + type: string + format: uint64 + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}': + get: + summary: 'Vote queries voted information based on proposalID, voterAddr.' + operationId: CosmosGovV1Beta1Vote + responses: + '200': + description: A successful response. + schema: + type: object + properties: + vote: + type: object + properties: + proposal_id: + type: string + format: uint64 + voter: + type: string + option: + description: >- + Deprecated: Prefer to use `options` instead. This field is + set in queries + + if and only if `len(options) == 1` and that option has + weight 1. In all + + other cases, this field will default to + VOTE_OPTION_UNSPECIFIED. + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + options: + type: array + items: + type: object + properties: + option: + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + description: >- + VoteOption enumerates the valid vote options for a + given governance proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + weight: + type: string + description: >- + WeightedVoteOption defines a unit of vote for vote + split. + + + Since: cosmos-sdk 0.43 + title: 'Since: cosmos-sdk 0.43' + description: >- + Vote defines a vote on a governance proposal. + + A Vote consists of a proposal ID, the voter, and the vote + option. + description: >- + QueryVoteResponse is the response type for the Query/Vote RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: proposal_id + description: proposal_id defines the unique id of the proposal. + in: path + required: true + type: string + format: uint64 + - name: voter + description: voter defines the oter address for the proposals. + in: path + required: true + type: string + tags: + - Query + /cosmos/mint/v1beta1/annual_provisions: + get: + summary: AnnualProvisions current minting annual provisions value. + operationId: CosmosMintV1Beta1AnnualProvisions + responses: + '200': + description: A successful response. + schema: + type: object + properties: + annual_provisions: + type: string + format: byte + description: >- + annual_provisions is the current minting annual provisions + value. + description: |- + QueryAnnualProvisionsResponse is the response type for the + Query/AnnualProvisions RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /cosmos/mint/v1beta1/inflation: + get: + summary: Inflation returns the current minting inflation value. + operationId: CosmosMintV1Beta1Inflation + responses: + '200': + description: A successful response. + schema: + type: object + properties: + inflation: + type: string + format: byte + description: inflation is the current minting inflation value. + description: >- + QueryInflationResponse is the response type for the + Query/Inflation RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /cosmos/mint/v1beta1/params: + get: + summary: Params returns the total set of minting parameters. + operationId: CosmosMintV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + mint_denom: + type: string + title: type of coin to mint + inflation_rate_change: + type: string + title: maximum annual change in inflation rate + inflation_max: + type: string + title: maximum inflation rate + inflation_min: + type: string + title: minimum inflation rate + goal_bonded: + type: string + title: goal of percent bonded atoms + blocks_per_year: + type: string + format: uint64 + title: expected blocks per year + description: >- + QueryParamsResponse is the response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /cosmos/params/v1beta1/params: + get: + summary: |- + Params queries a specific parameter of a module, given its subspace and + key. + operationId: CosmosParamsV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + param: + description: param defines the queried parameter. + type: object + properties: + subspace: + type: string + key: + type: string + value: + type: string + description: >- + QueryParamsResponse is response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: subspace + description: subspace defines the module to query the parameter for. + in: query + required: false + type: string + - name: key + description: key defines the key of the parameter in the subspace. + in: query + required: false + type: string + tags: + - Query + /cosmos/slashing/v1beta1/params: + get: + summary: Params queries the parameters of slashing module + operationId: CosmosSlashingV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + type: object + properties: + signed_blocks_window: + type: string + format: int64 + min_signed_per_window: + type: string + format: byte + downtime_jail_duration: + type: string + slash_fraction_double_sign: + type: string + format: byte + slash_fraction_downtime: + type: string + format: byte + description: >- + Params represents the parameters used for by the slashing + module. + title: >- + QueryParamsResponse is the response type for the Query/Params RPC + method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /cosmos/slashing/v1beta1/signing_infos: + get: + summary: SigningInfos queries signing info of all validators + operationId: CosmosSlashingV1Beta1SigningInfos + responses: + '200': + description: A successful response. + schema: + type: object + properties: + info: + type: array + items: + type: object + properties: + address: + type: string + start_height: + type: string + format: int64 + title: >- + Height at which validator was first a candidate OR was + unjailed + index_offset: + type: string + format: int64 + description: >- + Index which is incremented each time the validator was a + bonded + + in a block and may have signed a precommit or not. This + in conjunction with the + + `SignedBlocksWindow` param determines the index in the + `MissedBlocksBitArray`. + jailed_until: + type: string + format: date-time + description: >- + Timestamp until which the validator is jailed due to + liveness downtime. + tombstoned: + type: boolean + description: >- + Whether or not a validator has been tombstoned (killed + out of validator set). It is set + + once the validator commits an equivocation or for any + other configured misbehiavor. + missed_blocks_counter: + type: string + format: int64 + description: >- + A counter kept to avoid unnecessary array reads. + + Note that `Sum(MissedBlocksBitArray)` always equals + `MissedBlocksCounter`. + description: >- + ValidatorSigningInfo defines a validator's signing info for + monitoring their + + liveness activity. + title: info is the signing info of all validators + pagination: + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + title: >- + QuerySigningInfosResponse is the response type for the + Query/SigningInfos RPC + + method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/slashing/v1beta1/signing_infos/{cons_address}': + get: + summary: SigningInfo queries the signing info of given cons address + operationId: CosmosSlashingV1Beta1SigningInfo + responses: + '200': + description: A successful response. + schema: + type: object + properties: + val_signing_info: + type: object + properties: + address: + type: string + start_height: + type: string + format: int64 + title: >- + Height at which validator was first a candidate OR was + unjailed + index_offset: + type: string + format: int64 + description: >- + Index which is incremented each time the validator was a + bonded + + in a block and may have signed a precommit or not. This in + conjunction with the + + `SignedBlocksWindow` param determines the index in the + `MissedBlocksBitArray`. + jailed_until: + type: string + format: date-time + description: >- + Timestamp until which the validator is jailed due to + liveness downtime. + tombstoned: + type: boolean + description: >- + Whether or not a validator has been tombstoned (killed out + of validator set). It is set + + once the validator commits an equivocation or for any + other configured misbehiavor. + missed_blocks_counter: + type: string + format: int64 + description: >- + A counter kept to avoid unnecessary array reads. + + Note that `Sum(MissedBlocksBitArray)` always equals + `MissedBlocksCounter`. + description: >- + ValidatorSigningInfo defines a validator's signing info for + monitoring their + + liveness activity. + title: >- + val_signing_info is the signing info of requested val cons + address + title: >- + QuerySigningInfoResponse is the response type for the + Query/SigningInfo RPC + + method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: cons_address + description: cons_address is the address to query signing info of + in: path + required: true + type: string + tags: + - Query + '/cosmos/staking/v1beta1/delegations/{delegator_addr}': + get: + summary: >- + DelegatorDelegations queries all delegations of a given delegator + address. + operationId: CosmosStakingV1Beta1DelegatorDelegations + responses: + '200': + description: A successful response. + schema: + type: object + properties: + delegation_responses: + type: array + items: + type: object + properties: + delegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of + the delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of + the validator. + shares: + type: string + description: shares define the delegation shares received. + description: >- + Delegation represents the bond with tokens held by an + account. It is + + owned by one delegator, and is associated with the + voting power of one + + validator. + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + description: >- + DelegationResponse is equivalent to Delegation except that + it contains a + + balance in addition to shares which is more suitable for + client responses. + description: >- + delegation_responses defines all the delegations' info of a + delegator. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryDelegatorDelegationsResponse is response type for the + Query/DelegatorDelegations RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: delegator_addr + description: delegator_addr defines the delegator address to query for. + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations': + get: + summary: Redelegations queries redelegations of given address. + operationId: CosmosStakingV1Beta1Redelegations + responses: + '200': + description: A successful response. + schema: + type: object + properties: + redelegation_responses: + type: array + items: + type: object + properties: + redelegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of + the delegator. + validator_src_address: + type: string + description: >- + validator_src_address is the validator redelegation + source operator address. + validator_dst_address: + type: string + description: >- + validator_dst_address is the validator redelegation + destination operator address. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the + redelegation took place. + completion_time: + type: string + format: date-time + description: >- + completion_time defines the unix time for + redelegation completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance + when redelegation started. + shares_dst: + type: string + description: >- + shares_dst is the amount of + destination-validator shares created by + redelegation. + description: >- + RedelegationEntry defines a redelegation object + with relevant metadata. + description: entries are the redelegation entries. + description: >- + Redelegation contains the list of a particular + delegator's redelegating bonds + + from a particular source validator to a particular + destination validator. + entries: + type: array + items: + type: object + properties: + redelegation_entry: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the + redelegation took place. + completion_time: + type: string + format: date-time + description: >- + completion_time defines the unix time for + redelegation completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance + when redelegation started. + shares_dst: + type: string + description: >- + shares_dst is the amount of + destination-validator shares created by + redelegation. + description: >- + RedelegationEntry defines a redelegation object + with relevant metadata. + balance: + type: string + description: >- + RedelegationEntryResponse is equivalent to a + RedelegationEntry except that it + + contains a balance in addition to shares which is more + suitable for client + + responses. + description: >- + RedelegationResponse is equivalent to a Redelegation except + that its entries + + contain a balance in addition to shares which is more + suitable for client + + responses. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryRedelegationsResponse is response type for the + Query/Redelegations RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: delegator_addr + description: delegator_addr defines the delegator address to query for. + in: path + required: true + type: string + - name: src_validator_addr + description: src_validator_addr defines the validator address to redelegate from. + in: query + required: false + type: string + - name: dst_validator_addr + description: dst_validator_addr defines the validator address to redelegate to. + in: query + required: false + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/staking/v1beta1/delegators/{delegator_addr}/unbonding_delegations': + get: + summary: >- + DelegatorUnbondingDelegations queries all unbonding delegations of a + given + + delegator address. + operationId: CosmosStakingV1Beta1DelegatorUnbondingDelegations + responses: + '200': + description: A successful response. + schema: + type: object + properties: + unbonding_responses: + type: array + items: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height is the height which the unbonding + took place. + completion_time: + type: string + format: date-time + description: >- + completion_time is the unix time for unbonding + completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially + scheduled to receive at completion. + balance: + type: string + description: >- + balance defines the tokens to receive at + completion. + description: >- + UnbondingDelegationEntry defines an unbonding object + with relevant metadata. + description: entries are the unbonding delegation entries. + description: >- + UnbondingDelegation stores all of a single delegator's + unbonding bonds + + for a single validator in an time-ordered list. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryUnbondingDelegatorDelegationsResponse is response type for + the + + Query/UnbondingDelegatorDelegations RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: delegator_addr + description: delegator_addr defines the delegator address to query for. + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators': + get: + summary: |- + DelegatorValidators queries all validators info for given delegator + address. + operationId: CosmosStakingV1Beta1DelegatorValidators + responses: + '200': + description: A successful response. + schema: + type: object + properties: + validators: + type: array + items: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded message, + with an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed + from bonded status or not. + status: + description: >- + status is the validator status + (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: >- + tokens define the delegated tokens (incl. + self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a + validator's delegators. + description: + description: >- + description defines the description terms for the + validator. + type: object + properties: + moniker: + type: string + description: >- + moniker defines a human-readable name for the + validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. + UPort or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for + security contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at + which this validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for + the validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission + rates to be used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to + delegators, as a fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate + which validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily + increase of the validator commission, as a + fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared + minimum self delegation. + description: >- + Validator defines a validator, together with the total + amount of the + + Validator's bond shares and their exchange rate to coins. + Slashing results in + + a decrease in the exchange rate, allowing correct + calculation of future + + undelegations without iterating over delegators. When coins + are delegated to + + this validator, the validator is credited with a delegation + whose number of + + bond shares is based on the amount of coins delegated + divided by the current + + exchange rate. Voting power can be calculated as total + bonded shares + + multiplied by exchange rate. + description: validators defines the the validators' info of a delegator. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryDelegatorValidatorsResponse is response type for the + Query/DelegatorValidators RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: delegator_addr + description: delegator_addr defines the delegator address to query for. + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/{validator_addr}': + get: + summary: |- + DelegatorValidator queries validator info for given delegator validator + pair. + operationId: CosmosStakingV1Beta1DelegatorValidator + responses: + '200': + description: A successful response. + schema: + type: object + properties: + validator: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from + bonded status or not. + status: + description: >- + status is the validator status + (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: >- + tokens define the delegated tokens (incl. + self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a + validator's delegators. + description: + description: >- + description defines the description terms for the + validator. + type: object + properties: + moniker: + type: string + description: >- + moniker defines a human-readable name for the + validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. + UPort or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for + security contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at + which this validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates + to be used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, + as a fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase + of the validator commission, as a fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared + minimum self delegation. + description: >- + Validator defines a validator, together with the total amount + of the + + Validator's bond shares and their exchange rate to coins. + Slashing results in + + a decrease in the exchange rate, allowing correct calculation + of future + + undelegations without iterating over delegators. When coins + are delegated to + + this validator, the validator is credited with a delegation + whose number of + + bond shares is based on the amount of coins delegated divided + by the current + + exchange rate. Voting power can be calculated as total bonded + shares + + multiplied by exchange rate. + description: |- + QueryDelegatorValidatorResponse response type for the + Query/DelegatorValidator RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: delegator_addr + description: delegator_addr defines the delegator address to query for. + in: path + required: true + type: string + - name: validator_addr + description: validator_addr defines the validator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/staking/v1beta1/historical_info/{height}': + get: + summary: HistoricalInfo queries the historical info for given height. + operationId: CosmosStakingV1Beta1HistoricalInfo + responses: + '200': + description: A successful response. + schema: + type: object + properties: + hist: + description: hist defines the historical info at the given height. + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing + a block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + valset: + type: array + items: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the + validator's operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must + contain at least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name + should be in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, + for URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message + definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup + results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently + available in the official + + protobuf release, and it is not used for type + URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol + buffer message along with a + + URL that describes the type of the serialized + message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods + of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will + by default use + + 'type.googleapis.com/full.type.name' as the type URL + and the unpack + + methods only use the fully qualified type name after + the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" + will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded + message, with an + + additional field `@type` which contains the type + URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to + the `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed + from bonded status or not. + status: + description: >- + status is the validator status + (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: >- + tokens define the delegated tokens (incl. + self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a + validator's delegators. + description: + description: >- + description defines the description terms for the + validator. + type: object + properties: + moniker: + type: string + description: >- + moniker defines a human-readable name for the + validator. + identity: + type: string + description: >- + identity defines an optional identity signature + (ex. UPort or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for + security contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height + at which this validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time + for the validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission + rates to be used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to + delegators, as a fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate + which validator can ever charge, as a + fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily + increase of the validator commission, as a + fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate + was changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared + minimum self delegation. + description: >- + Validator defines a validator, together with the total + amount of the + + Validator's bond shares and their exchange rate to + coins. Slashing results in + + a decrease in the exchange rate, allowing correct + calculation of future + + undelegations without iterating over delegators. When + coins are delegated to + + this validator, the validator is credited with a + delegation whose number of + + bond shares is based on the amount of coins delegated + divided by the current + + exchange rate. Voting power can be calculated as total + bonded shares + + multiplied by exchange rate. + description: >- + QueryHistoricalInfoResponse is response type for the + Query/HistoricalInfo RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: height + description: height defines at which height to query the historical info. + in: path + required: true + type: string + format: int64 + tags: + - Query + /cosmos/staking/v1beta1/params: + get: + summary: Parameters queries the staking parameters. + operationId: CosmosStakingV1Beta1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params holds all the parameters of this module. + type: object + properties: + unbonding_time: + type: string + description: unbonding_time is the time duration of unbonding. + max_validators: + type: integer + format: int64 + description: max_validators is the maximum number of validators. + max_entries: + type: integer + format: int64 + description: >- + max_entries is the max entries for either unbonding + delegation or redelegation (per pair/trio). + historical_entries: + type: integer + format: int64 + description: >- + historical_entries is the number of historical entries to + persist. + bond_denom: + type: string + description: bond_denom defines the bondable coin denomination. + description: >- + QueryParamsResponse is response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + /cosmos/staking/v1beta1/pool: + get: + summary: Pool queries the pool info. + operationId: CosmosStakingV1Beta1Pool + responses: + '200': + description: A successful response. + schema: + type: object + properties: + pool: + description: pool defines the pool info. + type: object + properties: + not_bonded_tokens: + type: string + bonded_tokens: + type: string + description: QueryPoolResponse is response type for the Query/Pool RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + /cosmos/staking/v1beta1/validators: + get: + summary: Validators queries all validators that match the given status. + operationId: CosmosStakingV1Beta1Validators + responses: + '200': + description: A successful response. + schema: + type: object + properties: + validators: + type: array + items: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded message, + with an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed + from bonded status or not. + status: + description: >- + status is the validator status + (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: >- + tokens define the delegated tokens (incl. + self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a + validator's delegators. + description: + description: >- + description defines the description terms for the + validator. + type: object + properties: + moniker: + type: string + description: >- + moniker defines a human-readable name for the + validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. + UPort or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for + security contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at + which this validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for + the validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission + rates to be used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to + delegators, as a fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate + which validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily + increase of the validator commission, as a + fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared + minimum self delegation. + description: >- + Validator defines a validator, together with the total + amount of the + + Validator's bond shares and their exchange rate to coins. + Slashing results in + + a decrease in the exchange rate, allowing correct + calculation of future + + undelegations without iterating over delegators. When coins + are delegated to + + this validator, the validator is credited with a delegation + whose number of + + bond shares is based on the amount of coins delegated + divided by the current + + exchange rate. Voting power can be calculated as total + bonded shares + + multiplied by exchange rate. + description: validators contains all the queried validators. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + title: >- + QueryValidatorsResponse is response type for the Query/Validators + RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: status + description: status enables to query for validators matching a given status. + in: query + required: false + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/staking/v1beta1/validators/{validator_addr}': + get: + summary: Validator queries validator info for given validator address. + operationId: CosmosStakingV1Beta1Validator + responses: + '200': + description: A successful response. + schema: + type: object + properties: + validator: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from + bonded status or not. + status: + description: >- + status is the validator status + (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: >- + tokens define the delegated tokens (incl. + self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a + validator's delegators. + description: + description: >- + description defines the description terms for the + validator. + type: object + properties: + moniker: + type: string + description: >- + moniker defines a human-readable name for the + validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. + UPort or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for + security contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at + which this validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates + to be used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, + as a fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase + of the validator commission, as a fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared + minimum self delegation. + description: >- + Validator defines a validator, together with the total amount + of the + + Validator's bond shares and their exchange rate to coins. + Slashing results in + + a decrease in the exchange rate, allowing correct calculation + of future + + undelegations without iterating over delegators. When coins + are delegated to + + this validator, the validator is credited with a delegation + whose number of + + bond shares is based on the amount of coins delegated divided + by the current + + exchange rate. Voting power can be calculated as total bonded + shares + + multiplied by exchange rate. + title: >- + QueryValidatorResponse is response type for the Query/Validator + RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: validator_addr + description: validator_addr defines the validator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/staking/v1beta1/validators/{validator_addr}/delegations': + get: + summary: ValidatorDelegations queries delegate info for given validator. + operationId: CosmosStakingV1Beta1ValidatorDelegations + responses: + '200': + description: A successful response. + schema: + type: object + properties: + delegation_responses: + type: array + items: + type: object + properties: + delegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of + the delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of + the validator. + shares: + type: string + description: shares define the delegation shares received. + description: >- + Delegation represents the bond with tokens held by an + account. It is + + owned by one delegator, and is associated with the + voting power of one + + validator. + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + description: >- + DelegationResponse is equivalent to Delegation except that + it contains a + + balance in addition to shares which is more suitable for + client responses. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + title: |- + QueryValidatorDelegationsResponse is response type for the + Query/ValidatorDelegations RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: validator_addr + description: validator_addr defines the validator address to query for. + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}': + get: + summary: Delegation queries delegate info for given validator delegator pair. + operationId: CosmosStakingV1Beta1Delegation + responses: + '200': + description: A successful response. + schema: + type: object + properties: + delegation_response: + type: object + properties: + delegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + shares: + type: string + description: shares define the delegation shares received. + description: >- + Delegation represents the bond with tokens held by an + account. It is + + owned by one delegator, and is associated with the voting + power of one + + validator. + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + description: >- + DelegationResponse is equivalent to Delegation except that it + contains a + + balance in addition to shares which is more suitable for + client responses. + description: >- + QueryDelegationResponse is response type for the Query/Delegation + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: validator_addr + description: validator_addr defines the validator address to query for. + in: path + required: true + type: string + - name: delegator_addr + description: delegator_addr defines the delegator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}/unbonding_delegation': + get: + summary: |- + UnbondingDelegation queries unbonding info for given validator delegator + pair. + operationId: CosmosStakingV1Beta1UnbondingDelegation + responses: + '200': + description: A successful response. + schema: + type: object + properties: + unbond: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height is the height which the unbonding + took place. + completion_time: + type: string + format: date-time + description: >- + completion_time is the unix time for unbonding + completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially + scheduled to receive at completion. + balance: + type: string + description: balance defines the tokens to receive at completion. + description: >- + UnbondingDelegationEntry defines an unbonding object + with relevant metadata. + description: entries are the unbonding delegation entries. + description: >- + UnbondingDelegation stores all of a single delegator's + unbonding bonds + + for a single validator in an time-ordered list. + description: >- + QueryDelegationResponse is response type for the + Query/UnbondingDelegation + + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: validator_addr + description: validator_addr defines the validator address to query for. + in: path + required: true + type: string + - name: delegator_addr + description: delegator_addr defines the delegator address to query for. + in: path + required: true + type: string + tags: + - Query + '/cosmos/staking/v1beta1/validators/{validator_addr}/unbonding_delegations': + get: + summary: >- + ValidatorUnbondingDelegations queries unbonding delegations of a + validator. + operationId: CosmosStakingV1Beta1ValidatorUnbondingDelegations + responses: + '200': + description: A successful response. + schema: + type: object + properties: + unbonding_responses: + type: array + items: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height is the height which the unbonding + took place. + completion_time: + type: string + format: date-time + description: >- + completion_time is the unix time for unbonding + completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially + scheduled to receive at completion. + balance: + type: string + description: >- + balance defines the tokens to receive at + completion. + description: >- + UnbondingDelegationEntry defines an unbonding object + with relevant metadata. + description: entries are the unbonding delegation entries. + description: >- + UnbondingDelegation stores all of a single delegator's + unbonding bonds + + for a single validator in an time-ordered list. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryValidatorUnbondingDelegationsResponse is response type for + the + + Query/ValidatorUnbondingDelegations RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: validator_addr + description: validator_addr defines the validator address to query for. + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + /cosmos/tx/v1beta1/simulate: + post: + summary: Simulate simulates executing a transaction for estimating gas usage. + operationId: CosmosTxV1Beta1Simulate + responses: + '200': + description: A successful response. + schema: + type: object + properties: + gas_info: + description: gas_info is the information about gas used in the simulation. + type: object + properties: + gas_wanted: + type: string + format: uint64 + description: >- + GasWanted is the maximum units of work we allow this tx to + perform. + gas_used: + type: string + format: uint64 + description: GasUsed is the amount of gas actually consumed. + result: + description: result is the result of the simulation. + type: object + properties: + data: + type: string + format: byte + description: >- + Data is any data returned from message or handler + execution. It MUST be + + length prefixed in order to separate data from multiple + message executions. + log: + type: string + description: >- + Log contains the log information from message or handler + execution. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, + associated with an event. + description: >- + Event allows application developers to attach additional + information to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx + and ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events contains a slice of Event objects that were emitted + during message + + or handler execution. + description: |- + SimulateResponse is the response type for the + Service.SimulateRPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: body + in: body + required: true + schema: + $ref: '#/definitions/cosmos.tx.v1beta1.SimulateRequest' + tags: + - Service + /cosmos/tx/v1beta1/txs: + get: + summary: GetTxsEvent fetches txs by event. + operationId: CosmosTxV1Beta1GetTxsEvent + responses: + '200': + description: A successful response. + schema: + $ref: '#/definitions/cosmos.tx.v1beta1.GetTxsEventResponse' + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: events + description: events is the list of transaction event type. + in: query + required: false + type: array + items: + type: string + collectionFormat: multi + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + - name: order_by + description: |2- + - ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults to ASC in this case. + - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order + - ORDER_BY_DESC: ORDER_BY_DESC defines descending order + in: query + required: false + type: string + enum: + - ORDER_BY_UNSPECIFIED + - ORDER_BY_ASC + - ORDER_BY_DESC + default: ORDER_BY_UNSPECIFIED + tags: + - Service + post: + summary: BroadcastTx broadcast transaction. + operationId: CosmosTxV1Beta1BroadcastTx + responses: + '200': + description: A successful response. + schema: + type: object + properties: + tx_response: + type: object + properties: + height: + type: string + format: int64 + title: The block height + txhash: + type: string + description: The transaction hash. + codespace: + type: string + title: Namespace for the Code + code: + type: integer + format: int64 + description: Response code. + data: + type: string + description: 'Result bytes, if any.' + raw_log: + type: string + description: >- + The output of the application's logger (raw string). May + be + + non-deterministic. + logs: + type: array + items: + type: object + properties: + msg_index: + type: integer + format: int64 + log: + type: string + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + description: >- + Attribute defines an attribute wrapper where + the key and value are + + strings instead of raw bytes. + description: >- + StringEvent defines en Event object wrapper where + all the attributes + + contain key/value pairs that are strings instead + of raw bytes. + description: >- + Events contains a slice of Event objects that were + emitted during some + + execution. + description: >- + ABCIMessageLog defines a structure containing an indexed + tx ABCI message log. + description: >- + The output of the application's logger (typed). May be + non-deterministic. + info: + type: string + description: Additional information. May be non-deterministic. + gas_wanted: + type: string + format: int64 + description: Amount of gas requested for transaction. + gas_used: + type: string + format: int64 + description: Amount of gas consumed by transaction. + tx: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + timestamp: + type: string + description: >- + Time of the previous block. For heights > 1, it's the + weighted median of + + the timestamps of the valid votes in the block.LastCommit. + For height == 1, + + it's genesis time. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, + associated with an event. + description: >- + Event allows application developers to attach additional + information to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx + and ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events defines all the events emitted by processing a + transaction. Note, + + these events include those emitted by processing all the + messages and those + + emitted from the ante handler. Whereas Logs contains the + events, with + + additional metadata, emitted only by processing the + messages. + + + Since: cosmos-sdk 0.42.11, 0.44.5, 0.45 + description: >- + TxResponse defines a structure containing relevant tx data and + metadata. The + + tags are stringified and the log is JSON decoded. + description: |- + BroadcastTxResponse is the response type for the + Service.BroadcastTx method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: body + in: body + required: true + schema: + type: object + properties: + tx_bytes: + type: string + format: byte + description: tx_bytes is the raw transaction. + mode: + type: string + enum: + - BROADCAST_MODE_UNSPECIFIED + - BROADCAST_MODE_BLOCK + - BROADCAST_MODE_SYNC + - BROADCAST_MODE_ASYNC + default: BROADCAST_MODE_UNSPECIFIED + description: >- + BroadcastMode specifies the broadcast mode for the + TxService.Broadcast RPC method. + + - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering + - BROADCAST_MODE_BLOCK: BROADCAST_MODE_BLOCK defines a tx broadcasting mode where the client waits for + the tx to be committed in a block. + - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits for + a CheckTx execution response only. + - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client returns + immediately. + description: >- + BroadcastTxRequest is the request type for the + Service.BroadcastTxRequest + + RPC method. + tags: + - Service + '/cosmos/tx/v1beta1/txs/{hash}': + get: + summary: GetTx fetches a tx by hash. + operationId: CosmosTxV1Beta1GetTx + responses: + '200': + description: A successful response. + schema: + $ref: '#/definitions/cosmos.tx.v1beta1.GetTxResponse' + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: hash + description: 'hash is the tx hash to query, encoded as a hex string.' + in: path + required: true + type: string + tags: + - Service + '/cosmos/upgrade/v1beta1/applied_plan/{name}': + get: + summary: AppliedPlan queries a previously applied upgrade plan by its name. + operationId: CosmosUpgradeV1Beta1AppliedPlan + responses: + '200': + description: A successful response. + schema: + type: object + properties: + height: + type: string + format: int64 + description: height is the block height at which the plan was applied. + description: >- + QueryAppliedPlanResponse is the response type for the + Query/AppliedPlan RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: name + description: name is the name of the applied plan to query for. + in: path + required: true + type: string + tags: + - Query + /cosmos/upgrade/v1beta1/current_plan: + get: + summary: CurrentPlan queries the current upgrade plan. + operationId: CosmosUpgradeV1Beta1CurrentPlan + responses: + '200': + description: A successful response. + schema: + type: object + properties: + plan: + description: plan is the current upgrade plan. + type: object + properties: + name: + type: string + description: >- + Sets the name for the upgrade. This name will be used by + the upgraded + + version of the software to apply any special "on-upgrade" + commands during + + the first BeginBlock method after the upgrade is applied. + It is also used + + to detect whether a software version can handle a given + upgrade. If no + + upgrade handler with this name has been set in the + software, it will be + + assumed that the software is out-of-date when the upgrade + Time or Height is + + reached and the software will exit. + time: + type: string + format: date-time + description: >- + Deprecated: Time based upgrades have been deprecated. Time + based upgrade logic + + has been removed from the SDK. + + If this field is not empty, an error will be thrown. + height: + type: string + format: int64 + description: |- + The height at which the upgrade must be performed. + Only used if Time is not set. + info: + type: string + title: >- + Any application specific upgrade info to be included + on-chain + + such as a git commit that validators could automatically + upgrade to + upgraded_client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + QueryCurrentPlanResponse is the response type for the + Query/CurrentPlan RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + /cosmos/upgrade/v1beta1/module_versions: + get: + summary: ModuleVersions queries the list of module versions from state. + description: 'Since: cosmos-sdk 0.43' + operationId: CosmosUpgradeV1Beta1ModuleVersions + responses: + '200': + description: A successful response. + schema: + type: object + properties: + module_versions: + type: array + items: + type: object + properties: + name: + type: string + title: name of the app module + version: + type: string + format: uint64 + title: consensus version of the app module + description: |- + ModuleVersion specifies a module and its consensus version. + + Since: cosmos-sdk 0.43 + description: >- + module_versions is a list of module names with their consensus + versions. + description: >- + QueryModuleVersionsResponse is the response type for the + Query/ModuleVersions + + RPC method. + + + Since: cosmos-sdk 0.43 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: module_name + description: |- + module_name is a field to query a specific module + consensus version from state. Leaving this empty will + fetch the full list of module versions from state + in: query + required: false + type: string + tags: + - Query + '/cosmos/upgrade/v1beta1/upgraded_consensus_state/{last_height}': + get: + summary: >- + UpgradedConsensusState queries the consensus state that will serve + + as a trusted kernel for the next version of this chain. It will only be + + stored at the last height of this chain. + + UpgradedConsensusState RPC not supported with legacy querier + + This rpc is deprecated now that IBC has its own replacement + + (https://github.com/cosmos/ibc-go/blob/2c880a22e9f9cc75f62b527ca94aa75ce1106001/proto/ibc/core/client/v1/query.proto#L54) + operationId: CosmosUpgradeV1Beta1UpgradedConsensusState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + upgraded_consensus_state: + type: string + format: byte + title: 'Since: cosmos-sdk 0.43' + description: >- + QueryUpgradedConsensusStateResponse is the response type for the + Query/UpgradedConsensusState + + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: last_height + description: |- + last height of the current chain must be sent in request + as this is the height under which next consensus state is stored + in: path + required: true + type: string + format: int64 + tags: + - Query + /ibc/apps/transfer/v1/denom_traces: + get: + summary: DenomTraces queries all denomination traces. + operationId: IbcApplicationsTransferV1DenomTraces + responses: + '200': + description: A successful response. + schema: + type: object + properties: + denom_traces: + type: array + items: + type: object + properties: + path: + type: string + description: >- + path defines the chain of port/channel identifiers used + for tracing the + + source of the fungible token. + base_denom: + type: string + description: base denomination of the relayed fungible token. + description: >- + DenomTrace contains the base denomination for ICS20 fungible + tokens and the + + source tracing information path. + description: denom_traces returns all denominations trace information. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryConnectionsResponse is the response type for the + Query/DenomTraces RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + tags: + - Query + '/ibc/apps/transfer/v1/denom_traces/{hash}': + get: + summary: DenomTrace queries a denomination trace information. + operationId: IbcApplicationsTransferV1DenomTrace + responses: + '200': + description: A successful response. + schema: + type: object + properties: + denom_trace: + type: object + properties: + path: + type: string + description: >- + path defines the chain of port/channel identifiers used + for tracing the + + source of the fungible token. + base_denom: + type: string + description: base denomination of the relayed fungible token. + description: >- + DenomTrace contains the base denomination for ICS20 fungible + tokens and the + + source tracing information path. + description: >- + QueryDenomTraceResponse is the response type for the + Query/DenomTrace RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: hash + description: hash (in hex format) of the denomination trace information. + in: path + required: true + type: string + tags: + - Query + /ibc/apps/transfer/v1/params: + get: + summary: Params queries all parameters of the ibc-transfer module. + operationId: IbcApplicationsTransferV1Params + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + send_enabled: + type: boolean + description: >- + send_enabled enables or disables all cross-chain token + transfers from this + + chain. + receive_enabled: + type: boolean + description: >- + receive_enabled enables or disables all cross-chain token + transfers to this + + chain. + description: >- + QueryParamsResponse is the response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + /ibc/core/channel/v1/channels: + get: + summary: Channels queries all the IBC channels of a chain. + operationId: IbcCoreChannelV1Channels + responses: + '200': + description: A successful response. + schema: + type: object + properties: + channels: + type: array + items: + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: >- + State defines if a channel is in one of the following + states: + + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: >- + - ORDER_NONE_UNSPECIFIED: zero-value for channel + ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other + end of the channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: >- + list of connection identifiers, in order, along which + packets sent on + + this channel will travel + version: + type: string + title: >- + opaque channel version, which is agreed upon during the + handshake + port_id: + type: string + title: port identifier + channel_id: + type: string + title: channel identifier + description: >- + IdentifiedChannel defines a channel with additional port and + channel + + identifier fields. + description: list of stored channels of the chain. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryChannelsResponse is the response type for the Query/Channels + RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}': + get: + summary: Channel queries an IBC Channel. + operationId: IbcCoreChannelV1Channel + responses: + '200': + description: A successful response. + schema: + type: object + properties: + channel: + title: channel associated with the request identifiers + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: >- + State defines if a channel is in one of the following + states: + + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other + end of the channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: >- + list of connection identifiers, in order, along which + packets sent on + + this channel will travel + version: + type: string + title: >- + opaque channel version, which is agreed upon during the + handshake + description: >- + Channel defines pipeline for exactly-once packet delivery + between specific + + modules on separate blockchains, which has at least one end + capable of + + sending packets and one end capable of receiving packets. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryChannelResponse is the response type for the Query/Channel + RPC method. + + Besides the Channel end, it includes a proof and the height from + which the + + proof was retrieved. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/client_state': + get: + summary: >- + ChannelClientState queries for the client state for the channel + associated + + with the provided channel identifiers. + operationId: IbcCoreChannelV1ChannelClientState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + identified_client_state: + title: client state associated with the channel + type: object + properties: + client_id: + type: string + title: client identifier + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state + description: >- + IdentifiedClientState defines a client state with an + additional client + + identifier field. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryChannelClientStateResponse is the Response type for the + Query/QueryChannelClientState RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/consensus_state/revision/{revision_number}/height/{revision_height}': + get: + summary: |- + ChannelConsensusState queries for the consensus state for the channel + associated with the provided channel identifiers. + operationId: IbcCoreChannelV1ChannelConsensusState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: consensus state associated with the channel + client_id: + type: string + title: client ID associated with the consensus state + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryChannelClientStateResponse is the Response type for the + Query/QueryChannelClientState RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: revision_number + description: revision number of the consensus state + in: path + required: true + type: string + format: uint64 + - name: revision_height + description: revision height of the consensus state + in: path + required: true + type: string + format: uint64 + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence': + get: + summary: >- + NextSequenceReceive returns the next receive sequence for a given + channel. + operationId: IbcCoreChannelV1NextSequenceReceive + responses: + '200': + description: A successful response. + schema: + type: object + properties: + next_sequence_receive: + type: string + format: uint64 + title: next sequence receive number + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QuerySequenceResponse is the request type for the + Query/QueryNextSequenceReceiveResponse RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements': + get: + summary: >- + PacketAcknowledgements returns all the packet acknowledgements + associated + + with a channel. + operationId: IbcCoreChannelV1PacketAcknowledgements + responses: + '200': + description: A successful response. + schema: + type: object + properties: + acknowledgements: + type: array + items: + type: object + properties: + port_id: + type: string + description: channel port identifier. + channel_id: + type: string + description: channel unique identifier. + sequence: + type: string + format: uint64 + description: packet sequence. + data: + type: string + format: byte + description: embedded data that represents packet state. + description: >- + PacketState defines the generic type necessary to retrieve + and store + + packet commitments, acknowledgements, and receipts. + + Caller is responsible for knowing the context necessary to + interpret this + + state as a commitment, acknowledgement, or a receipt. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryPacketAcknowledgemetsResponse is the request type for the + Query/QueryPacketAcknowledgements RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: packet_commitment_sequences + description: list of packet sequences + in: query + required: false + type: array + items: + type: string + format: uint64 + collectionFormat: multi + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}': + get: + summary: PacketAcknowledgement queries a stored packet acknowledgement hash. + operationId: IbcCoreChannelV1PacketAcknowledgement + responses: + '200': + description: A successful response. + schema: + type: object + properties: + acknowledgement: + type: string + format: byte + title: packet associated with the request fields + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + QueryPacketAcknowledgementResponse defines the client query + response for a + + packet which also includes a proof and the height from which the + + proof was retrieved + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: sequence + description: packet sequence + in: path + required: true + type: string + format: uint64 + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments': + get: + summary: |- + PacketCommitments returns all the packet commitments hashes associated + with a channel. + operationId: IbcCoreChannelV1PacketCommitments + responses: + '200': + description: A successful response. + schema: + type: object + properties: + commitments: + type: array + items: + type: object + properties: + port_id: + type: string + description: channel port identifier. + channel_id: + type: string + description: channel unique identifier. + sequence: + type: string + format: uint64 + description: packet sequence. + data: + type: string + format: byte + description: embedded data that represents packet state. + description: >- + PacketState defines the generic type necessary to retrieve + and store + + packet commitments, acknowledgements, and receipts. + + Caller is responsible for knowing the context necessary to + interpret this + + state as a commitment, acknowledgement, or a receipt. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryPacketCommitmentsResponse is the request type for the + Query/QueryPacketCommitments RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks': + get: + summary: >- + UnreceivedAcks returns all the unreceived IBC acknowledgements + associated + + with a channel and sequences. + operationId: IbcCoreChannelV1UnreceivedAcks + responses: + '200': + description: A successful response. + schema: + type: object + properties: + sequences: + type: array + items: + type: string + format: uint64 + title: list of unreceived acknowledgement sequences + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryUnreceivedAcksResponse is the response type for the + Query/UnreceivedAcks RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: packet_ack_sequences + description: list of acknowledgement sequences + in: path + required: true + type: array + items: + type: string + format: uint64 + collectionFormat: csv + minItems: 1 + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets': + get: + summary: >- + UnreceivedPackets returns all the unreceived IBC packets associated with + a + + channel and sequences. + operationId: IbcCoreChannelV1UnreceivedPackets + responses: + '200': + description: A successful response. + schema: + type: object + properties: + sequences: + type: array + items: + type: string + format: uint64 + title: list of unreceived packet sequences + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryUnreceivedPacketsResponse is the response type for the + Query/UnreceivedPacketCommitments RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: packet_commitment_sequences + description: list of packet sequences + in: path + required: true + type: array + items: + type: string + format: uint64 + collectionFormat: csv + minItems: 1 + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}': + get: + summary: PacketCommitment queries a stored packet commitment hash. + operationId: IbcCoreChannelV1PacketCommitment + responses: + '200': + description: A successful response. + schema: + type: object + properties: + commitment: + type: string + format: byte + title: packet associated with the request fields + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + QueryPacketCommitmentResponse defines the client query response + for a packet + + which also includes a proof and the height from which the proof + was + + retrieved + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: sequence + description: packet sequence + in: path + required: true + type: string + format: uint64 + tags: + - Query + '/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}': + get: + summary: >- + PacketReceipt queries if a given packet sequence has been received on + the + + queried chain + operationId: IbcCoreChannelV1PacketReceipt + responses: + '200': + description: A successful response. + schema: + type: object + properties: + received: + type: boolean + title: success flag for if receipt exists + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + QueryPacketReceiptResponse defines the client query response for a + packet + + receipt which also includes a proof, and the height from which the + proof was + + retrieved + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: channel_id + description: channel unique identifier + in: path + required: true + type: string + - name: port_id + description: port unique identifier + in: path + required: true + type: string + - name: sequence + description: packet sequence + in: path + required: true + type: string + format: uint64 + tags: + - Query + '/ibc/core/channel/v1/connections/{connection}/channels': + get: + summary: |- + ConnectionChannels queries all the channels associated with a connection + end. + operationId: IbcCoreChannelV1ConnectionChannels + responses: + '200': + description: A successful response. + schema: + type: object + properties: + channels: + type: array + items: + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: >- + State defines if a channel is in one of the following + states: + + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: >- + - ORDER_NONE_UNSPECIFIED: zero-value for channel + ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other + end of the channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: >- + list of connection identifiers, in order, along which + packets sent on + + this channel will travel + version: + type: string + title: >- + opaque channel version, which is agreed upon during the + handshake + port_id: + type: string + title: port identifier + channel_id: + type: string + title: channel identifier + description: >- + IdentifiedChannel defines a channel with additional port and + channel + + identifier fields. + description: list of channels associated with a connection. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryConnectionChannelsResponse is the Response type for the + Query/QueryConnectionChannels RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: connection + description: connection unique identifier + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + tags: + - Query + /ibc/client/v1/params: + get: + summary: ClientParams queries all parameters of the ibc client. + operationId: IbcCoreClientV1ClientParams + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + allowed_clients: + type: array + items: + type: string + description: >- + allowed_clients defines the list of allowed client state + types. + description: >- + QueryClientParamsResponse is the response type for the + Query/ClientParams RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + /ibc/core/client/v1/client_states: + get: + summary: ClientStates queries all the IBC light clients of a chain. + operationId: IbcCoreClientV1ClientStates + responses: + '200': + description: A successful response. + schema: + type: object + properties: + client_states: + type: array + items: + type: object + properties: + client_id: + type: string + title: client identifier + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded message, + with an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state + description: >- + IdentifiedClientState defines a client state with an + additional client + + identifier field. + description: list of stored ClientStates of the chain. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + description: >- + QueryClientStatesResponse is the response type for the + Query/ClientStates RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + tags: + - Query + '/ibc/core/client/v1/client_states/{client_id}': + get: + summary: ClientState queries an IBC light client. + operationId: IbcCoreClientV1ClientState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state associated with the request identifier + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryClientStateResponse is the response type for the + Query/ClientState RPC + + method. Besides the client state, it includes a proof and the + height from + + which the proof was retrieved. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: client_id + description: client state unique identifier + in: path + required: true + type: string + tags: + - Query + '/ibc/core/client/v1/client_status/{client_id}': + get: + summary: Status queries the status of an IBC client. + operationId: IbcCoreClientV1ClientStatus + responses: + '200': + description: A successful response. + schema: + type: object + properties: + status: + type: string + description: >- + QueryClientStatusResponse is the response type for the + Query/ClientStatus RPC + + method. It returns the current status of the IBC client. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: client_id + description: client unique identifier + in: path + required: true + type: string + tags: + - Query + '/ibc/core/client/v1/consensus_states/{client_id}': + get: + summary: |- + ConsensusStates queries all the consensus state associated with a given + client. + operationId: IbcCoreClientV1ConsensusStates + responses: + '200': + description: A successful response. + schema: + type: object + properties: + consensus_states: + type: array + items: + type: object + properties: + height: + title: consensus state height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each + height while keeping + + RevisionNumber the same. However some consensus + algorithms may choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as + the RevisionHeight + + gets reset + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the + type of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's + path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the + binary all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available + in the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the + regular + + representation of the deserialized, embedded message, + with an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message + [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: consensus state + description: >- + ConsensusStateWithHeight defines a consensus state with an + additional height + + field. + title: consensus states associated with the identifier + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + title: |- + QueryConsensusStatesResponse is the response type for the + Query/ConsensusStates RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: client_id + description: client identifier + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + tags: + - Query + '/ibc/core/client/v1/consensus_states/{client_id}/revision/{revision_number}/height/{revision_height}': + get: + summary: >- + ConsensusState queries a consensus state associated with a client state + at + + a given height. + operationId: IbcCoreClientV1ConsensusState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: >- + consensus state associated with the client identifier at the + given height + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + QueryConsensusStateResponse is the response type for the + Query/ConsensusState + + RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: client_id + description: client identifier + in: path + required: true + type: string + - name: revision_number + description: consensus state revision number + in: path + required: true + type: string + format: uint64 + - name: revision_height + description: consensus state revision height + in: path + required: true + type: string + format: uint64 + - name: latest_height + description: >- + latest_height overrrides the height field and queries the latest + stored + + ConsensusState + in: query + required: false + type: boolean + tags: + - Query + /ibc/core/client/v1/upgraded_client_states: + get: + summary: UpgradedClientState queries an Upgraded IBC light client. + operationId: IbcCoreClientV1UpgradedClientState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + upgraded_client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state associated with the request identifier + description: |- + QueryUpgradedClientStateResponse is the response type for the + Query/UpgradedClientState RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + /ibc/core/client/v1/upgraded_consensus_states: + get: + summary: UpgradedConsensusState queries an Upgraded IBC consensus state. + operationId: IbcCoreClientV1UpgradedConsensusState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + upgraded_consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: Consensus state associated with the request identifier + description: |- + QueryUpgradedConsensusStateResponse is the response type for the + Query/UpgradedConsensusState RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + tags: + - Query + '/ibc/core/connection/v1/client_connections/{client_id}': + get: + summary: |- + ClientConnections queries the connection paths associated with a client + state. + operationId: IbcCoreConnectionV1ClientConnections + responses: + '200': + description: A successful response. + schema: + type: object + properties: + connection_paths: + type: array + items: + type: string + description: slice of all the connection paths associated with a client. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was generated + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryClientConnectionsResponse is the response type for the + Query/ClientConnections RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: client_id + description: client identifier associated with a connection + in: path + required: true + type: string + tags: + - Query + /ibc/core/connection/v1/connections: + get: + summary: Connections queries all the IBC connections of a chain. + operationId: IbcCoreConnectionV1Connections + responses: + '200': + description: A successful response. + schema: + type: object + properties: + connections: + type: array + items: + type: object + properties: + id: + type: string + description: connection identifier. + client_id: + type: string + description: client associated with this connection. + versions: + type: array + items: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: >- + list of features compatible with the specified + identifier + description: >- + Version defines the versioning scheme used to + negotiate the IBC verison in + + the connection handshake. + title: >- + IBC version which can be utilised to determine encodings + or protocols for + + channels or packets utilising this connection + state: + description: current state of the connection end. + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + default: STATE_UNINITIALIZED_UNSPECIFIED + counterparty: + description: counterparty chain associated with this connection. + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain + associated with a given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty + chain associated with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will + be append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + delay_period: + type: string + format: uint64 + description: delay period associated with this connection. + description: >- + IdentifiedConnection defines a connection with additional + connection + + identifier field. + description: list of stored connections of the chain. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryConnectionsResponse is the response type for the + Query/Connections RPC + + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + tags: + - Query + '/ibc/core/connection/v1/connections/{connection_id}': + get: + summary: Connection queries an IBC connection end. + operationId: IbcCoreConnectionV1Connection + responses: + '200': + description: A successful response. + schema: + type: object + properties: + connection: + title: connection associated with the request identifier + type: object + properties: + client_id: + type: string + description: client associated with this connection. + versions: + type: array + items: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: >- + list of features compatible with the specified + identifier + description: >- + Version defines the versioning scheme used to negotiate + the IBC verison in + + the connection handshake. + description: >- + IBC version which can be utilised to determine encodings + or protocols for + + channels or packets utilising this connection. + state: + description: current state of the connection end. + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + default: STATE_UNINITIALIZED_UNSPECIFIED + counterparty: + description: counterparty chain associated with this connection. + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain + associated with a given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty + chain associated with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will be + append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + delay_period: + type: string + format: uint64 + description: >- + delay period that must pass before a consensus state can + be used for + + packet-verification NOTE: delay period logic is only + implemented by some + + clients. + description: >- + ConnectionEnd defines a stateful object on a chain connected + to another + + separate one. + + NOTE: there must only be 2 defined ConnectionEnds to establish + + a connection between two chains. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryConnectionResponse is the response type for the + Query/Connection RPC + + method. Besides the connection end, it includes a proof and the + height from + + which the proof was retrieved. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: connection_id + description: connection unique identifier + in: path + required: true + type: string + tags: + - Query + '/ibc/core/connection/v1/connections/{connection_id}/client_state': + get: + summary: |- + ConnectionClientState queries the client state associated with the + connection. + operationId: IbcCoreConnectionV1ConnectionClientState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + identified_client_state: + title: client state associated with the channel + type: object + properties: + client_id: + type: string + title: client identifier + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type + of the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be + in a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can + optionally set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results + based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty + scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any + values in the form + + of utility functions or additional generated methods of + the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and + the unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will + yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a + custom JSON + + representation, that representation will be embedded + adding a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state + description: >- + IdentifiedClientState defines a client state with an + additional client + + identifier field. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryConnectionClientStateResponse is the response type for the + Query/ConnectionClientState RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: connection_id + description: connection identifier + in: path + required: true + type: string + tags: + - Query + '/ibc/core/connection/v1/connections/{connection_id}/consensus_state/revision/{revision_number}/height/{revision_height}': + get: + summary: |- + ConnectionConsensusState queries the consensus state associated with the + connection. + operationId: IbcCoreConnectionV1ConnectionConsensusState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: consensus state associated with the channel + client_id: + type: string + title: client ID associated with the consensus state + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryConnectionConsensusStateResponse is the response type for the + Query/ConnectionConsensusState RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: connection_id + description: connection identifier + in: path + required: true + type: string + - name: revision_number + in: path + required: true + type: string + format: uint64 + - name: revision_height + in: path + required: true + type: string + format: uint64 + tags: + - Query + '/shareledger/asset/{uuid}': + get: + summary: Queries a list of assetByUUID items. + operationId: ShareledgerAssetAssetByUUID + responses: + '200': + description: A successful response. + schema: + type: object + properties: + asset: + type: object + properties: + creator: + type: string + hash: + type: string + format: byte + UUID: + type: string + status: + type: boolean + rate: + type: string + format: int64 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: uuid + in: path + required: true + type: string + tags: + - Query + '/shareledger/booking/{bookID}': + get: + summary: Queries a list of booking items. + operationId: ShareledgerBookingBooking + responses: + '200': + description: A successful response. + schema: + type: object + properties: + booking: + type: object + properties: + bookID: + type: string + booker: + type: string + UUID: + type: string + duration: + type: string + format: int64 + isCompleted: + type: boolean + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: bookID + in: path + required: true + type: string + tags: + - Query + '/shareledger/document/proof/{proof}': + get: + summary: Queries a list of documentByProof items. + operationId: ShareledgerDocumentDocumentByProof + responses: + '200': + description: A successful response. + schema: + type: object + properties: + document: + type: object + properties: + holder: + type: string + issuer: + type: string + proof: + type: string + data: + type: string + version: + type: integer + format: int32 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: proof + in: path + required: true + type: string + tags: + - Query + '/shareledger/document/{holder}/{issuer}': + get: + summary: Queries a list of documentOfHolderByIssuer items. + operationId: ShareledgerDocumentDocumentOfHolderByIssuer + responses: + '200': + description: A successful response. + schema: + type: object + properties: + documents: + type: array + items: + type: object + properties: + holder: + type: string + issuer: + type: string + proof: + type: string + data: + type: string + version: + type: integer + format: int32 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: holder + in: path + required: true + type: string + - name: issuer + in: path + required: true + type: string + tags: + - Query + '/shareledger/document/{id}': + get: + summary: Queries a list of documentByHolderId items. + operationId: ShareledgerDocumentDocumentByHolderId + responses: + '200': + description: A successful response. + schema: + type: object + properties: + documents: + type: array + items: + type: object + properties: + holder: + type: string + issuer: + type: string + proof: + type: string + data: + type: string + version: + type: integer + format: int32 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: id + in: path + required: true + type: string + tags: + - Query + /shareledger/electoral/accStates: + get: + summary: Queries a list of accState items. + operationId: ShareledgerElectoralAccStates + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accState: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + pagination: + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + PageResponse is to be embedded in gRPC response messages where + the + + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + '/shareledger/electoral/accStates/{key}': + get: + summary: Queries a accState by index. + operationId: ShareledgerElectoralAccState + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: key + in: path + required: true + type: string + tags: + - Query + /shareledger/electoral/accountOperators: + get: + summary: Queries a list of accountOperators items. + operationId: ShareledgerElectoralAccountOperators + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accStates: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/shareledger/electoral/accountOperators/{address}': + get: + summary: Queries a list of accountOperator items. + operationId: ShareledgerElectoralAccountOperator + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: path + required: true + type: string + tags: + - Query + /shareledger/electoral/documentIssuers: + get: + summary: Queries a list of documentIssuers items. + operationId: ShareledgerElectoralDocumentIssuers + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accStates: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/shareledger/electoral/documentIssuers/{address}': + get: + summary: Queries a list of documentIssuer items. + operationId: ShareledgerElectoralDocumentIssuer + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: path + required: true + type: string + tags: + - Query + /shareledger/electoral/idSigners: + get: + summary: Queries a list of idSigners items. + operationId: ShareledgerElectoralIdSigners + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accStates: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/shareledger/electoral/idSigners/{address}': + get: + summary: Queries a list of idSigner items. + operationId: ShareledgerElectoralIdSigner + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: path + required: true + type: string + tags: + - Query + /shareledger/electoral/loaders: + get: + summary: Queries a list of Loaders items. + operationId: ShareledgerElectoralLoaders + responses: + '200': + description: A successful response. + schema: + type: object + properties: + loaders: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/shareledger/electoral/loaders/{address}': + get: + summary: Queries a list of Loader items. + operationId: ShareledgerElectoralLoader + responses: + '200': + description: A successful response. + schema: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: path + required: true + type: string + tags: + - Query + /shareledger/electoral/voters: + get: + summary: Queries a list of Voters items. + operationId: ShareledgerElectoralVoters + responses: + '200': + description: A successful response. + schema: + type: object + properties: + voters: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/shareledger/electoral/voters/{address}': + get: + summary: Queries a list of Voter items. + operationId: ShareledgerElectoralVoter + responses: + '200': + description: A successful response. + schema: + type: object + properties: + voter: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: path + required: true + type: string + tags: + - Query + /shareledger/gentlemint/actionLevelFee: + get: + summary: Queries a list of actionLevelFee items. + operationId: ShareledgerGentlemintActionLevelFees + responses: + '200': + description: A successful response. + schema: + type: object + properties: + actionLevelFee: + type: array + items: + type: object + properties: + action: + type: string + level: + type: string + creator: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/shareledger/gentlemint/actionLevelFee/{action}': + get: + summary: Queries a actionLevelFee by index. + operationId: ShareledgerGentlemintActionLevelFee + responses: + '200': + description: A successful response. + schema: + type: object + properties: + action: + type: string + level: + type: string + fee: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: action + in: path + required: true + type: string + tags: + - Query + /shareledger/gentlemint/balances: + get: + summary: Queries a list of balances items. + operationId: ShareledgerGentlemintBalances + responses: + '200': + description: A successful response. + schema: + type: object + properties: + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: query + required: false + type: string + tags: + - Query + /shareledger/gentlemint/checkFees: + get: + summary: Queries a list of checkFees items. + operationId: ShareledgerGentlemintCheckFees + responses: + '200': + description: A successful response. + schema: + type: object + properties: + convertedFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + sufficientFee: + type: boolean + sufficientFundForFee: + type: boolean + costLoadingFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: query + required: false + type: string + - name: actions + in: query + required: false + type: array + items: + type: string + collectionFormat: multi + tags: + - Query + /shareledger/gentlemint/exchangeRate: + get: + summary: Queries a exchangeRate by index. + operationId: ShareledgerGentlemintExchangeRate + responses: + '200': + description: A successful response. + schema: + type: object + properties: + rate: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /shareledger/gentlemint/levelFee: + get: + summary: Queries a list of levelFee items. + operationId: ShareledgerGentlemintLevelFees + responses: + '200': + description: A successful response. + schema: + type: object + properties: + levelFees: + type: array + items: + type: object + properties: + level: + type: string + creator: + type: string + originalFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a + decimal amount. + + + NOTE: The amount field is an Dec which implements the + custom method + + signatures required by gogoproto. + convertedFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + '/shareledger/gentlemint/levelFee/{level}': + get: + summary: Queries a levelFee by index. + operationId: ShareledgerGentlemintLevelFee + responses: + '200': + description: A successful response. + schema: + type: object + properties: + levelFee: + type: object + properties: + level: + type: string + creator: + type: string + originalFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the + custom method + + signatures required by gogoproto. + convertedFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the + custom method + + signatures required by gogoproto. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: level + in: path + required: true + type: string + tags: + - Query + '/shareledger/id/address/{address}': + get: + summary: Queries a list of idByAddress items. + operationId: ShareledgerIdIdByAddress + responses: + '200': + description: A successful response. + schema: + type: object + properties: + id: + type: object + properties: + id: + type: string + data: + type: object + properties: + issuerAddress: + type: string + backupAddress: + type: string + ownerAddress: + type: string + extraData: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: address + in: path + required: true + type: string + tags: + - Query + '/shareledger/id/id/{id}': + get: + summary: Queries a list of idById items. + operationId: ShareledgerIdIdById + responses: + '200': + description: A successful response. + schema: + type: object + properties: + id: + type: object + properties: + id: + type: string + data: + type: object + properties: + issuerAddress: + type: string + backupAddress: + type: string + ownerAddress: + type: string + extraData: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: id + in: path + required: true + type: string + tags: + - Query +definitions: + cosmos.auth.v1beta1.Params: + type: object + properties: + max_memo_characters: + type: string + format: uint64 + tx_sig_limit: + type: string + format: uint64 + tx_size_cost_per_byte: + type: string + format: uint64 + sig_verify_cost_ed25519: + type: string + format: uint64 + sig_verify_cost_secp256k1: + type: string + format: uint64 + description: Params defines the parameters for the auth module. + cosmos.auth.v1beta1.QueryAccountResponse: + type: object + properties: + account: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + QueryAccountResponse is the response type for the Query/Account RPC + method. + cosmos.auth.v1beta1.QueryAccountsResponse: + type: object + properties: + accounts: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up + a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: accounts are the existing accounts + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAccountsResponse is the response type for the Query/Accounts RPC + method. + + + Since: cosmos-sdk 0.43 + cosmos.auth.v1beta1.QueryParamsResponse: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + max_memo_characters: + type: string + format: uint64 + tx_sig_limit: + type: string + format: uint64 + tx_size_cost_per_byte: + type: string + format: uint64 + sig_verify_cost_ed25519: + type: string + format: uint64 + sig_verify_cost_secp256k1: + type: string + format: uint64 + description: QueryParamsResponse is the response type for the Query/Params RPC method. + cosmos.base.query.v1beta1.PageRequest: + type: object + properties: + key: + type: string + format: byte + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + offset: + type: string + format: uint64 + description: |- + offset is a numeric offset that can be used when key is unavailable. + It is less efficient than using key. Only one of offset or key should + be set. + limit: + type: string + format: uint64 + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + count_total: + type: boolean + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in UIs. + + count_total is only respected when offset is used. It is ignored when + key + + is set. + reverse: + type: boolean + description: >- + reverse is set to true if results are to be returned in the descending + order. + + + Since: cosmos-sdk 0.43 + description: |- + message SomeRequest { + Foo some_parameter = 1; + PageRequest pagination = 2; + } + title: |- + PageRequest is to be embedded in gRPC request messages for efficient + pagination. Ex: + cosmos.base.query.v1beta1.PageResponse: + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: |- + total is total number of results available if PageRequest.count_total + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + google.protobuf.Any: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a canonical + form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types that + they + + expect it to use in the context of Any. However, for URLs which use + the + + scheme `http`, `https`, or no scheme, one can optionally set up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along with + a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + google.rpc.Status: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up + a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + cosmos.bank.v1beta1.DenomUnit: + type: object + properties: + denom: + type: string + description: denom represents the string name of the given denom unit (e.g uatom). + exponent: + type: integer + format: int64 + description: >- + exponent represents power of 10 exponent that one must + + raise the base_denom to in order to equal the given DenomUnit's denom + + 1 denom = 1^exponent base_denom + + (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' + with + + exponent = 6, thus: 1 atom = 10^6 uatom). + aliases: + type: array + items: + type: string + title: aliases is a list of string aliases for the given denom + description: |- + DenomUnit represents a struct that describes a given + denomination unit of the basic token. + cosmos.bank.v1beta1.Input: + type: object + properties: + address: + type: string + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: Input models transaction input. + cosmos.bank.v1beta1.Metadata: + type: object + properties: + description: + type: string + denom_units: + type: array + items: + type: object + properties: + denom: + type: string + description: >- + denom represents the string name of the given denom unit (e.g + uatom). + exponent: + type: integer + format: int64 + description: >- + exponent represents power of 10 exponent that one must + + raise the base_denom to in order to equal the given DenomUnit's + denom + + 1 denom = 1^exponent base_denom + + (e.g. with a base_denom of uatom, one can create a DenomUnit of + 'atom' with + + exponent = 6, thus: 1 atom = 10^6 uatom). + aliases: + type: array + items: + type: string + title: aliases is a list of string aliases for the given denom + description: |- + DenomUnit represents a struct that describes a given + denomination unit of the basic token. + title: denom_units represents the list of DenomUnit's for a given coin + base: + type: string + description: >- + base represents the base denom (should be the DenomUnit with exponent + = 0). + display: + type: string + description: |- + display indicates the suggested denom that should be + displayed in clients. + name: + type: string + description: 'Since: cosmos-sdk 0.43' + title: 'name defines the name of the token (eg: Cosmos Atom)' + symbol: + type: string + description: >- + symbol is the token symbol usually shown on exchanges (eg: ATOM). This + can + + be the same as the display. + + + Since: cosmos-sdk 0.43 + description: |- + Metadata represents a struct that describes + a basic token. + cosmos.bank.v1beta1.MsgMultiSendResponse: + type: object + description: MsgMultiSendResponse defines the Msg/MultiSend response type. + cosmos.bank.v1beta1.MsgSendResponse: + type: object + description: MsgSendResponse defines the Msg/Send response type. + cosmos.bank.v1beta1.Output: + type: object + properties: + address: + type: string + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: Output models transaction outputs. + cosmos.bank.v1beta1.Params: + type: object + properties: + send_enabled: + type: array + items: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: >- + SendEnabled maps coin denom to a send_enabled status (whether a + denom is + + sendable). + default_send_enabled: + type: boolean + description: Params defines the parameters for the bank module. + cosmos.bank.v1beta1.QueryAllBalancesResponse: + type: object + properties: + balances: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: balances is the balances of all the coins. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAllBalancesResponse is the response type for the Query/AllBalances + RPC + + method. + cosmos.bank.v1beta1.QueryBalanceResponse: + type: object + properties: + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: >- + QueryBalanceResponse is the response type for the Query/Balance RPC + method. + cosmos.bank.v1beta1.QueryDenomMetadataResponse: + type: object + properties: + metadata: + type: object + properties: + description: + type: string + denom_units: + type: array + items: + type: object + properties: + denom: + type: string + description: >- + denom represents the string name of the given denom unit + (e.g uatom). + exponent: + type: integer + format: int64 + description: >- + exponent represents power of 10 exponent that one must + + raise the base_denom to in order to equal the given + DenomUnit's denom + + 1 denom = 1^exponent base_denom + + (e.g. with a base_denom of uatom, one can create a DenomUnit + of 'atom' with + + exponent = 6, thus: 1 atom = 10^6 uatom). + aliases: + type: array + items: + type: string + title: aliases is a list of string aliases for the given denom + description: |- + DenomUnit represents a struct that describes a given + denomination unit of the basic token. + title: denom_units represents the list of DenomUnit's for a given coin + base: + type: string + description: >- + base represents the base denom (should be the DenomUnit with + exponent = 0). + display: + type: string + description: |- + display indicates the suggested denom that should be + displayed in clients. + name: + type: string + description: 'Since: cosmos-sdk 0.43' + title: 'name defines the name of the token (eg: Cosmos Atom)' + symbol: + type: string + description: >- + symbol is the token symbol usually shown on exchanges (eg: ATOM). + This can + + be the same as the display. + + + Since: cosmos-sdk 0.43 + description: |- + Metadata represents a struct that describes + a basic token. + description: >- + QueryDenomMetadataResponse is the response type for the + Query/DenomMetadata RPC + + method. + cosmos.bank.v1beta1.QueryDenomsMetadataResponse: + type: object + properties: + metadatas: + type: array + items: + type: object + properties: + description: + type: string + denom_units: + type: array + items: + type: object + properties: + denom: + type: string + description: >- + denom represents the string name of the given denom unit + (e.g uatom). + exponent: + type: integer + format: int64 + description: >- + exponent represents power of 10 exponent that one must + + raise the base_denom to in order to equal the given + DenomUnit's denom + + 1 denom = 1^exponent base_denom + + (e.g. with a base_denom of uatom, one can create a + DenomUnit of 'atom' with + + exponent = 6, thus: 1 atom = 10^6 uatom). + aliases: + type: array + items: + type: string + title: aliases is a list of string aliases for the given denom + description: |- + DenomUnit represents a struct that describes a given + denomination unit of the basic token. + title: denom_units represents the list of DenomUnit's for a given coin + base: + type: string + description: >- + base represents the base denom (should be the DenomUnit with + exponent = 0). + display: + type: string + description: |- + display indicates the suggested denom that should be + displayed in clients. + name: + type: string + description: 'Since: cosmos-sdk 0.43' + title: 'name defines the name of the token (eg: Cosmos Atom)' + symbol: + type: string + description: >- + symbol is the token symbol usually shown on exchanges (eg: + ATOM). This can + + be the same as the display. + + + Since: cosmos-sdk 0.43 + description: |- + Metadata represents a struct that describes + a basic token. + description: >- + metadata provides the client information for all the registered + tokens. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryDenomsMetadataResponse is the response type for the + Query/DenomsMetadata RPC + + method. + cosmos.bank.v1beta1.QueryParamsResponse: + type: object + properties: + params: + type: object + properties: + send_enabled: + type: array + items: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: >- + SendEnabled maps coin denom to a send_enabled status (whether a + denom is + + sendable). + default_send_enabled: + type: boolean + description: Params defines the parameters for the bank module. + description: >- + QueryParamsResponse defines the response type for querying x/bank + parameters. + cosmos.bank.v1beta1.QuerySupplyOfResponse: + type: object + properties: + amount: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: >- + QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC + method. + cosmos.bank.v1beta1.QueryTotalSupplyResponse: + type: object + properties: + supply: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + title: supply is the supply of the coins + pagination: + description: |- + pagination defines the pagination in the response. + + Since: cosmos-sdk 0.43 + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + title: >- + QueryTotalSupplyResponse is the response type for the Query/TotalSupply + RPC + + method + cosmos.bank.v1beta1.SendEnabled: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: |- + SendEnabled maps coin denom to a send_enabled status (whether a denom is + sendable). + cosmos.base.v1beta1.Coin: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + cosmos.base.tendermint.v1beta1.GetBlockByHeightResponse: + type: object + properties: + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + block: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block + in the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + data: + type: object + properties: + txs: + type: array + items: + type: string + format: byte + description: >- + Txs that will be applied by state @ block.Height+1. + + NOTE: not all txs here are valid. We're just agreeing on the + order first. + + This means that block.AppHash does not include these txs. + title: Data contains the set of transactions included in the block + evidence: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + duplicate_vote_evidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote + from validators for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote + from validators for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a validator + signed two conflicting votes. + light_client_attack_evidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules + for processing a block in the + blockchain, + + including all blockchain data structures + and the rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a Tendermint + block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included + in a Commit. + description: >- + Commit contains the evidence that a block + was committed by a set of validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use + with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a set of + validators attempting to mislead a light client. + last_commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + description: >- + Commit contains the evidence that a block was committed by a set + of validators. + description: >- + GetBlockByHeightResponse is the response type for the + Query/GetBlockByHeight RPC method. + cosmos.base.tendermint.v1beta1.GetLatestBlockResponse: + type: object + properties: + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + block: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block + in the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + data: + type: object + properties: + txs: + type: array + items: + type: string + format: byte + description: >- + Txs that will be applied by state @ block.Height+1. + + NOTE: not all txs here are valid. We're just agreeing on the + order first. + + This means that block.AppHash does not include these txs. + title: Data contains the set of transactions included in the block + evidence: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + duplicate_vote_evidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote + from validators for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote + from validators for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a validator + signed two conflicting votes. + light_client_attack_evidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules + for processing a block in the + blockchain, + + including all blockchain data structures + and the rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a Tendermint + block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included + in a Commit. + description: >- + Commit contains the evidence that a block + was committed by a set of validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use + with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a set of + validators attempting to mislead a light client. + last_commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + description: >- + Commit contains the evidence that a block was committed by a set + of validators. + description: >- + GetLatestBlockResponse is the response type for the Query/GetLatestBlock + RPC method. + cosmos.base.tendermint.v1beta1.GetLatestValidatorSetResponse: + type: object + properties: + block_height: + type: string + format: int64 + validators: + type: array + items: + type: object + properties: + address: + type: string + pub_key: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + description: Validator is the type for the validator-set. + pagination: + description: pagination defines an pagination for the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + GetLatestValidatorSetResponse is the response type for the + Query/GetValidatorSetByHeight RPC method. + cosmos.base.tendermint.v1beta1.GetNodeInfoResponse: + type: object + properties: + default_node_info: + type: object + properties: + protocol_version: + type: object + properties: + p2p: + type: string + format: uint64 + block: + type: string + format: uint64 + app: + type: string + format: uint64 + default_node_id: + type: string + listen_addr: + type: string + network: + type: string + version: + type: string + channels: + type: string + format: byte + moniker: + type: string + other: + type: object + properties: + tx_index: + type: string + rpc_address: + type: string + application_version: + type: object + properties: + name: + type: string + app_name: + type: string + version: + type: string + git_commit: + type: string + build_tags: + type: string + go_version: + type: string + build_deps: + type: array + items: + type: object + properties: + path: + type: string + title: module path + version: + type: string + title: module version + sum: + type: string + title: checksum + title: Module is the type for VersionInfo + cosmos_sdk_version: + type: string + title: 'Since: cosmos-sdk 0.43' + description: VersionInfo is the type for the GetNodeInfoResponse message. + description: >- + GetNodeInfoResponse is the request type for the Query/GetNodeInfo RPC + method. + cosmos.base.tendermint.v1beta1.GetSyncingResponse: + type: object + properties: + syncing: + type: boolean + description: >- + GetSyncingResponse is the response type for the Query/GetSyncing RPC + method. + cosmos.base.tendermint.v1beta1.GetValidatorSetByHeightResponse: + type: object + properties: + block_height: + type: string + format: int64 + validators: + type: array + items: + type: object + properties: + address: + type: string + pub_key: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + description: Validator is the type for the validator-set. + pagination: + description: pagination defines an pagination for the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + GetValidatorSetByHeightResponse is the response type for the + Query/GetValidatorSetByHeight RPC method. + cosmos.base.tendermint.v1beta1.Module: + type: object + properties: + path: + type: string + title: module path + version: + type: string + title: module version + sum: + type: string + title: checksum + title: Module is the type for VersionInfo + cosmos.base.tendermint.v1beta1.Validator: + type: object + properties: + address: + type: string + pub_key: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + description: Validator is the type for the validator-set. + cosmos.base.tendermint.v1beta1.VersionInfo: + type: object + properties: + name: + type: string + app_name: + type: string + version: + type: string + git_commit: + type: string + build_tags: + type: string + go_version: + type: string + build_deps: + type: array + items: + type: object + properties: + path: + type: string + title: module path + version: + type: string + title: module version + sum: + type: string + title: checksum + title: Module is the type for VersionInfo + cosmos_sdk_version: + type: string + title: 'Since: cosmos-sdk 0.43' + description: VersionInfo is the type for the GetNodeInfoResponse message. + tendermint.crypto.PublicKey: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: PublicKey defines the keys available for use with Tendermint Validators + tendermint.p2p.DefaultNodeInfo: + type: object + properties: + protocol_version: + type: object + properties: + p2p: + type: string + format: uint64 + block: + type: string + format: uint64 + app: + type: string + format: uint64 + default_node_id: + type: string + listen_addr: + type: string + network: + type: string + version: + type: string + channels: + type: string + format: byte + moniker: + type: string + other: + type: object + properties: + tx_index: + type: string + rpc_address: + type: string + tendermint.p2p.DefaultNodeInfoOther: + type: object + properties: + tx_index: + type: string + rpc_address: + type: string + tendermint.p2p.ProtocolVersion: + type: object + properties: + p2p: + type: string + format: uint64 + block: + type: string + format: uint64 + app: + type: string + format: uint64 + tendermint.types.Block: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block in + the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + data: + type: object + properties: + txs: + type: array + items: + type: string + format: byte + description: >- + Txs that will be applied by state @ block.Height+1. + + NOTE: not all txs here are valid. We're just agreeing on the + order first. + + This means that block.AppHash does not include these txs. + title: Data contains the set of transactions included in the block + evidence: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + duplicate_vote_evidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote + from validators for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote + from validators for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a validator + signed two conflicting votes. + light_client_attack_evidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, + + including all blockchain data structures and + the rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: >- + hashes from the app output from the prev + block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a Tendermint + block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included + in a Commit. + description: >- + Commit contains the evidence that a block was + committed by a set of validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for + use with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use + with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with + Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a set of + validators attempting to mislead a light client. + last_commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + description: >- + Commit contains the evidence that a block was committed by a set of + validators. + tendermint.types.BlockID: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + tendermint.types.BlockIDFlag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + tendermint.types.Commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + description: >- + Commit contains the evidence that a block was committed by a set of + validators. + tendermint.types.CommitSig: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + tendermint.types.Data: + type: object + properties: + txs: + type: array + items: + type: string + format: byte + description: >- + Txs that will be applied by state @ block.Height+1. + + NOTE: not all txs here are valid. We're just agreeing on the order + first. + + This means that block.AppHash does not include these txs. + title: Data contains the set of transactions included in the block + tendermint.types.DuplicateVoteEvidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: |- + SignedMsgType is a type of signed message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote from validators + for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: |- + SignedMsgType is a type of signed message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote from validators + for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a validator signed two + conflicting votes. + tendermint.types.Evidence: + type: object + properties: + duplicate_vote_evidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: |- + SignedMsgType is a type of signed message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote from + validators for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: |- + SignedMsgType is a type of signed message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote from + validators for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a validator signed two + conflicting votes. + light_client_attack_evidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing + a block in the blockchain, + + including all blockchain data structures and the rules + of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included in a + Commit. + description: >- + Commit contains the evidence that a block was committed by + a set of validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with + Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with + Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with Tendermint + Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a set of validators + attempting to mislead a light client. + tendermint.types.EvidenceList: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + duplicate_vote_evidence: + type: object + properties: + vote_a: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote from + validators for + + consensus. + vote_b: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: >- + SignedMsgType is a type of signed message in the + consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: >- + Vote represents a prevote, precommit, or commit vote from + validators for + + consensus. + total_voting_power: + type: string + format: int64 + validator_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + DuplicateVoteEvidence contains evidence of a validator signed + two conflicting votes. + light_client_attack_evidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for + processing a block in the blockchain, + + including all blockchain data structures and the + rules of the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: >- + Header defines the structure of a Tendermint block + header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the + signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: >- + CommitSig is a part of the Vote included in a + Commit. + description: >- + Commit contains the evidence that a block was + committed by a set of validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use + with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use + with Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with + Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a set of + validators attempting to mislead a light client. + tendermint.types.Header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block in the + blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + tendermint.types.LightBlock: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block + in the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + description: >- + Commit contains the evidence that a block was committed by a set + of validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with Tendermint + Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with Tendermint + Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + tendermint.types.LightClientAttackEvidence: + type: object + properties: + conflicting_block: + type: object + properties: + signed_header: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a + block in the blockchain, + + including all blockchain data structures and the rules of + the application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: >- + BlockIdFlag indicates which BlcokID the signature is + for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + description: >- + Commit contains the evidence that a block was committed by a + set of validators. + validator_set: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with + Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with + Tendermint Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + common_height: + type: string + format: int64 + byzantine_validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with Tendermint + Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + timestamp: + type: string + format: date-time + description: >- + LightClientAttackEvidence contains evidence of a set of validators + attempting to mislead a light client. + tendermint.types.PartSetHeader: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + tendermint.types.SignedHeader: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block in + the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + commit: + type: object + properties: + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + signatures: + type: array + items: + type: object + properties: + block_id_flag: + type: string + enum: + - BLOCK_ID_FLAG_UNKNOWN + - BLOCK_ID_FLAG_ABSENT + - BLOCK_ID_FLAG_COMMIT + - BLOCK_ID_FLAG_NIL + default: BLOCK_ID_FLAG_UNKNOWN + title: BlockIdFlag indicates which BlcokID the signature is for + validator_address: + type: string + format: byte + timestamp: + type: string + format: date-time + signature: + type: string + format: byte + description: CommitSig is a part of the Vote included in a Commit. + description: >- + Commit contains the evidence that a block was committed by a set of + validators. + tendermint.types.SignedMsgType: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: |- + SignedMsgType is a type of signed message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + tendermint.types.Validator: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with Tendermint + Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + tendermint.types.ValidatorSet: + type: object + properties: + validators: + type: array + items: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with Tendermint + Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + proposer: + type: object + properties: + address: + type: string + format: byte + pub_key: + type: object + properties: + ed25519: + type: string + format: byte + secp256k1: + type: string + format: byte + title: >- + PublicKey defines the keys available for use with Tendermint + Validators + voting_power: + type: string + format: int64 + proposer_priority: + type: string + format: int64 + total_voting_power: + type: string + format: int64 + tendermint.types.Vote: + type: object + properties: + type: + type: string + enum: + - SIGNED_MSG_TYPE_UNKNOWN + - SIGNED_MSG_TYPE_PREVOTE + - SIGNED_MSG_TYPE_PRECOMMIT + - SIGNED_MSG_TYPE_PROPOSAL + default: SIGNED_MSG_TYPE_UNKNOWN + description: |- + SignedMsgType is a type of signed message in the consensus. + + - SIGNED_MSG_TYPE_PREVOTE: Votes + - SIGNED_MSG_TYPE_PROPOSAL: Proposals + height: + type: string + format: int64 + round: + type: integer + format: int32 + block_id: + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + title: BlockID + timestamp: + type: string + format: date-time + validator_address: + type: string + format: byte + validator_index: + type: integer + format: int32 + signature: + type: string + format: byte + description: |- + Vote represents a prevote, precommit, or commit vote from validators for + consensus. + tendermint.version.Consensus: + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block in the + blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + cosmos.crisis.v1beta1.MsgVerifyInvariantResponse: + type: object + description: MsgVerifyInvariantResponse defines the Msg/VerifyInvariant response type. + cosmos.base.v1beta1.DecCoin: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + cosmos.distribution.v1beta1.DelegationDelegatorReward: + type: object + properties: + validator_address: + type: string + reward: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + description: |- + DelegationDelegatorReward represents the properties + of a delegator's delegation reward. + cosmos.distribution.v1beta1.MsgFundCommunityPoolResponse: + type: object + description: >- + MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool response + type. + cosmos.distribution.v1beta1.MsgSetWithdrawAddressResponse: + type: object + description: >- + MsgSetWithdrawAddressResponse defines the Msg/SetWithdrawAddress response + type. + cosmos.distribution.v1beta1.MsgWithdrawDelegatorRewardResponse: + type: object + description: >- + MsgWithdrawDelegatorRewardResponse defines the Msg/WithdrawDelegatorReward + response type. + cosmos.distribution.v1beta1.MsgWithdrawValidatorCommissionResponse: + type: object + description: >- + MsgWithdrawValidatorCommissionResponse defines the + Msg/WithdrawValidatorCommission response type. + cosmos.distribution.v1beta1.Params: + type: object + properties: + community_tax: + type: string + base_proposer_reward: + type: string + bonus_proposer_reward: + type: string + withdraw_addr_enabled: + type: boolean + description: Params defines the set of params for the distribution module. + cosmos.distribution.v1beta1.QueryCommunityPoolResponse: + type: object + properties: + pool: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + description: pool defines community pool's coins. + description: >- + QueryCommunityPoolResponse is the response type for the + Query/CommunityPool + + RPC method. + cosmos.distribution.v1beta1.QueryDelegationRewardsResponse: + type: object + properties: + rewards: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + description: rewards defines the rewards accrued by a delegation. + description: |- + QueryDelegationRewardsResponse is the response type for the + Query/DelegationRewards RPC method. + cosmos.distribution.v1beta1.QueryDelegationTotalRewardsResponse: + type: object + properties: + rewards: + type: array + items: + type: object + properties: + validator_address: + type: string + reward: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + description: |- + DelegationDelegatorReward represents the properties + of a delegator's delegation reward. + description: rewards defines all the rewards accrued by a delegator. + total: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + description: total defines the sum of all the rewards. + description: |- + QueryDelegationTotalRewardsResponse is the response type for the + Query/DelegationTotalRewards RPC method. + cosmos.distribution.v1beta1.QueryDelegatorValidatorsResponse: + type: object + properties: + validators: + type: array + items: + type: string + description: validators defines the validators a delegator is delegating for. + description: |- + QueryDelegatorValidatorsResponse is the response type for the + Query/DelegatorValidators RPC method. + cosmos.distribution.v1beta1.QueryDelegatorWithdrawAddressResponse: + type: object + properties: + withdraw_address: + type: string + description: withdraw_address defines the delegator address to query for. + description: |- + QueryDelegatorWithdrawAddressResponse is the response type for the + Query/DelegatorWithdrawAddress RPC method. + cosmos.distribution.v1beta1.QueryParamsResponse: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + community_tax: + type: string + base_proposer_reward: + type: string + bonus_proposer_reward: + type: string + withdraw_addr_enabled: + type: boolean + description: QueryParamsResponse is the response type for the Query/Params RPC method. + cosmos.distribution.v1beta1.QueryValidatorCommissionResponse: + type: object + properties: + commission: + description: commission defines the commision the validator received. + type: object + properties: + commission: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + title: |- + QueryValidatorCommissionResponse is the response type for the + Query/ValidatorCommission RPC method + cosmos.distribution.v1beta1.QueryValidatorOutstandingRewardsResponse: + type: object + properties: + rewards: + type: object + properties: + rewards: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + description: >- + ValidatorOutstandingRewards represents outstanding (un-withdrawn) + rewards + + for a validator inexpensive to track, allows simple sanity checks. + description: |- + QueryValidatorOutstandingRewardsResponse is the response type for the + Query/ValidatorOutstandingRewards RPC method. + cosmos.distribution.v1beta1.QueryValidatorSlashesResponse: + type: object + properties: + slashes: + type: array + items: + type: object + properties: + validator_period: + type: string + format: uint64 + fraction: + type: string + description: |- + ValidatorSlashEvent represents a validator slash event. + Height is implicit within the store key. + This is needed to calculate appropriate amount of staking tokens + for delegations which are withdrawn after a slash has occurred. + description: slashes defines the slashes the validator received. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryValidatorSlashesResponse is the response type for the + Query/ValidatorSlashes RPC method. + cosmos.distribution.v1beta1.ValidatorAccumulatedCommission: + type: object + properties: + commission: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + description: |- + ValidatorAccumulatedCommission represents accumulated commission + for a validator kept as a running counter, can be withdrawn at any time. + cosmos.distribution.v1beta1.ValidatorOutstandingRewards: + type: object + properties: + rewards: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + description: |- + ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards + for a validator inexpensive to track, allows simple sanity checks. + cosmos.distribution.v1beta1.ValidatorSlashEvent: + type: object + properties: + validator_period: + type: string + format: uint64 + fraction: + type: string + description: |- + ValidatorSlashEvent represents a validator slash event. + Height is implicit within the store key. + This is needed to calculate appropriate amount of staking tokens + for delegations which are withdrawn after a slash has occurred. + cosmos.evidence.v1beta1.MsgSubmitEvidenceResponse: + type: object + properties: + hash: + type: string + format: byte + description: hash defines the hash of the evidence. + description: MsgSubmitEvidenceResponse defines the Msg/SubmitEvidence response type. + cosmos.evidence.v1beta1.QueryAllEvidenceResponse: + type: object + properties: + evidence: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up + a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: evidence returns all evidences. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAllEvidenceResponse is the response type for the Query/AllEvidence + RPC + + method. + cosmos.evidence.v1beta1.QueryEvidenceResponse: + type: object + properties: + evidence: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + QueryEvidenceResponse is the response type for the Query/Evidence RPC + method. + cosmos.feegrant.v1beta1.Grant: + type: object + properties: + granter: + type: string + description: >- + granter is the address of the user granting an allowance of their + funds. + grantee: + type: string + description: >- + grantee is the address of the user being granted an allowance of + another user's funds. + allowance: + description: allowance can be any of basic and filtered fee allowance. + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + title: Grant is stored in the KVStore to record a grant with full context + cosmos.feegrant.v1beta1.MsgGrantAllowanceResponse: + type: object + description: >- + MsgGrantAllowanceResponse defines the Msg/GrantAllowanceResponse response + type. + cosmos.feegrant.v1beta1.MsgRevokeAllowanceResponse: + type: object + description: >- + MsgRevokeAllowanceResponse defines the Msg/RevokeAllowanceResponse + response type. + cosmos.feegrant.v1beta1.QueryAllowanceResponse: + type: object + properties: + allowance: + description: allowance is a allowance granted for grantee by granter. + type: object + properties: + granter: + type: string + description: >- + granter is the address of the user granting an allowance of their + funds. + grantee: + type: string + description: >- + grantee is the address of the user being granted an allowance of + another user's funds. + allowance: + description: allowance can be any of basic and filtered fee allowance. + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + title: Grant is stored in the KVStore to record a grant with full context + description: >- + QueryAllowanceResponse is the response type for the Query/Allowance RPC + method. + cosmos.feegrant.v1beta1.QueryAllowancesResponse: + type: object + properties: + allowances: + type: array + items: + type: object + properties: + granter: + type: string + description: >- + granter is the address of the user granting an allowance of + their funds. + grantee: + type: string + description: >- + grantee is the address of the user being granted an allowance of + another user's funds. + allowance: + description: allowance can be any of basic and filtered fee allowance. + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + title: Grant is stored in the KVStore to record a grant with full context + description: allowances are allowance's granted for grantee by granter. + pagination: + description: pagination defines an pagination for the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryAllowancesResponse is the response type for the Query/Allowances RPC + method. + cosmos.gov.v1beta1.Deposit: + type: object + properties: + proposal_id: + type: string + format: uint64 + depositor: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + Deposit defines an amount deposited by an account address to an active + proposal. + cosmos.gov.v1beta1.DepositParams: + type: object + properties: + min_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: Minimum deposit for a proposal to enter voting period. + max_deposit_period: + type: string + description: >- + Maximum period for Atom holders to deposit on a proposal. Initial + value: 2 + months. + description: DepositParams defines the params for deposits on governance proposals. + cosmos.gov.v1beta1.MsgDepositResponse: + type: object + description: MsgDepositResponse defines the Msg/Deposit response type. + cosmos.gov.v1beta1.MsgSubmitProposalResponse: + type: object + properties: + proposal_id: + type: string + format: uint64 + description: MsgSubmitProposalResponse defines the Msg/SubmitProposal response type. + cosmos.gov.v1beta1.MsgVoteResponse: + type: object + description: MsgVoteResponse defines the Msg/Vote response type. + cosmos.gov.v1beta1.MsgVoteWeightedResponse: + type: object + description: |- + MsgVoteWeightedResponse defines the Msg/VoteWeighted response type. + + Since: cosmos-sdk 0.43 + cosmos.gov.v1beta1.Proposal: + type: object + properties: + proposal_id: + type: string + format: uint64 + content: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + status: + type: string + enum: + - PROPOSAL_STATUS_UNSPECIFIED + - PROPOSAL_STATUS_DEPOSIT_PERIOD + - PROPOSAL_STATUS_VOTING_PERIOD + - PROPOSAL_STATUS_PASSED + - PROPOSAL_STATUS_REJECTED + - PROPOSAL_STATUS_FAILED + default: PROPOSAL_STATUS_UNSPECIFIED + description: |- + ProposalStatus enumerates the valid statuses of a proposal. + + - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. + - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit + period. + - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting + period. + - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has + passed. + - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has + been rejected. + - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has + failed. + final_tally_result: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: TallyResult defines a standard tally for a governance proposal. + submit_time: + type: string + format: date-time + deposit_end_time: + type: string + format: date-time + total_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + voting_start_time: + type: string + format: date-time + voting_end_time: + type: string + format: date-time + description: Proposal defines the core field members of a governance proposal. + cosmos.gov.v1beta1.ProposalStatus: + type: string + enum: + - PROPOSAL_STATUS_UNSPECIFIED + - PROPOSAL_STATUS_DEPOSIT_PERIOD + - PROPOSAL_STATUS_VOTING_PERIOD + - PROPOSAL_STATUS_PASSED + - PROPOSAL_STATUS_REJECTED + - PROPOSAL_STATUS_FAILED + default: PROPOSAL_STATUS_UNSPECIFIED + description: |- + ProposalStatus enumerates the valid statuses of a proposal. + + - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. + - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit + period. + - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting + period. + - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has + passed. + - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has + been rejected. + - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has + failed. + cosmos.gov.v1beta1.QueryDepositResponse: + type: object + properties: + deposit: + type: object + properties: + proposal_id: + type: string + format: uint64 + depositor: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: |- + Deposit defines an amount deposited by an account address to an active + proposal. + description: >- + QueryDepositResponse is the response type for the Query/Deposit RPC + method. + cosmos.gov.v1beta1.QueryDepositsResponse: + type: object + properties: + deposits: + type: array + items: + type: object + properties: + proposal_id: + type: string + format: uint64 + depositor: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: >- + Deposit defines an amount deposited by an account address to an + active + + proposal. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryDepositsResponse is the response type for the Query/Deposits RPC + method. + cosmos.gov.v1beta1.QueryParamsResponse: + type: object + properties: + voting_params: + description: voting_params defines the parameters related to voting. + type: object + properties: + voting_period: + type: string + description: Length of the voting period. + deposit_params: + description: deposit_params defines the parameters related to deposit. + type: object + properties: + min_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: Minimum deposit for a proposal to enter voting period. + max_deposit_period: + type: string + description: >- + Maximum period for Atom holders to deposit on a proposal. Initial + value: 2 + months. + tally_params: + description: tally_params defines the parameters related to tally. + type: object + properties: + quorum: + type: string + format: byte + description: >- + Minimum percentage of total stake needed to vote for a result to + be + considered valid. + threshold: + type: string + format: byte + description: >- + Minimum proportion of Yes votes for proposal to pass. Default + value: 0.5. + veto_threshold: + type: string + format: byte + description: >- + Minimum value of Veto votes to Total votes ratio for proposal to + be + vetoed. Default value: 1/3. + description: QueryParamsResponse is the response type for the Query/Params RPC method. + cosmos.gov.v1beta1.QueryProposalResponse: + type: object + properties: + proposal: + type: object + properties: + proposal_id: + type: string + format: uint64 + content: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + status: + type: string + enum: + - PROPOSAL_STATUS_UNSPECIFIED + - PROPOSAL_STATUS_DEPOSIT_PERIOD + - PROPOSAL_STATUS_VOTING_PERIOD + - PROPOSAL_STATUS_PASSED + - PROPOSAL_STATUS_REJECTED + - PROPOSAL_STATUS_FAILED + default: PROPOSAL_STATUS_UNSPECIFIED + description: |- + ProposalStatus enumerates the valid statuses of a proposal. + + - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. + - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit + period. + - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting + period. + - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has + passed. + - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has + been rejected. + - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has + failed. + final_tally_result: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: TallyResult defines a standard tally for a governance proposal. + submit_time: + type: string + format: date-time + deposit_end_time: + type: string + format: date-time + total_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + voting_start_time: + type: string + format: date-time + voting_end_time: + type: string + format: date-time + description: Proposal defines the core field members of a governance proposal. + description: >- + QueryProposalResponse is the response type for the Query/Proposal RPC + method. + cosmos.gov.v1beta1.QueryProposalsResponse: + type: object + properties: + proposals: + type: array + items: + type: object + properties: + proposal_id: + type: string + format: uint64 + content: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + status: + type: string + enum: + - PROPOSAL_STATUS_UNSPECIFIED + - PROPOSAL_STATUS_DEPOSIT_PERIOD + - PROPOSAL_STATUS_VOTING_PERIOD + - PROPOSAL_STATUS_PASSED + - PROPOSAL_STATUS_REJECTED + - PROPOSAL_STATUS_FAILED + default: PROPOSAL_STATUS_UNSPECIFIED + description: |- + ProposalStatus enumerates the valid statuses of a proposal. + + - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. + - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit + period. + - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting + period. + - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has + passed. + - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has + been rejected. + - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has + failed. + final_tally_result: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: TallyResult defines a standard tally for a governance proposal. + submit_time: + type: string + format: date-time + deposit_end_time: + type: string + format: date-time + total_deposit: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + voting_start_time: + type: string + format: date-time + voting_end_time: + type: string + format: date-time + description: Proposal defines the core field members of a governance proposal. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryProposalsResponse is the response type for the Query/Proposals RPC + method. + cosmos.gov.v1beta1.QueryTallyResultResponse: + type: object + properties: + tally: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: TallyResult defines a standard tally for a governance proposal. + description: >- + QueryTallyResultResponse is the response type for the Query/Tally RPC + method. + cosmos.gov.v1beta1.QueryVoteResponse: + type: object + properties: + vote: + type: object + properties: + proposal_id: + type: string + format: uint64 + voter: + type: string + option: + description: >- + Deprecated: Prefer to use `options` instead. This field is set in + queries + + if and only if `len(options) == 1` and that option has weight 1. + In all + + other cases, this field will default to VOTE_OPTION_UNSPECIFIED. + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + options: + type: array + items: + type: object + properties: + option: + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + description: >- + VoteOption enumerates the valid vote options for a given + governance proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + weight: + type: string + description: |- + WeightedVoteOption defines a unit of vote for vote split. + + Since: cosmos-sdk 0.43 + title: 'Since: cosmos-sdk 0.43' + description: |- + Vote defines a vote on a governance proposal. + A Vote consists of a proposal ID, the voter, and the vote option. + description: QueryVoteResponse is the response type for the Query/Vote RPC method. + cosmos.gov.v1beta1.QueryVotesResponse: + type: object + properties: + votes: + type: array + items: + type: object + properties: + proposal_id: + type: string + format: uint64 + voter: + type: string + option: + description: >- + Deprecated: Prefer to use `options` instead. This field is set + in queries + + if and only if `len(options) == 1` and that option has weight 1. + In all + + other cases, this field will default to VOTE_OPTION_UNSPECIFIED. + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + options: + type: array + items: + type: object + properties: + option: + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + description: >- + VoteOption enumerates the valid vote options for a given + governance proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + weight: + type: string + description: |- + WeightedVoteOption defines a unit of vote for vote split. + + Since: cosmos-sdk 0.43 + title: 'Since: cosmos-sdk 0.43' + description: |- + Vote defines a vote on a governance proposal. + A Vote consists of a proposal ID, the voter, and the vote option. + description: votes defined the queried votes. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: QueryVotesResponse is the response type for the Query/Votes RPC method. + cosmos.gov.v1beta1.TallyParams: + type: object + properties: + quorum: + type: string + format: byte + description: |- + Minimum percentage of total stake needed to vote for a result to be + considered valid. + threshold: + type: string + format: byte + description: >- + Minimum proportion of Yes votes for proposal to pass. Default value: + 0.5. + veto_threshold: + type: string + format: byte + description: |- + Minimum value of Veto votes to Total votes ratio for proposal to be + vetoed. Default value: 1/3. + description: TallyParams defines the params for tallying votes on governance proposals. + cosmos.gov.v1beta1.TallyResult: + type: object + properties: + 'yes': + type: string + abstain: + type: string + 'no': + type: string + no_with_veto: + type: string + description: TallyResult defines a standard tally for a governance proposal. + cosmos.gov.v1beta1.Vote: + type: object + properties: + proposal_id: + type: string + format: uint64 + voter: + type: string + option: + description: >- + Deprecated: Prefer to use `options` instead. This field is set in + queries + + if and only if `len(options) == 1` and that option has weight 1. In + all + + other cases, this field will default to VOTE_OPTION_UNSPECIFIED. + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + options: + type: array + items: + type: object + properties: + option: + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + description: >- + VoteOption enumerates the valid vote options for a given + governance proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + weight: + type: string + description: |- + WeightedVoteOption defines a unit of vote for vote split. + + Since: cosmos-sdk 0.43 + title: 'Since: cosmos-sdk 0.43' + description: |- + Vote defines a vote on a governance proposal. + A Vote consists of a proposal ID, the voter, and the vote option. + cosmos.gov.v1beta1.VoteOption: + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + description: >- + VoteOption enumerates the valid vote options for a given governance + proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + cosmos.gov.v1beta1.VotingParams: + type: object + properties: + voting_period: + type: string + description: Length of the voting period. + description: VotingParams defines the params for voting on governance proposals. + cosmos.gov.v1beta1.WeightedVoteOption: + type: object + properties: + option: + type: string + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + default: VOTE_OPTION_UNSPECIFIED + description: >- + VoteOption enumerates the valid vote options for a given governance + proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + weight: + type: string + description: |- + WeightedVoteOption defines a unit of vote for vote split. + + Since: cosmos-sdk 0.43 + cosmos.mint.v1beta1.Params: + type: object + properties: + mint_denom: + type: string + title: type of coin to mint + inflation_rate_change: + type: string + title: maximum annual change in inflation rate + inflation_max: + type: string + title: maximum inflation rate + inflation_min: + type: string + title: minimum inflation rate + goal_bonded: + type: string + title: goal of percent bonded atoms + blocks_per_year: + type: string + format: uint64 + title: expected blocks per year + description: Params holds parameters for the mint module. + cosmos.mint.v1beta1.QueryAnnualProvisionsResponse: + type: object + properties: + annual_provisions: + type: string + format: byte + description: annual_provisions is the current minting annual provisions value. + description: |- + QueryAnnualProvisionsResponse is the response type for the + Query/AnnualProvisions RPC method. + cosmos.mint.v1beta1.QueryInflationResponse: + type: object + properties: + inflation: + type: string + format: byte + description: inflation is the current minting inflation value. + description: |- + QueryInflationResponse is the response type for the Query/Inflation RPC + method. + cosmos.mint.v1beta1.QueryParamsResponse: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + mint_denom: + type: string + title: type of coin to mint + inflation_rate_change: + type: string + title: maximum annual change in inflation rate + inflation_max: + type: string + title: maximum inflation rate + inflation_min: + type: string + title: minimum inflation rate + goal_bonded: + type: string + title: goal of percent bonded atoms + blocks_per_year: + type: string + format: uint64 + title: expected blocks per year + description: QueryParamsResponse is the response type for the Query/Params RPC method. + cosmos.params.v1beta1.ParamChange: + type: object + properties: + subspace: + type: string + key: + type: string + value: + type: string + description: |- + ParamChange defines an individual parameter change, for use in + ParameterChangeProposal. + cosmos.params.v1beta1.QueryParamsResponse: + type: object + properties: + param: + description: param defines the queried parameter. + type: object + properties: + subspace: + type: string + key: + type: string + value: + type: string + description: QueryParamsResponse is response type for the Query/Params RPC method. + cosmos.slashing.v1beta1.MsgUnjailResponse: + type: object + title: MsgUnjailResponse defines the Msg/Unjail response type + cosmos.slashing.v1beta1.Params: + type: object + properties: + signed_blocks_window: + type: string + format: int64 + min_signed_per_window: + type: string + format: byte + downtime_jail_duration: + type: string + slash_fraction_double_sign: + type: string + format: byte + slash_fraction_downtime: + type: string + format: byte + description: Params represents the parameters used for by the slashing module. + cosmos.slashing.v1beta1.QueryParamsResponse: + type: object + properties: + params: + type: object + properties: + signed_blocks_window: + type: string + format: int64 + min_signed_per_window: + type: string + format: byte + downtime_jail_duration: + type: string + slash_fraction_double_sign: + type: string + format: byte + slash_fraction_downtime: + type: string + format: byte + description: Params represents the parameters used for by the slashing module. + title: QueryParamsResponse is the response type for the Query/Params RPC method + cosmos.slashing.v1beta1.QuerySigningInfoResponse: + type: object + properties: + val_signing_info: + type: object + properties: + address: + type: string + start_height: + type: string + format: int64 + title: Height at which validator was first a candidate OR was unjailed + index_offset: + type: string + format: int64 + description: >- + Index which is incremented each time the validator was a bonded + + in a block and may have signed a precommit or not. This in + conjunction with the + + `SignedBlocksWindow` param determines the index in the + `MissedBlocksBitArray`. + jailed_until: + type: string + format: date-time + description: >- + Timestamp until which the validator is jailed due to liveness + downtime. + tombstoned: + type: boolean + description: >- + Whether or not a validator has been tombstoned (killed out of + validator set). It is set + + once the validator commits an equivocation or for any other + configured misbehiavor. + missed_blocks_counter: + type: string + format: int64 + description: >- + A counter kept to avoid unnecessary array reads. + + Note that `Sum(MissedBlocksBitArray)` always equals + `MissedBlocksCounter`. + description: >- + ValidatorSigningInfo defines a validator's signing info for monitoring + their + + liveness activity. + title: val_signing_info is the signing info of requested val cons address + title: >- + QuerySigningInfoResponse is the response type for the Query/SigningInfo + RPC + + method + cosmos.slashing.v1beta1.QuerySigningInfosResponse: + type: object + properties: + info: + type: array + items: + type: object + properties: + address: + type: string + start_height: + type: string + format: int64 + title: Height at which validator was first a candidate OR was unjailed + index_offset: + type: string + format: int64 + description: >- + Index which is incremented each time the validator was a bonded + + in a block and may have signed a precommit or not. This in + conjunction with the + + `SignedBlocksWindow` param determines the index in the + `MissedBlocksBitArray`. + jailed_until: + type: string + format: date-time + description: >- + Timestamp until which the validator is jailed due to liveness + downtime. + tombstoned: + type: boolean + description: >- + Whether or not a validator has been tombstoned (killed out of + validator set). It is set + + once the validator commits an equivocation or for any other + configured misbehiavor. + missed_blocks_counter: + type: string + format: int64 + description: >- + A counter kept to avoid unnecessary array reads. + + Note that `Sum(MissedBlocksBitArray)` always equals + `MissedBlocksCounter`. + description: >- + ValidatorSigningInfo defines a validator's signing info for + monitoring their + + liveness activity. + title: info is the signing info of all validators + pagination: + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + title: >- + QuerySigningInfosResponse is the response type for the Query/SigningInfos + RPC + + method + cosmos.slashing.v1beta1.ValidatorSigningInfo: + type: object + properties: + address: + type: string + start_height: + type: string + format: int64 + title: Height at which validator was first a candidate OR was unjailed + index_offset: + type: string + format: int64 + description: >- + Index which is incremented each time the validator was a bonded + + in a block and may have signed a precommit or not. This in conjunction + with the + + `SignedBlocksWindow` param determines the index in the + `MissedBlocksBitArray`. + jailed_until: + type: string + format: date-time + description: >- + Timestamp until which the validator is jailed due to liveness + downtime. + tombstoned: + type: boolean + description: >- + Whether or not a validator has been tombstoned (killed out of + validator set). It is set + + once the validator commits an equivocation or for any other configured + misbehiavor. + missed_blocks_counter: + type: string + format: int64 + description: >- + A counter kept to avoid unnecessary array reads. + + Note that `Sum(MissedBlocksBitArray)` always equals + `MissedBlocksCounter`. + description: >- + ValidatorSigningInfo defines a validator's signing info for monitoring + their + + liveness activity. + cosmos.staking.v1beta1.BondStatus: + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + description: |- + BondStatus is the status of a validator. + + - BOND_STATUS_UNSPECIFIED: UNSPECIFIED defines an invalid validator status. + - BOND_STATUS_UNBONDED: UNBONDED defines a validator that is not bonded. + - BOND_STATUS_UNBONDING: UNBONDING defines a validator that is unbonding. + - BOND_STATUS_BONDED: BONDED defines a validator that is bonded. + cosmos.staking.v1beta1.Commission: + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to be used for + creating a validator. + type: object + properties: + rate: + type: string + description: 'rate is the commission rate charged to delegators, as a fraction.' + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which validator can + ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of the + validator commission, as a fraction. + update_time: + type: string + format: date-time + description: update_time is the last time the commission rate was changed. + description: Commission defines commission parameters for a given validator. + cosmos.staking.v1beta1.CommissionRates: + type: object + properties: + rate: + type: string + description: 'rate is the commission rate charged to delegators, as a fraction.' + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which validator can ever + charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of the validator + commission, as a fraction. + description: >- + CommissionRates defines the initial commission rates to be used for + creating + + a validator. + cosmos.staking.v1beta1.Delegation: + type: object + properties: + delegator_address: + type: string + description: delegator_address is the bech32-encoded address of the delegator. + validator_address: + type: string + description: validator_address is the bech32-encoded address of the validator. + shares: + type: string + description: shares define the delegation shares received. + description: |- + Delegation represents the bond with tokens held by an account. It is + owned by one delegator, and is associated with the voting power of one + validator. + cosmos.staking.v1beta1.DelegationResponse: + type: object + properties: + delegation: + type: object + properties: + delegator_address: + type: string + description: delegator_address is the bech32-encoded address of the delegator. + validator_address: + type: string + description: validator_address is the bech32-encoded address of the validator. + shares: + type: string + description: shares define the delegation shares received. + description: |- + Delegation represents the bond with tokens held by an account. It is + owned by one delegator, and is associated with the voting power of one + validator. + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + DelegationResponse is equivalent to Delegation except that it contains a + balance in addition to shares which is more suitable for client responses. + cosmos.staking.v1beta1.Description: + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. UPort or + Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: security_contact defines an optional email for security contact. + details: + type: string + description: details define other optional details. + description: Description defines a validator description. + cosmos.staking.v1beta1.HistoricalInfo: + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block in + the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + valset: + type: array + items: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from bonded + status or not. + status: + description: status is the validator status (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: tokens define the delegated tokens (incl. self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a validator's + delegators. + description: + description: description defines the description terms for the validator. + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. UPort + or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at which this + validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to be + used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, as a + fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of + the validator commission, as a fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared minimum + self delegation. + description: >- + Validator defines a validator, together with the total amount of the + + Validator's bond shares and their exchange rate to coins. Slashing + results in + + a decrease in the exchange rate, allowing correct calculation of + future + + undelegations without iterating over delegators. When coins are + delegated to + + this validator, the validator is credited with a delegation whose + number of + + bond shares is based on the amount of coins delegated divided by the + current + + exchange rate. Voting power can be calculated as total bonded shares + + multiplied by exchange rate. + description: >- + HistoricalInfo contains header and validator information for a given + block. + + It is stored as part of staking module's state, which persists the `n` + most + + recent HistoricalInfo + + (`n` is set by the staking module's `historical_entries` parameter). + cosmos.staking.v1beta1.MsgBeginRedelegateResponse: + type: object + properties: + completion_time: + type: string + format: date-time + description: MsgBeginRedelegateResponse defines the Msg/BeginRedelegate response type. + cosmos.staking.v1beta1.MsgCreateValidatorResponse: + type: object + description: MsgCreateValidatorResponse defines the Msg/CreateValidator response type. + cosmos.staking.v1beta1.MsgDelegateResponse: + type: object + description: MsgDelegateResponse defines the Msg/Delegate response type. + cosmos.staking.v1beta1.MsgEditValidatorResponse: + type: object + description: MsgEditValidatorResponse defines the Msg/EditValidator response type. + cosmos.staking.v1beta1.MsgUndelegateResponse: + type: object + properties: + completion_time: + type: string + format: date-time + description: MsgUndelegateResponse defines the Msg/Undelegate response type. + cosmos.staking.v1beta1.Params: + type: object + properties: + unbonding_time: + type: string + description: unbonding_time is the time duration of unbonding. + max_validators: + type: integer + format: int64 + description: max_validators is the maximum number of validators. + max_entries: + type: integer + format: int64 + description: >- + max_entries is the max entries for either unbonding delegation or + redelegation (per pair/trio). + historical_entries: + type: integer + format: int64 + description: historical_entries is the number of historical entries to persist. + bond_denom: + type: string + description: bond_denom defines the bondable coin denomination. + description: Params defines the parameters for the staking module. + cosmos.staking.v1beta1.Pool: + type: object + properties: + not_bonded_tokens: + type: string + bonded_tokens: + type: string + description: |- + Pool is used for tracking bonded and not-bonded token supply of the bond + denomination. + cosmos.staking.v1beta1.QueryDelegationResponse: + type: object + properties: + delegation_response: + type: object + properties: + delegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + shares: + type: string + description: shares define the delegation shares received. + description: >- + Delegation represents the bond with tokens held by an account. It + is + + owned by one delegator, and is associated with the voting power of + one + + validator. + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: >- + DelegationResponse is equivalent to Delegation except that it contains + a + + balance in addition to shares which is more suitable for client + responses. + description: >- + QueryDelegationResponse is response type for the Query/Delegation RPC + method. + cosmos.staking.v1beta1.QueryDelegatorDelegationsResponse: + type: object + properties: + delegation_responses: + type: array + items: + type: object + properties: + delegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + shares: + type: string + description: shares define the delegation shares received. + description: >- + Delegation represents the bond with tokens held by an account. + It is + + owned by one delegator, and is associated with the voting power + of one + + validator. + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: >- + DelegationResponse is equivalent to Delegation except that it + contains a + + balance in addition to shares which is more suitable for client + responses. + description: delegation_responses defines all the delegations' info of a delegator. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryDelegatorDelegationsResponse is response type for the + Query/DelegatorDelegations RPC method. + cosmos.staking.v1beta1.QueryDelegatorUnbondingDelegationsResponse: + type: object + properties: + unbonding_responses: + type: array + items: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height is the height which the unbonding took + place. + completion_time: + type: string + format: date-time + description: completion_time is the unix time for unbonding completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially scheduled to + receive at completion. + balance: + type: string + description: balance defines the tokens to receive at completion. + description: >- + UnbondingDelegationEntry defines an unbonding object with + relevant metadata. + description: entries are the unbonding delegation entries. + description: >- + UnbondingDelegation stores all of a single delegator's unbonding + bonds + + for a single validator in an time-ordered list. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryUnbondingDelegatorDelegationsResponse is response type for the + Query/UnbondingDelegatorDelegations RPC method. + cosmos.staking.v1beta1.QueryDelegatorValidatorResponse: + type: object + properties: + validator: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's operator; + bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from bonded + status or not. + status: + description: status is the validator status (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: tokens define the delegated tokens (incl. self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a validator's + delegators. + description: + description: description defines the description terms for the validator. + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. UPort or + Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at which this + validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to be + used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, as a + fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of the + validator commission, as a fraction. + update_time: + type: string + format: date-time + description: update_time is the last time the commission rate was changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared minimum self + delegation. + description: >- + Validator defines a validator, together with the total amount of the + + Validator's bond shares and their exchange rate to coins. Slashing + results in + + a decrease in the exchange rate, allowing correct calculation of + future + + undelegations without iterating over delegators. When coins are + delegated to + + this validator, the validator is credited with a delegation whose + number of + + bond shares is based on the amount of coins delegated divided by the + current + + exchange rate. Voting power can be calculated as total bonded shares + + multiplied by exchange rate. + description: |- + QueryDelegatorValidatorResponse response type for the + Query/DelegatorValidator RPC method. + cosmos.staking.v1beta1.QueryDelegatorValidatorsResponse: + type: object + properties: + validators: + type: array + items: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from bonded + status or not. + status: + description: status is the validator status (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: tokens define the delegated tokens (incl. self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a validator's + delegators. + description: + description: description defines the description terms for the validator. + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. UPort + or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at which this + validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to be + used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, as a + fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of + the validator commission, as a fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared minimum + self delegation. + description: >- + Validator defines a validator, together with the total amount of the + + Validator's bond shares and their exchange rate to coins. Slashing + results in + + a decrease in the exchange rate, allowing correct calculation of + future + + undelegations without iterating over delegators. When coins are + delegated to + + this validator, the validator is credited with a delegation whose + number of + + bond shares is based on the amount of coins delegated divided by the + current + + exchange rate. Voting power can be calculated as total bonded shares + + multiplied by exchange rate. + description: validators defines the the validators' info of a delegator. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryDelegatorValidatorsResponse is response type for the + Query/DelegatorValidators RPC method. + cosmos.staking.v1beta1.QueryHistoricalInfoResponse: + type: object + properties: + hist: + description: hist defines the historical info at the given height. + type: object + properties: + header: + type: object + properties: + version: + title: basic block info + type: object + properties: + block: + type: string + format: uint64 + app: + type: string + format: uint64 + description: >- + Consensus captures the consensus rules for processing a block + in the blockchain, + + including all blockchain data structures and the rules of the + application's + + state transition machine. + chain_id: + type: string + height: + type: string + format: int64 + time: + type: string + format: date-time + last_block_id: + title: prev block info + type: object + properties: + hash: + type: string + format: byte + part_set_header: + type: object + properties: + total: + type: integer + format: int64 + hash: + type: string + format: byte + title: PartsetHeader + last_commit_hash: + type: string + format: byte + title: hashes of block data + data_hash: + type: string + format: byte + validators_hash: + type: string + format: byte + title: hashes from the app output from the prev block + next_validators_hash: + type: string + format: byte + consensus_hash: + type: string + format: byte + app_hash: + type: string + format: byte + last_results_hash: + type: string + format: byte + evidence_hash: + type: string + format: byte + title: consensus info + proposer_address: + type: string + format: byte + description: Header defines the structure of a Tendermint block header. + valset: + type: array + items: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from + bonded status or not. + status: + description: status is the validator status (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: tokens define the delegated tokens (incl. self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a + validator's delegators. + description: + description: description defines the description terms for the validator. + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. + UPort or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at which + this validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to + be used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, + as a fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase + of the validator commission, as a fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared minimum + self delegation. + description: >- + Validator defines a validator, together with the total amount of + the + + Validator's bond shares and their exchange rate to coins. + Slashing results in + + a decrease in the exchange rate, allowing correct calculation of + future + + undelegations without iterating over delegators. When coins are + delegated to + + this validator, the validator is credited with a delegation + whose number of + + bond shares is based on the amount of coins delegated divided by + the current + + exchange rate. Voting power can be calculated as total bonded + shares + + multiplied by exchange rate. + description: >- + QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo + RPC + + method. + cosmos.staking.v1beta1.QueryParamsResponse: + type: object + properties: + params: + description: params holds all the parameters of this module. + type: object + properties: + unbonding_time: + type: string + description: unbonding_time is the time duration of unbonding. + max_validators: + type: integer + format: int64 + description: max_validators is the maximum number of validators. + max_entries: + type: integer + format: int64 + description: >- + max_entries is the max entries for either unbonding delegation or + redelegation (per pair/trio). + historical_entries: + type: integer + format: int64 + description: historical_entries is the number of historical entries to persist. + bond_denom: + type: string + description: bond_denom defines the bondable coin denomination. + description: QueryParamsResponse is response type for the Query/Params RPC method. + cosmos.staking.v1beta1.QueryPoolResponse: + type: object + properties: + pool: + description: pool defines the pool info. + type: object + properties: + not_bonded_tokens: + type: string + bonded_tokens: + type: string + description: QueryPoolResponse is response type for the Query/Pool RPC method. + cosmos.staking.v1beta1.QueryRedelegationsResponse: + type: object + properties: + redelegation_responses: + type: array + items: + type: object + properties: + redelegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_src_address: + type: string + description: >- + validator_src_address is the validator redelegation source + operator address. + validator_dst_address: + type: string + description: >- + validator_dst_address is the validator redelegation + destination operator address. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the + redelegation took place. + completion_time: + type: string + format: date-time + description: >- + completion_time defines the unix time for redelegation + completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance when + redelegation started. + shares_dst: + type: string + description: >- + shares_dst is the amount of destination-validator + shares created by redelegation. + description: >- + RedelegationEntry defines a redelegation object with + relevant metadata. + description: entries are the redelegation entries. + description: >- + Redelegation contains the list of a particular delegator's + redelegating bonds + + from a particular source validator to a particular destination + validator. + entries: + type: array + items: + type: object + properties: + redelegation_entry: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the + redelegation took place. + completion_time: + type: string + format: date-time + description: >- + completion_time defines the unix time for redelegation + completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance when + redelegation started. + shares_dst: + type: string + description: >- + shares_dst is the amount of destination-validator + shares created by redelegation. + description: >- + RedelegationEntry defines a redelegation object with + relevant metadata. + balance: + type: string + description: >- + RedelegationEntryResponse is equivalent to a RedelegationEntry + except that it + + contains a balance in addition to shares which is more + suitable for client + + responses. + description: >- + RedelegationResponse is equivalent to a Redelegation except that its + entries + + contain a balance in addition to shares which is more suitable for + client + + responses. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryRedelegationsResponse is response type for the Query/Redelegations + RPC + + method. + cosmos.staking.v1beta1.QueryUnbondingDelegationResponse: + type: object + properties: + unbond: + type: object + properties: + delegator_address: + type: string + description: delegator_address is the bech32-encoded address of the delegator. + validator_address: + type: string + description: validator_address is the bech32-encoded address of the validator. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height is the height which the unbonding took + place. + completion_time: + type: string + format: date-time + description: completion_time is the unix time for unbonding completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially scheduled to + receive at completion. + balance: + type: string + description: balance defines the tokens to receive at completion. + description: >- + UnbondingDelegationEntry defines an unbonding object with + relevant metadata. + description: entries are the unbonding delegation entries. + description: |- + UnbondingDelegation stores all of a single delegator's unbonding bonds + for a single validator in an time-ordered list. + description: |- + QueryDelegationResponse is response type for the Query/UnbondingDelegation + RPC method. + cosmos.staking.v1beta1.QueryValidatorDelegationsResponse: + type: object + properties: + delegation_responses: + type: array + items: + type: object + properties: + delegation: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + shares: + type: string + description: shares define the delegation shares received. + description: >- + Delegation represents the bond with tokens held by an account. + It is + + owned by one delegator, and is associated with the voting power + of one + + validator. + balance: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + description: >- + DelegationResponse is equivalent to Delegation except that it + contains a + + balance in addition to shares which is more suitable for client + responses. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + title: |- + QueryValidatorDelegationsResponse is response type for the + Query/ValidatorDelegations RPC method + cosmos.staking.v1beta1.QueryValidatorResponse: + type: object + properties: + validator: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's operator; + bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from bonded + status or not. + status: + description: status is the validator status (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: tokens define the delegated tokens (incl. self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a validator's + delegators. + description: + description: description defines the description terms for the validator. + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. UPort or + Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at which this + validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to be + used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, as a + fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of the + validator commission, as a fraction. + update_time: + type: string + format: date-time + description: update_time is the last time the commission rate was changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared minimum self + delegation. + description: >- + Validator defines a validator, together with the total amount of the + + Validator's bond shares and their exchange rate to coins. Slashing + results in + + a decrease in the exchange rate, allowing correct calculation of + future + + undelegations without iterating over delegators. When coins are + delegated to + + this validator, the validator is credited with a delegation whose + number of + + bond shares is based on the amount of coins delegated divided by the + current + + exchange rate. Voting power can be calculated as total bonded shares + + multiplied by exchange rate. + title: QueryValidatorResponse is response type for the Query/Validator RPC method + cosmos.staking.v1beta1.QueryValidatorUnbondingDelegationsResponse: + type: object + properties: + unbonding_responses: + type: array + items: + type: object + properties: + delegator_address: + type: string + description: >- + delegator_address is the bech32-encoded address of the + delegator. + validator_address: + type: string + description: >- + validator_address is the bech32-encoded address of the + validator. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height is the height which the unbonding took + place. + completion_time: + type: string + format: date-time + description: completion_time is the unix time for unbonding completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially scheduled to + receive at completion. + balance: + type: string + description: balance defines the tokens to receive at completion. + description: >- + UnbondingDelegationEntry defines an unbonding object with + relevant metadata. + description: entries are the unbonding delegation entries. + description: >- + UnbondingDelegation stores all of a single delegator's unbonding + bonds + + for a single validator in an time-ordered list. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + QueryValidatorUnbondingDelegationsResponse is response type for the + Query/ValidatorUnbondingDelegations RPC method. + cosmos.staking.v1beta1.QueryValidatorsResponse: + type: object + properties: + validators: + type: array + items: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's + operator; bech encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from bonded + status or not. + status: + description: status is the validator status (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: tokens define the delegated tokens (incl. self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a validator's + delegators. + description: + description: description defines the description terms for the validator. + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. UPort + or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: >- + security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at which this + validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the + validator to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to be + used for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, as a + fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which + validator can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of + the validator commission, as a fraction. + update_time: + type: string + format: date-time + description: >- + update_time is the last time the commission rate was + changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared minimum + self delegation. + description: >- + Validator defines a validator, together with the total amount of the + + Validator's bond shares and their exchange rate to coins. Slashing + results in + + a decrease in the exchange rate, allowing correct calculation of + future + + undelegations without iterating over delegators. When coins are + delegated to + + this validator, the validator is credited with a delegation whose + number of + + bond shares is based on the amount of coins delegated divided by the + current + + exchange rate. Voting power can be calculated as total bonded shares + + multiplied by exchange rate. + description: validators contains all the queried validators. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + title: >- + QueryValidatorsResponse is response type for the Query/Validators RPC + method + cosmos.staking.v1beta1.Redelegation: + type: object + properties: + delegator_address: + type: string + description: delegator_address is the bech32-encoded address of the delegator. + validator_src_address: + type: string + description: >- + validator_src_address is the validator redelegation source operator + address. + validator_dst_address: + type: string + description: >- + validator_dst_address is the validator redelegation destination + operator address. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the redelegation took + place. + completion_time: + type: string + format: date-time + description: >- + completion_time defines the unix time for redelegation + completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance when redelegation + started. + shares_dst: + type: string + description: >- + shares_dst is the amount of destination-validator shares created + by redelegation. + description: >- + RedelegationEntry defines a redelegation object with relevant + metadata. + description: entries are the redelegation entries. + description: >- + Redelegation contains the list of a particular delegator's redelegating + bonds + + from a particular source validator to a particular destination validator. + cosmos.staking.v1beta1.RedelegationEntry: + type: object + properties: + creation_height: + type: string + format: int64 + description: creation_height defines the height which the redelegation took place. + completion_time: + type: string + format: date-time + description: completion_time defines the unix time for redelegation completion. + initial_balance: + type: string + description: initial_balance defines the initial balance when redelegation started. + shares_dst: + type: string + description: >- + shares_dst is the amount of destination-validator shares created by + redelegation. + description: RedelegationEntry defines a redelegation object with relevant metadata. + cosmos.staking.v1beta1.RedelegationEntryResponse: + type: object + properties: + redelegation_entry: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the redelegation took + place. + completion_time: + type: string + format: date-time + description: completion_time defines the unix time for redelegation completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance when redelegation + started. + shares_dst: + type: string + description: >- + shares_dst is the amount of destination-validator shares created + by redelegation. + description: >- + RedelegationEntry defines a redelegation object with relevant + metadata. + balance: + type: string + description: >- + RedelegationEntryResponse is equivalent to a RedelegationEntry except that + it + + contains a balance in addition to shares which is more suitable for client + + responses. + cosmos.staking.v1beta1.RedelegationResponse: + type: object + properties: + redelegation: + type: object + properties: + delegator_address: + type: string + description: delegator_address is the bech32-encoded address of the delegator. + validator_src_address: + type: string + description: >- + validator_src_address is the validator redelegation source + operator address. + validator_dst_address: + type: string + description: >- + validator_dst_address is the validator redelegation destination + operator address. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the redelegation + took place. + completion_time: + type: string + format: date-time + description: >- + completion_time defines the unix time for redelegation + completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance when + redelegation started. + shares_dst: + type: string + description: >- + shares_dst is the amount of destination-validator shares + created by redelegation. + description: >- + RedelegationEntry defines a redelegation object with relevant + metadata. + description: entries are the redelegation entries. + description: >- + Redelegation contains the list of a particular delegator's + redelegating bonds + + from a particular source validator to a particular destination + validator. + entries: + type: array + items: + type: object + properties: + redelegation_entry: + type: object + properties: + creation_height: + type: string + format: int64 + description: >- + creation_height defines the height which the redelegation + took place. + completion_time: + type: string + format: date-time + description: >- + completion_time defines the unix time for redelegation + completion. + initial_balance: + type: string + description: >- + initial_balance defines the initial balance when + redelegation started. + shares_dst: + type: string + description: >- + shares_dst is the amount of destination-validator shares + created by redelegation. + description: >- + RedelegationEntry defines a redelegation object with relevant + metadata. + balance: + type: string + description: >- + RedelegationEntryResponse is equivalent to a RedelegationEntry + except that it + + contains a balance in addition to shares which is more suitable for + client + + responses. + description: >- + RedelegationResponse is equivalent to a Redelegation except that its + entries + + contain a balance in addition to shares which is more suitable for client + + responses. + cosmos.staking.v1beta1.UnbondingDelegation: + type: object + properties: + delegator_address: + type: string + description: delegator_address is the bech32-encoded address of the delegator. + validator_address: + type: string + description: validator_address is the bech32-encoded address of the validator. + entries: + type: array + items: + type: object + properties: + creation_height: + type: string + format: int64 + description: creation_height is the height which the unbonding took place. + completion_time: + type: string + format: date-time + description: completion_time is the unix time for unbonding completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially scheduled to + receive at completion. + balance: + type: string + description: balance defines the tokens to receive at completion. + description: >- + UnbondingDelegationEntry defines an unbonding object with relevant + metadata. + description: entries are the unbonding delegation entries. + description: |- + UnbondingDelegation stores all of a single delegator's unbonding bonds + for a single validator in an time-ordered list. + cosmos.staking.v1beta1.UnbondingDelegationEntry: + type: object + properties: + creation_height: + type: string + format: int64 + description: creation_height is the height which the unbonding took place. + completion_time: + type: string + format: date-time + description: completion_time is the unix time for unbonding completion. + initial_balance: + type: string + description: >- + initial_balance defines the tokens initially scheduled to receive at + completion. + balance: + type: string + description: balance defines the tokens to receive at completion. + description: >- + UnbondingDelegationEntry defines an unbonding object with relevant + metadata. + cosmos.staking.v1beta1.Validator: + type: object + properties: + operator_address: + type: string + description: >- + operator_address defines the address of the validator's operator; bech + encoded in JSON. + consensus_pubkey: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + jailed: + type: boolean + description: >- + jailed defined whether the validator has been jailed from bonded + status or not. + status: + description: status is the validator status (bonded/unbonding/unbonded). + type: string + enum: + - BOND_STATUS_UNSPECIFIED + - BOND_STATUS_UNBONDED + - BOND_STATUS_UNBONDING + - BOND_STATUS_BONDED + default: BOND_STATUS_UNSPECIFIED + tokens: + type: string + description: tokens define the delegated tokens (incl. self-delegation). + delegator_shares: + type: string + description: >- + delegator_shares defines total shares issued to a validator's + delegators. + description: + description: description defines the description terms for the validator. + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: >- + identity defines an optional identity signature (ex. UPort or + Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: security_contact defines an optional email for security contact. + details: + type: string + description: details define other optional details. + unbonding_height: + type: string + format: int64 + description: >- + unbonding_height defines, if unbonding, the height at which this + validator has begun unbonding. + unbonding_time: + type: string + format: date-time + description: >- + unbonding_time defines, if unbonding, the min time for the validator + to complete unbonding. + commission: + description: commission defines the commission parameters. + type: object + properties: + commission_rates: + description: >- + commission_rates defines the initial commission rates to be used + for creating a validator. + type: object + properties: + rate: + type: string + description: >- + rate is the commission rate charged to delegators, as a + fraction. + max_rate: + type: string + description: >- + max_rate defines the maximum commission rate which validator + can ever charge, as a fraction. + max_change_rate: + type: string + description: >- + max_change_rate defines the maximum daily increase of the + validator commission, as a fraction. + update_time: + type: string + format: date-time + description: update_time is the last time the commission rate was changed. + min_self_delegation: + type: string + description: >- + min_self_delegation is the validator's self declared minimum self + delegation. + description: >- + Validator defines a validator, together with the total amount of the + + Validator's bond shares and their exchange rate to coins. Slashing results + in + + a decrease in the exchange rate, allowing correct calculation of future + + undelegations without iterating over delegators. When coins are delegated + to + + this validator, the validator is credited with a delegation whose number + of + + bond shares is based on the amount of coins delegated divided by the + current + + exchange rate. Voting power can be calculated as total bonded shares + + multiplied by exchange rate. + cosmos.base.abci.v1beta1.ABCIMessageLog: + type: object + properties: + msg_index: + type: integer + format: int64 + log: + type: string + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + description: >- + Attribute defines an attribute wrapper where the key and value + are + + strings instead of raw bytes. + description: |- + StringEvent defines en Event object wrapper where all the attributes + contain key/value pairs that are strings instead of raw bytes. + description: |- + Events contains a slice of Event objects that were emitted during some + execution. + description: >- + ABCIMessageLog defines a structure containing an indexed tx ABCI message + log. + cosmos.base.abci.v1beta1.Attribute: + type: object + properties: + key: + type: string + value: + type: string + description: |- + Attribute defines an attribute wrapper where the key and value are + strings instead of raw bytes. + cosmos.base.abci.v1beta1.GasInfo: + type: object + properties: + gas_wanted: + type: string + format: uint64 + description: GasWanted is the maximum units of work we allow this tx to perform. + gas_used: + type: string + format: uint64 + description: GasUsed is the amount of gas actually consumed. + description: GasInfo defines tx execution gas context. + cosmos.base.abci.v1beta1.Result: + type: object + properties: + data: + type: string + format: byte + description: >- + Data is any data returned from message or handler execution. It MUST + be + + length prefixed in order to separate data from multiple message + executions. + log: + type: string + description: Log contains the log information from message or handler execution. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, associated with an + event. + description: >- + Event allows application developers to attach additional information + to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and + ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events contains a slice of Event objects that were emitted during + message + + or handler execution. + description: Result is the union of ResponseFormat and ResponseCheckTx. + cosmos.base.abci.v1beta1.StringEvent: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + description: |- + Attribute defines an attribute wrapper where the key and value are + strings instead of raw bytes. + description: |- + StringEvent defines en Event object wrapper where all the attributes + contain key/value pairs that are strings instead of raw bytes. + cosmos.base.abci.v1beta1.TxResponse: + type: object + properties: + height: + type: string + format: int64 + title: The block height + txhash: + type: string + description: The transaction hash. + codespace: + type: string + title: Namespace for the Code + code: + type: integer + format: int64 + description: Response code. + data: + type: string + description: 'Result bytes, if any.' + raw_log: + type: string + description: |- + The output of the application's logger (raw string). May be + non-deterministic. + logs: + type: array + items: + type: object + properties: + msg_index: + type: integer + format: int64 + log: + type: string + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + description: >- + Attribute defines an attribute wrapper where the key and + value are + + strings instead of raw bytes. + description: >- + StringEvent defines en Event object wrapper where all the + attributes + + contain key/value pairs that are strings instead of raw bytes. + description: >- + Events contains a slice of Event objects that were emitted + during some + + execution. + description: >- + ABCIMessageLog defines a structure containing an indexed tx ABCI + message log. + description: >- + The output of the application's logger (typed). May be + non-deterministic. + info: + type: string + description: Additional information. May be non-deterministic. + gas_wanted: + type: string + format: int64 + description: Amount of gas requested for transaction. + gas_used: + type: string + format: int64 + description: Amount of gas consumed by transaction. + tx: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + timestamp: + type: string + description: >- + Time of the previous block. For heights > 1, it's the weighted median + of + + the timestamps of the valid votes in the block.LastCommit. For height + == 1, + + it's genesis time. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, associated with an + event. + description: >- + Event allows application developers to attach additional information + to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and + ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events defines all the events emitted by processing a transaction. + Note, + + these events include those emitted by processing all the messages and + those + + emitted from the ante handler. Whereas Logs contains the events, with + + additional metadata, emitted only by processing the messages. + + + Since: cosmos-sdk 0.42.11, 0.44.5, 0.45 + description: >- + TxResponse defines a structure containing relevant tx data and metadata. + The + + tags are stringified and the log is JSON decoded. + cosmos.crypto.multisig.v1beta1.CompactBitArray: + type: object + properties: + extra_bits_stored: + type: integer + format: int64 + elems: + type: string + format: byte + description: |- + CompactBitArray is an implementation of a space efficient bit array. + This is used to ensure that the encoded data takes up a minimal amount of + space after proto encoding. + This is not thread safe, and is not intended for concurrent usage. + cosmos.tx.signing.v1beta1.SignMode: + type: string + enum: + - SIGN_MODE_UNSPECIFIED + - SIGN_MODE_DIRECT + - SIGN_MODE_TEXTUAL + - SIGN_MODE_LEGACY_AMINO_JSON + default: SIGN_MODE_UNSPECIFIED + description: |- + SignMode represents a signing mode with its own security guarantees. + + - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be + rejected + - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is + verified with raw bytes from Tx + - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some + human-readable textual representation on top of the binary representation + from SIGN_MODE_DIRECT + - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses + Amino JSON and will be removed in the future + cosmos.tx.v1beta1.AuthInfo: + type: object + properties: + signer_infos: + type: array + items: + $ref: '#/definitions/cosmos.tx.v1beta1.SignerInfo' + description: >- + signer_infos defines the signing modes for the required signers. The + number + + and order of elements must match the required signers from TxBody's + + messages. The first element is the primary signer and the one which + pays + + the fee. + fee: + description: >- + Fee is the fee and gas limit for the transaction. The first signer is + the + + primary signer and the one which pays the fee. The fee can be + calculated + + based on the cost of evaluating the body and doing signature + verification + + of the signers. This can be estimated via simulation. + type: object + properties: + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + title: amount is the amount of coins to be paid as a fee + gas_limit: + type: string + format: uint64 + title: >- + gas_limit is the maximum gas that can be used in transaction + processing + + before an out of gas error occurs + payer: + type: string + description: >- + if unset, the first signer is responsible for paying the fees. If + set, the specified account must pay the fees. + + the payer must be a tx signer (and thus have signed this field in + AuthInfo). + + setting this field does *not* change the ordering of required + signers for the transaction. + granter: + type: string + title: >- + if set, the fee payer (either the first signer or the value of the + payer field) requests that a fee grant be used + + to pay fees instead of the fee payer's own balance. If an + appropriate fee grant does not exist or the chain does + + not support fee grants, this will fail + description: |- + AuthInfo describes the fee and signer modes that are used to sign a + transaction. + cosmos.tx.v1beta1.BroadcastMode: + type: string + enum: + - BROADCAST_MODE_UNSPECIFIED + - BROADCAST_MODE_BLOCK + - BROADCAST_MODE_SYNC + - BROADCAST_MODE_ASYNC + default: BROADCAST_MODE_UNSPECIFIED + description: >- + BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC + method. + + - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering + - BROADCAST_MODE_BLOCK: BROADCAST_MODE_BLOCK defines a tx broadcasting mode where the client waits for + the tx to be committed in a block. + - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits for + a CheckTx execution response only. + - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client returns + immediately. + cosmos.tx.v1beta1.BroadcastTxRequest: + type: object + properties: + tx_bytes: + type: string + format: byte + description: tx_bytes is the raw transaction. + mode: + type: string + enum: + - BROADCAST_MODE_UNSPECIFIED + - BROADCAST_MODE_BLOCK + - BROADCAST_MODE_SYNC + - BROADCAST_MODE_ASYNC + default: BROADCAST_MODE_UNSPECIFIED + description: >- + BroadcastMode specifies the broadcast mode for the TxService.Broadcast + RPC method. + + - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering + - BROADCAST_MODE_BLOCK: BROADCAST_MODE_BLOCK defines a tx broadcasting mode where the client waits for + the tx to be committed in a block. + - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits for + a CheckTx execution response only. + - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client returns + immediately. + description: |- + BroadcastTxRequest is the request type for the Service.BroadcastTxRequest + RPC method. + cosmos.tx.v1beta1.BroadcastTxResponse: + type: object + properties: + tx_response: + type: object + properties: + height: + type: string + format: int64 + title: The block height + txhash: + type: string + description: The transaction hash. + codespace: + type: string + title: Namespace for the Code + code: + type: integer + format: int64 + description: Response code. + data: + type: string + description: 'Result bytes, if any.' + raw_log: + type: string + description: |- + The output of the application's logger (raw string). May be + non-deterministic. + logs: + type: array + items: + type: object + properties: + msg_index: + type: integer + format: int64 + log: + type: string + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + description: >- + Attribute defines an attribute wrapper where the key + and value are + + strings instead of raw bytes. + description: >- + StringEvent defines en Event object wrapper where all the + attributes + + contain key/value pairs that are strings instead of raw + bytes. + description: >- + Events contains a slice of Event objects that were emitted + during some + + execution. + description: >- + ABCIMessageLog defines a structure containing an indexed tx ABCI + message log. + description: >- + The output of the application's logger (typed). May be + non-deterministic. + info: + type: string + description: Additional information. May be non-deterministic. + gas_wanted: + type: string + format: int64 + description: Amount of gas requested for transaction. + gas_used: + type: string + format: int64 + description: Amount of gas consumed by transaction. + tx: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + timestamp: + type: string + description: >- + Time of the previous block. For heights > 1, it's the weighted + median of + + the timestamps of the valid votes in the block.LastCommit. For + height == 1, + + it's genesis time. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, associated with + an event. + description: >- + Event allows application developers to attach additional + information to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and + ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events defines all the events emitted by processing a transaction. + Note, + + these events include those emitted by processing all the messages + and those + + emitted from the ante handler. Whereas Logs contains the events, + with + + additional metadata, emitted only by processing the messages. + + + Since: cosmos-sdk 0.42.11, 0.44.5, 0.45 + description: >- + TxResponse defines a structure containing relevant tx data and + metadata. The + + tags are stringified and the log is JSON decoded. + description: |- + BroadcastTxResponse is the response type for the + Service.BroadcastTx method. + cosmos.tx.v1beta1.Fee: + type: object + properties: + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + title: amount is the amount of coins to be paid as a fee + gas_limit: + type: string + format: uint64 + title: >- + gas_limit is the maximum gas that can be used in transaction + processing + + before an out of gas error occurs + payer: + type: string + description: >- + if unset, the first signer is responsible for paying the fees. If set, + the specified account must pay the fees. + + the payer must be a tx signer (and thus have signed this field in + AuthInfo). + + setting this field does *not* change the ordering of required signers + for the transaction. + granter: + type: string + title: >- + if set, the fee payer (either the first signer or the value of the + payer field) requests that a fee grant be used + + to pay fees instead of the fee payer's own balance. If an appropriate + fee grant does not exist or the chain does + + not support fee grants, this will fail + description: >- + Fee includes the amount of coins paid in fees and the maximum + + gas to be used by the transaction. The ratio yields an effective + "gasprice", + + which must be above some miminum to be accepted into the mempool. + cosmos.tx.v1beta1.GetTxResponse: + type: object + properties: + tx: + $ref: '#/definitions/cosmos.tx.v1beta1.Tx' + description: tx is the queried transaction. + tx_response: + type: object + properties: + height: + type: string + format: int64 + title: The block height + txhash: + type: string + description: The transaction hash. + codespace: + type: string + title: Namespace for the Code + code: + type: integer + format: int64 + description: Response code. + data: + type: string + description: 'Result bytes, if any.' + raw_log: + type: string + description: |- + The output of the application's logger (raw string). May be + non-deterministic. + logs: + type: array + items: + type: object + properties: + msg_index: + type: integer + format: int64 + log: + type: string + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + description: >- + Attribute defines an attribute wrapper where the key + and value are + + strings instead of raw bytes. + description: >- + StringEvent defines en Event object wrapper where all the + attributes + + contain key/value pairs that are strings instead of raw + bytes. + description: >- + Events contains a slice of Event objects that were emitted + during some + + execution. + description: >- + ABCIMessageLog defines a structure containing an indexed tx ABCI + message log. + description: >- + The output of the application's logger (typed). May be + non-deterministic. + info: + type: string + description: Additional information. May be non-deterministic. + gas_wanted: + type: string + format: int64 + description: Amount of gas requested for transaction. + gas_used: + type: string + format: int64 + description: Amount of gas consumed by transaction. + tx: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + timestamp: + type: string + description: >- + Time of the previous block. For heights > 1, it's the weighted + median of + + the timestamps of the valid votes in the block.LastCommit. For + height == 1, + + it's genesis time. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, associated with + an event. + description: >- + Event allows application developers to attach additional + information to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and + ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events defines all the events emitted by processing a transaction. + Note, + + these events include those emitted by processing all the messages + and those + + emitted from the ante handler. Whereas Logs contains the events, + with + + additional metadata, emitted only by processing the messages. + + + Since: cosmos-sdk 0.42.11, 0.44.5, 0.45 + description: >- + TxResponse defines a structure containing relevant tx data and + metadata. The + + tags are stringified and the log is JSON decoded. + description: GetTxResponse is the response type for the Service.GetTx method. + cosmos.tx.v1beta1.GetTxsEventResponse: + type: object + properties: + txs: + type: array + items: + $ref: '#/definitions/cosmos.tx.v1beta1.Tx' + description: txs is the list of queried transactions. + tx_responses: + type: array + items: + type: object + properties: + height: + type: string + format: int64 + title: The block height + txhash: + type: string + description: The transaction hash. + codespace: + type: string + title: Namespace for the Code + code: + type: integer + format: int64 + description: Response code. + data: + type: string + description: 'Result bytes, if any.' + raw_log: + type: string + description: |- + The output of the application's logger (raw string). May be + non-deterministic. + logs: + type: array + items: + type: object + properties: + msg_index: + type: integer + format: int64 + log: + type: string + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + description: >- + Attribute defines an attribute wrapper where the + key and value are + + strings instead of raw bytes. + description: >- + StringEvent defines en Event object wrapper where all + the attributes + + contain key/value pairs that are strings instead of raw + bytes. + description: >- + Events contains a slice of Event objects that were emitted + during some + + execution. + description: >- + ABCIMessageLog defines a structure containing an indexed tx + ABCI message log. + description: >- + The output of the application's logger (typed). May be + non-deterministic. + info: + type: string + description: Additional information. May be non-deterministic. + gas_wanted: + type: string + format: int64 + description: Amount of gas requested for transaction. + gas_used: + type: string + format: int64 + description: Amount of gas consumed by transaction. + tx: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + timestamp: + type: string + description: >- + Time of the previous block. For heights > 1, it's the weighted + median of + + the timestamps of the valid votes in the block.LastCommit. For + height == 1, + + it's genesis time. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, associated + with an event. + description: >- + Event allows application developers to attach additional + information to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and + ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events defines all the events emitted by processing a + transaction. Note, + + these events include those emitted by processing all the + messages and those + + emitted from the ante handler. Whereas Logs contains the events, + with + + additional metadata, emitted only by processing the messages. + + + Since: cosmos-sdk 0.42.11, 0.44.5, 0.45 + description: >- + TxResponse defines a structure containing relevant tx data and + metadata. The + + tags are stringified and the log is JSON decoded. + description: tx_responses is the list of queried TxResponses. + pagination: + description: pagination defines an pagination for the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + GetTxsEventResponse is the response type for the Service.TxsByEvents + RPC method. + cosmos.tx.v1beta1.ModeInfo: + type: object + properties: + single: + title: single represents a single signer + type: object + properties: + mode: + title: mode is the signing mode of the single signer + type: string + enum: + - SIGN_MODE_UNSPECIFIED + - SIGN_MODE_DIRECT + - SIGN_MODE_TEXTUAL + - SIGN_MODE_LEGACY_AMINO_JSON + default: SIGN_MODE_UNSPECIFIED + description: >- + SignMode represents a signing mode with its own security + guarantees. + + - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be + rejected + - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is + verified with raw bytes from Tx + - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some + human-readable textual representation on top of the binary + representation + + from SIGN_MODE_DIRECT + - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses + Amino JSON and will be removed in the future + multi: + $ref: '#/definitions/cosmos.tx.v1beta1.ModeInfo.Multi' + title: multi represents a nested multisig signer + description: ModeInfo describes the signing mode of a single or nested multisig signer. + cosmos.tx.v1beta1.ModeInfo.Multi: + type: object + properties: + bitarray: + title: bitarray specifies which keys within the multisig are signing + type: object + properties: + extra_bits_stored: + type: integer + format: int64 + elems: + type: string + format: byte + description: >- + CompactBitArray is an implementation of a space efficient bit array. + + This is used to ensure that the encoded data takes up a minimal amount + of + + space after proto encoding. + + This is not thread safe, and is not intended for concurrent usage. + mode_infos: + type: array + items: + $ref: '#/definitions/cosmos.tx.v1beta1.ModeInfo' + title: |- + mode_infos is the corresponding modes of the signers of the multisig + which could include nested multisig public keys + title: Multi is the mode info for a multisig public key + cosmos.tx.v1beta1.ModeInfo.Single: + type: object + properties: + mode: + title: mode is the signing mode of the single signer + type: string + enum: + - SIGN_MODE_UNSPECIFIED + - SIGN_MODE_DIRECT + - SIGN_MODE_TEXTUAL + - SIGN_MODE_LEGACY_AMINO_JSON + default: SIGN_MODE_UNSPECIFIED + description: >- + SignMode represents a signing mode with its own security guarantees. + + - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be + rejected + - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is + verified with raw bytes from Tx + - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some + human-readable textual representation on top of the binary + representation + + from SIGN_MODE_DIRECT + - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses + Amino JSON and will be removed in the future + title: |- + Single is the mode info for a single signer. It is structured as a message + to allow for additional fields such as locale for SIGN_MODE_TEXTUAL in the + future + cosmos.tx.v1beta1.OrderBy: + type: string + enum: + - ORDER_BY_UNSPECIFIED + - ORDER_BY_ASC + - ORDER_BY_DESC + default: ORDER_BY_UNSPECIFIED + description: >- + - ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting + order. OrderBy defaults to ASC in this case. + - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order + - ORDER_BY_DESC: ORDER_BY_DESC defines descending order + title: OrderBy defines the sorting order + cosmos.tx.v1beta1.SignerInfo: + type: object + properties: + public_key: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + mode_info: + $ref: '#/definitions/cosmos.tx.v1beta1.ModeInfo' + title: |- + mode_info describes the signing mode of the signer and is a nested + structure to support nested multisig pubkey's + sequence: + type: string + format: uint64 + description: >- + sequence is the sequence of the account, which describes the + + number of committed transactions signed by a given address. It is used + to + + prevent replay attacks. + description: |- + SignerInfo describes the public key and signing mode of a single top-level + signer. + cosmos.tx.v1beta1.SimulateRequest: + type: object + properties: + tx: + $ref: '#/definitions/cosmos.tx.v1beta1.Tx' + description: |- + tx is the transaction to simulate. + Deprecated. Send raw tx bytes instead. + tx_bytes: + type: string + format: byte + description: |- + tx_bytes is the raw transaction. + + Since: cosmos-sdk 0.43 + description: |- + SimulateRequest is the request type for the Service.Simulate + RPC method. + cosmos.tx.v1beta1.SimulateResponse: + type: object + properties: + gas_info: + description: gas_info is the information about gas used in the simulation. + type: object + properties: + gas_wanted: + type: string + format: uint64 + description: >- + GasWanted is the maximum units of work we allow this tx to + perform. + gas_used: + type: string + format: uint64 + description: GasUsed is the amount of gas actually consumed. + result: + description: result is the result of the simulation. + type: object + properties: + data: + type: string + format: byte + description: >- + Data is any data returned from message or handler execution. It + MUST be + + length prefixed in order to separate data from multiple message + executions. + log: + type: string + description: >- + Log contains the log information from message or handler + execution. + events: + type: array + items: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: >- + EventAttribute is a single key-value pair, associated with + an event. + description: >- + Event allows application developers to attach additional + information to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and + ResponseDeliverTx. + + Later, transactions may be queried using these events. + description: >- + Events contains a slice of Event objects that were emitted during + message + + or handler execution. + description: |- + SimulateResponse is the response type for the + Service.SimulateRPC method. + cosmos.tx.v1beta1.Tx: + type: object + properties: + body: + title: body is the processable content of the transaction + type: object + properties: + messages: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + messages is a list of messages to be executed. The required + signers of + + those messages define the number and order of elements in + AuthInfo's + + signer_infos and Tx's signatures. Each required signer address is + added to + + the list only the first time it occurs. + + By convention, the first required signer (usually from the first + message) + + is referred to as the primary signer and pays the fee for the + whole + + transaction. + memo: + type: string + description: >- + memo is any arbitrary note/comment to be added to the transaction. + + WARNING: in clients, any publicly exposed text should not be + called memo, + + but should be called `note` instead (see + https://github.com/cosmos/cosmos-sdk/issues/9122). + timeout_height: + type: string + format: uint64 + title: |- + timeout is the block height after which this transaction will not + be processed by the chain + extension_options: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: >- + extension_options are arbitrary options that can be added by + chains + + when the default options are not sufficient. If any of these are + present + + and can't be handled, the transaction will be rejected + non_critical_extension_options: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: >- + extension_options are arbitrary options that can be added by + chains + + when the default options are not sufficient. If any of these are + present + + and can't be handled, they will be ignored + description: TxBody is the body of a transaction that all signers sign over. + auth_info: + $ref: '#/definitions/cosmos.tx.v1beta1.AuthInfo' + title: |- + auth_info is the authorization related content of the transaction, + specifically signers, signer modes and fee + signatures: + type: array + items: + type: string + format: byte + description: >- + signatures is a list of signatures that matches the length and order + of + + AuthInfo's signer_infos to allow connecting signature meta information + like + + public key and signing mode by position. + description: Tx is the standard type used for broadcasting transactions. + cosmos.tx.v1beta1.TxBody: + type: object + properties: + messages: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up + a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + messages is a list of messages to be executed. The required signers of + + those messages define the number and order of elements in AuthInfo's + + signer_infos and Tx's signatures. Each required signer address is + added to + + the list only the first time it occurs. + + By convention, the first required signer (usually from the first + message) + + is referred to as the primary signer and pays the fee for the whole + + transaction. + memo: + type: string + description: >- + memo is any arbitrary note/comment to be added to the transaction. + + WARNING: in clients, any publicly exposed text should not be called + memo, + + but should be called `note` instead (see + https://github.com/cosmos/cosmos-sdk/issues/9122). + timeout_height: + type: string + format: uint64 + title: |- + timeout is the block height after which this transaction will not + be processed by the chain + extension_options: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up + a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: >- + extension_options are arbitrary options that can be added by chains + + when the default options are not sufficient. If any of these are + present + + and can't be handled, the transaction will be rejected + non_critical_extension_options: + type: array + items: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up + a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: >- + extension_options are arbitrary options that can be added by chains + + when the default options are not sufficient. If any of these are + present + + and can't be handled, they will be ignored + description: TxBody is the body of a transaction that all signers sign over. + tendermint.abci.Event: + type: object + properties: + type: + type: string + attributes: + type: array + items: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: 'EventAttribute is a single key-value pair, associated with an event.' + description: >- + Event allows application developers to attach additional information to + + ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and + ResponseDeliverTx. + + Later, transactions may be queried using these events. + tendermint.abci.EventAttribute: + type: object + properties: + key: + type: string + format: byte + value: + type: string + format: byte + index: + type: boolean + description: 'EventAttribute is a single key-value pair, associated with an event.' + cosmos.upgrade.v1beta1.ModuleVersion: + type: object + properties: + name: + type: string + title: name of the app module + version: + type: string + format: uint64 + title: consensus version of the app module + description: |- + ModuleVersion specifies a module and its consensus version. + + Since: cosmos-sdk 0.43 + cosmos.upgrade.v1beta1.Plan: + type: object + properties: + name: + type: string + description: >- + Sets the name for the upgrade. This name will be used by the upgraded + + version of the software to apply any special "on-upgrade" commands + during + + the first BeginBlock method after the upgrade is applied. It is also + used + + to detect whether a software version can handle a given upgrade. If no + + upgrade handler with this name has been set in the software, it will + be + + assumed that the software is out-of-date when the upgrade Time or + Height is + + reached and the software will exit. + time: + type: string + format: date-time + description: >- + Deprecated: Time based upgrades have been deprecated. Time based + upgrade logic + + has been removed from the SDK. + + If this field is not empty, an error will be thrown. + height: + type: string + format: int64 + description: |- + The height at which the upgrade must be performed. + Only used if Time is not set. + info: + type: string + title: |- + Any application specific upgrade info to be included on-chain + such as a git commit that validators could automatically upgrade to + upgraded_client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + Plan specifies information about a planned upgrade and when it should + occur. + cosmos.upgrade.v1beta1.QueryAppliedPlanResponse: + type: object + properties: + height: + type: string + format: int64 + description: height is the block height at which the plan was applied. + description: >- + QueryAppliedPlanResponse is the response type for the Query/AppliedPlan + RPC + + method. + cosmos.upgrade.v1beta1.QueryCurrentPlanResponse: + type: object + properties: + plan: + description: plan is the current upgrade plan. + type: object + properties: + name: + type: string + description: >- + Sets the name for the upgrade. This name will be used by the + upgraded + + version of the software to apply any special "on-upgrade" commands + during + + the first BeginBlock method after the upgrade is applied. It is + also used + + to detect whether a software version can handle a given upgrade. + If no + + upgrade handler with this name has been set in the software, it + will be + + assumed that the software is out-of-date when the upgrade Time or + Height is + + reached and the software will exit. + time: + type: string + format: date-time + description: >- + Deprecated: Time based upgrades have been deprecated. Time based + upgrade logic + + has been removed from the SDK. + + If this field is not empty, an error will be thrown. + height: + type: string + format: int64 + description: |- + The height at which the upgrade must be performed. + Only used if Time is not set. + info: + type: string + title: >- + Any application specific upgrade info to be included on-chain + + such as a git commit that validators could automatically upgrade + to + upgraded_client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: >- + QueryCurrentPlanResponse is the response type for the Query/CurrentPlan + RPC + + method. + cosmos.upgrade.v1beta1.QueryModuleVersionsResponse: + type: object + properties: + module_versions: + type: array + items: + type: object + properties: + name: + type: string + title: name of the app module + version: + type: string + format: uint64 + title: consensus version of the app module + description: |- + ModuleVersion specifies a module and its consensus version. + + Since: cosmos-sdk 0.43 + description: >- + module_versions is a list of module names with their consensus + versions. + description: >- + QueryModuleVersionsResponse is the response type for the + Query/ModuleVersions + + RPC method. + + + Since: cosmos-sdk 0.43 + cosmos.upgrade.v1beta1.QueryUpgradedConsensusStateResponse: + type: object + properties: + upgraded_consensus_state: + type: string + format: byte + title: 'Since: cosmos-sdk 0.43' + description: >- + QueryUpgradedConsensusStateResponse is the response type for the + Query/UpgradedConsensusState + + RPC method. + cosmos.vesting.v1beta1.MsgCreateVestingAccountResponse: + type: object + description: >- + MsgCreateVestingAccountResponse defines the Msg/CreateVestingAccount + response type. + ibc.applications.transfer.v1.DenomTrace: + type: object + properties: + path: + type: string + description: >- + path defines the chain of port/channel identifiers used for tracing + the + + source of the fungible token. + base_denom: + type: string + description: base denomination of the relayed fungible token. + description: >- + DenomTrace contains the base denomination for ICS20 fungible tokens and + the + + source tracing information path. + ibc.applications.transfer.v1.MsgTransferResponse: + type: object + description: MsgTransferResponse defines the Msg/Transfer response type. + ibc.applications.transfer.v1.Params: + type: object + properties: + send_enabled: + type: boolean + description: >- + send_enabled enables or disables all cross-chain token transfers from + this + + chain. + receive_enabled: + type: boolean + description: >- + receive_enabled enables or disables all cross-chain token transfers to + this + + chain. + description: >- + Params defines the set of IBC transfer parameters. + + NOTE: To prevent a single token from being transferred, set the + + TransfersEnabled parameter to true and then set the bank module's + SendEnabled + + parameter for the denomination to false. + ibc.applications.transfer.v1.QueryDenomTraceResponse: + type: object + properties: + denom_trace: + type: object + properties: + path: + type: string + description: >- + path defines the chain of port/channel identifiers used for + tracing the + + source of the fungible token. + base_denom: + type: string + description: base denomination of the relayed fungible token. + description: >- + DenomTrace contains the base denomination for ICS20 fungible tokens + and the + + source tracing information path. + description: |- + QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC + method. + ibc.applications.transfer.v1.QueryDenomTracesResponse: + type: object + properties: + denom_traces: + type: array + items: + type: object + properties: + path: + type: string + description: >- + path defines the chain of port/channel identifiers used for + tracing the + + source of the fungible token. + base_denom: + type: string + description: base denomination of the relayed fungible token. + description: >- + DenomTrace contains the base denomination for ICS20 fungible tokens + and the + + source tracing information path. + description: denom_traces returns all denominations trace information. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryConnectionsResponse is the response type for the Query/DenomTraces + RPC + + method. + ibc.applications.transfer.v1.QueryParamsResponse: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + send_enabled: + type: boolean + description: >- + send_enabled enables or disables all cross-chain token transfers + from this + + chain. + receive_enabled: + type: boolean + description: >- + receive_enabled enables or disables all cross-chain token + transfers to this + + chain. + description: QueryParamsResponse is the response type for the Query/Params RPC method. + ibc.core.client.v1.Height: + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + title: >- + Height is a monotonically increasing data type + + that can be compared against another Height for the purposes of updating + and + + freezing clients + ibc.core.channel.v1.Channel: + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other end of the + channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: |- + list of connection identifiers, in order, along which packets sent on + this channel will travel + version: + type: string + title: 'opaque channel version, which is agreed upon during the handshake' + description: |- + Channel defines pipeline for exactly-once packet delivery between specific + modules on separate blockchains, which has at least one end capable of + sending packets and one end capable of receiving packets. + ibc.core.channel.v1.Counterparty: + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other end of the + channel. + channel_id: + type: string + title: channel end on the counterparty chain + title: Counterparty defines a channel end counterparty + ibc.core.channel.v1.IdentifiedChannel: + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other end of the + channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: |- + list of connection identifiers, in order, along which packets sent on + this channel will travel + version: + type: string + title: 'opaque channel version, which is agreed upon during the handshake' + port_id: + type: string + title: port identifier + channel_id: + type: string + title: channel identifier + description: |- + IdentifiedChannel defines a channel with additional port and channel + identifier fields. + ibc.core.channel.v1.MsgAcknowledgementResponse: + type: object + description: MsgAcknowledgementResponse defines the Msg/Acknowledgement response type. + ibc.core.channel.v1.MsgChannelCloseConfirmResponse: + type: object + description: >- + MsgChannelCloseConfirmResponse defines the Msg/ChannelCloseConfirm + response + + type. + ibc.core.channel.v1.MsgChannelCloseInitResponse: + type: object + description: >- + MsgChannelCloseInitResponse defines the Msg/ChannelCloseInit response + type. + ibc.core.channel.v1.MsgChannelOpenAckResponse: + type: object + description: MsgChannelOpenAckResponse defines the Msg/ChannelOpenAck response type. + ibc.core.channel.v1.MsgChannelOpenConfirmResponse: + type: object + description: |- + MsgChannelOpenConfirmResponse defines the Msg/ChannelOpenConfirm response + type. + ibc.core.channel.v1.MsgChannelOpenInitResponse: + type: object + description: MsgChannelOpenInitResponse defines the Msg/ChannelOpenInit response type. + ibc.core.channel.v1.MsgChannelOpenTryResponse: + type: object + description: MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type. + ibc.core.channel.v1.MsgRecvPacketResponse: + type: object + description: MsgRecvPacketResponse defines the Msg/RecvPacket response type. + ibc.core.channel.v1.MsgTimeoutOnCloseResponse: + type: object + description: MsgTimeoutOnCloseResponse defines the Msg/TimeoutOnClose response type. + ibc.core.channel.v1.MsgTimeoutResponse: + type: object + description: MsgTimeoutResponse defines the Msg/Timeout response type. + ibc.core.channel.v1.Order: + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + title: Order defines if a channel is ORDERED or UNORDERED + ibc.core.channel.v1.Packet: + type: object + properties: + sequence: + type: string + format: uint64 + description: >- + number corresponds to the order of sends and receives, where a Packet + + with an earlier sequence number must be sent and received before a + Packet + + with a later sequence number. + source_port: + type: string + description: identifies the port on the sending chain. + source_channel: + type: string + description: identifies the channel end on the sending chain. + destination_port: + type: string + description: identifies the port on the receiving chain. + destination_channel: + type: string + description: identifies the channel end on the receiving chain. + data: + type: string + format: byte + title: actual opaque bytes transferred directly to the application module + timeout_height: + title: block height after which the packet times out + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + timeout_timestamp: + type: string + format: uint64 + title: block timestamp (in nanoseconds) after which the packet times out + title: >- + Packet defines a type that carries data across different chains through + IBC + ibc.core.channel.v1.PacketState: + type: object + properties: + port_id: + type: string + description: channel port identifier. + channel_id: + type: string + description: channel unique identifier. + sequence: + type: string + format: uint64 + description: packet sequence. + data: + type: string + format: byte + description: embedded data that represents packet state. + description: |- + PacketState defines the generic type necessary to retrieve and store + packet commitments, acknowledgements, and receipts. + Caller is responsible for knowing the context necessary to interpret this + state as a commitment, acknowledgement, or a receipt. + ibc.core.channel.v1.QueryChannelClientStateResponse: + type: object + properties: + identified_client_state: + title: client state associated with the channel + type: object + properties: + client_id: + type: string + title: client identifier + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state + description: |- + IdentifiedClientState defines a client state with an additional client + identifier field. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryChannelClientStateResponse is the Response type for the + Query/QueryChannelClientState RPC method + ibc.core.channel.v1.QueryChannelConsensusStateResponse: + type: object + properties: + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: consensus state associated with the channel + client_id: + type: string + title: client ID associated with the consensus state + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryChannelClientStateResponse is the Response type for the + Query/QueryChannelClientState RPC method + ibc.core.channel.v1.QueryChannelResponse: + type: object + properties: + channel: + title: channel associated with the request identifiers + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other end of the + channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: >- + list of connection identifiers, in order, along which packets sent + on + + this channel will travel + version: + type: string + title: 'opaque channel version, which is agreed upon during the handshake' + description: >- + Channel defines pipeline for exactly-once packet delivery between + specific + + modules on separate blockchains, which has at least one end capable of + + sending packets and one end capable of receiving packets. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryChannelResponse is the response type for the Query/Channel RPC + method. + + Besides the Channel end, it includes a proof and the height from which the + + proof was retrieved. + ibc.core.channel.v1.QueryChannelsResponse: + type: object + properties: + channels: + type: array + items: + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other end of + the channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: >- + list of connection identifiers, in order, along which packets + sent on + + this channel will travel + version: + type: string + title: >- + opaque channel version, which is agreed upon during the + handshake + port_id: + type: string + title: port identifier + channel_id: + type: string + title: channel identifier + description: |- + IdentifiedChannel defines a channel with additional port and channel + identifier fields. + description: list of stored channels of the chain. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryChannelsResponse is the response type for the Query/Channels RPC + method. + ibc.core.channel.v1.QueryConnectionChannelsResponse: + type: object + properties: + channels: + type: array + items: + type: object + properties: + state: + title: current state of the channel end + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ordering: + title: whether the channel is ordered or unordered + type: string + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + default: ORDER_NONE_UNSPECIFIED + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: >- + port on the counterparty chain which owns the other end of + the channel. + channel_id: + type: string + title: channel end on the counterparty chain + connection_hops: + type: array + items: + type: string + title: >- + list of connection identifiers, in order, along which packets + sent on + + this channel will travel + version: + type: string + title: >- + opaque channel version, which is agreed upon during the + handshake + port_id: + type: string + title: port identifier + channel_id: + type: string + title: channel identifier + description: |- + IdentifiedChannel defines a channel with additional port and channel + identifier fields. + description: list of channels associated with a connection. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryConnectionChannelsResponse is the Response type for the + Query/QueryConnectionChannels RPC method + ibc.core.channel.v1.QueryNextSequenceReceiveResponse: + type: object + properties: + next_sequence_receive: + type: string + format: uint64 + title: next sequence receive number + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QuerySequenceResponse is the request type for the + Query/QueryNextSequenceReceiveResponse RPC method + ibc.core.channel.v1.QueryPacketAcknowledgementResponse: + type: object + properties: + acknowledgement: + type: string + format: byte + title: packet associated with the request fields + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryPacketAcknowledgementResponse defines the client query response for a + packet which also includes a proof and the height from which the + proof was retrieved + ibc.core.channel.v1.QueryPacketAcknowledgementsResponse: + type: object + properties: + acknowledgements: + type: array + items: + type: object + properties: + port_id: + type: string + description: channel port identifier. + channel_id: + type: string + description: channel unique identifier. + sequence: + type: string + format: uint64 + description: packet sequence. + data: + type: string + format: byte + description: embedded data that represents packet state. + description: >- + PacketState defines the generic type necessary to retrieve and store + + packet commitments, acknowledgements, and receipts. + + Caller is responsible for knowing the context necessary to interpret + this + + state as a commitment, acknowledgement, or a receipt. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryPacketAcknowledgemetsResponse is the request type for the + Query/QueryPacketAcknowledgements RPC method + ibc.core.channel.v1.QueryPacketCommitmentResponse: + type: object + properties: + commitment: + type: string + format: byte + title: packet associated with the request fields + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + QueryPacketCommitmentResponse defines the client query response for a + packet + + which also includes a proof and the height from which the proof was + + retrieved + ibc.core.channel.v1.QueryPacketCommitmentsResponse: + type: object + properties: + commitments: + type: array + items: + type: object + properties: + port_id: + type: string + description: channel port identifier. + channel_id: + type: string + description: channel unique identifier. + sequence: + type: string + format: uint64 + description: packet sequence. + data: + type: string + format: byte + description: embedded data that represents packet state. + description: >- + PacketState defines the generic type necessary to retrieve and store + + packet commitments, acknowledgements, and receipts. + + Caller is responsible for knowing the context necessary to interpret + this + + state as a commitment, acknowledgement, or a receipt. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryPacketCommitmentsResponse is the request type for the + Query/QueryPacketCommitments RPC method + ibc.core.channel.v1.QueryPacketReceiptResponse: + type: object + properties: + received: + type: boolean + title: success flag for if receipt exists + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + QueryPacketReceiptResponse defines the client query response for a packet + + receipt which also includes a proof, and the height from which the proof + was + + retrieved + ibc.core.channel.v1.QueryUnreceivedAcksResponse: + type: object + properties: + sequences: + type: array + items: + type: string + format: uint64 + title: list of unreceived acknowledgement sequences + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryUnreceivedAcksResponse is the response type for the + Query/UnreceivedAcks RPC method + ibc.core.channel.v1.QueryUnreceivedPacketsResponse: + type: object + properties: + sequences: + type: array + items: + type: string + format: uint64 + title: list of unreceived packet sequences + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryUnreceivedPacketsResponse is the response type for the + Query/UnreceivedPacketCommitments RPC method + ibc.core.channel.v1.State: + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + default: STATE_UNINITIALIZED_UNSPECIFIED + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + ibc.core.client.v1.IdentifiedClientState: + type: object + properties: + client_id: + type: string + title: client identifier + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state + description: |- + IdentifiedClientState defines a client state with an additional client + identifier field. + ibc.core.client.v1.ConsensusStateWithHeight: + type: object + properties: + height: + title: consensus state height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: consensus state + description: >- + ConsensusStateWithHeight defines a consensus state with an additional + height + + field. + ibc.core.client.v1.MsgCreateClientResponse: + type: object + description: MsgCreateClientResponse defines the Msg/CreateClient response type. + ibc.core.client.v1.MsgSubmitMisbehaviourResponse: + type: object + description: |- + MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response + type. + ibc.core.client.v1.MsgUpdateClientResponse: + type: object + description: MsgUpdateClientResponse defines the Msg/UpdateClient response type. + ibc.core.client.v1.MsgUpgradeClientResponse: + type: object + description: MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. + ibc.core.client.v1.Params: + type: object + properties: + allowed_clients: + type: array + items: + type: string + description: allowed_clients defines the list of allowed client state types. + description: Params defines the set of IBC light client parameters. + ibc.core.client.v1.QueryClientParamsResponse: + type: object + properties: + params: + description: params defines the parameters of the module. + type: object + properties: + allowed_clients: + type: array + items: + type: string + description: allowed_clients defines the list of allowed client state types. + description: >- + QueryClientParamsResponse is the response type for the Query/ClientParams + RPC + + method. + ibc.core.client.v1.QueryClientStateResponse: + type: object + properties: + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state associated with the request identifier + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryClientStateResponse is the response type for the Query/ClientState + RPC + + method. Besides the client state, it includes a proof and the height from + + which the proof was retrieved. + ibc.core.client.v1.QueryClientStatesResponse: + type: object + properties: + client_states: + type: array + items: + type: object + properties: + client_id: + type: string + title: client identifier + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state + description: >- + IdentifiedClientState defines a client state with an additional + client + + identifier field. + description: list of stored ClientStates of the chain. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + description: >- + QueryClientStatesResponse is the response type for the Query/ClientStates + RPC + + method. + ibc.core.client.v1.QueryClientStatusResponse: + type: object + properties: + status: + type: string + description: >- + QueryClientStatusResponse is the response type for the Query/ClientStatus + RPC + + method. It returns the current status of the IBC client. + ibc.core.client.v1.QueryConsensusStateResponse: + type: object + properties: + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: >- + consensus state associated with the client identifier at the given + height + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + QueryConsensusStateResponse is the response type for the + Query/ConsensusState + + RPC method + ibc.core.client.v1.QueryConsensusStatesResponse: + type: object + properties: + consensus_states: + type: array + items: + type: object + properties: + height: + title: consensus state height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in + the form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default + use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last + '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: consensus state + description: >- + ConsensusStateWithHeight defines a consensus state with an + additional height + + field. + title: consensus states associated with the identifier + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + title: |- + QueryConsensusStatesResponse is the response type for the + Query/ConsensusStates RPC method + ibc.core.client.v1.QueryUpgradedClientStateResponse: + type: object + properties: + upgraded_client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state associated with the request identifier + description: |- + QueryUpgradedClientStateResponse is the response type for the + Query/UpgradedClientState RPC method. + ibc.core.client.v1.QueryUpgradedConsensusStateResponse: + type: object + properties: + upgraded_consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: Consensus state associated with the request identifier + description: |- + QueryUpgradedConsensusStateResponse is the response type for the + Query/UpgradedConsensusState RPC method. + ibc.core.commitment.v1.MerklePrefix: + type: object + properties: + key_prefix: + type: string + format: byte + title: |- + MerklePrefix is merkle path prefixed to the key. + The constructed key from the Path and the key will be append(Path.KeyPath, + append(Path.KeyPrefix, key...)) + ibc.core.connection.v1.ConnectionEnd: + type: object + properties: + client_id: + type: string + description: client associated with this connection. + versions: + type: array + items: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: list of features compatible with the specified identifier + description: >- + Version defines the versioning scheme used to negotiate the IBC + verison in + + the connection handshake. + description: >- + IBC version which can be utilised to determine encodings or protocols + for + + channels or packets utilising this connection. + state: + description: current state of the connection end. + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + default: STATE_UNINITIALIZED_UNSPECIFIED + counterparty: + description: counterparty chain associated with this connection. + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain associated with a + given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty chain associated + with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will be + append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + delay_period: + type: string + format: uint64 + description: >- + delay period that must pass before a consensus state can be used for + + packet-verification NOTE: delay period logic is only implemented by + some + + clients. + description: |- + ConnectionEnd defines a stateful object on a chain connected to another + separate one. + NOTE: there must only be 2 defined ConnectionEnds to establish + a connection between two chains. + ibc.core.connection.v1.Counterparty: + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain associated with a + given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty chain associated + with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will be + append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + description: >- + Counterparty defines the counterparty chain associated with a connection + end. + ibc.core.connection.v1.IdentifiedConnection: + type: object + properties: + id: + type: string + description: connection identifier. + client_id: + type: string + description: client associated with this connection. + versions: + type: array + items: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: list of features compatible with the specified identifier + description: >- + Version defines the versioning scheme used to negotiate the IBC + verison in + + the connection handshake. + title: >- + IBC version which can be utilised to determine encodings or protocols + for + + channels or packets utilising this connection + state: + description: current state of the connection end. + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + default: STATE_UNINITIALIZED_UNSPECIFIED + counterparty: + description: counterparty chain associated with this connection. + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain associated with a + given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty chain associated + with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will be + append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + delay_period: + type: string + format: uint64 + description: delay period associated with this connection. + description: |- + IdentifiedConnection defines a connection with additional connection + identifier field. + ibc.core.connection.v1.MsgConnectionOpenAckResponse: + type: object + description: >- + MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response + type. + ibc.core.connection.v1.MsgConnectionOpenConfirmResponse: + type: object + description: |- + MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm + response type. + ibc.core.connection.v1.MsgConnectionOpenInitResponse: + type: object + description: |- + MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response + type. + ibc.core.connection.v1.MsgConnectionOpenTryResponse: + type: object + description: >- + MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response + type. + ibc.core.connection.v1.QueryClientConnectionsResponse: + type: object + properties: + connection_paths: + type: array + items: + type: string + description: slice of all the connection paths associated with a client. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was generated + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryClientConnectionsResponse is the response type for the + Query/ClientConnections RPC method + ibc.core.connection.v1.QueryConnectionClientStateResponse: + type: object + properties: + identified_client_state: + title: client state associated with the channel + type: object + properties: + client_id: + type: string + title: client identifier + client_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all + types that they + + expect it to use in the context of Any. However, for URLs + which use the + + scheme `http`, `https`, or no scheme, one can optionally set + up a type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on + the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning + with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might + be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message + along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any + type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a + field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: client state + description: |- + IdentifiedClientState defines a client state with an additional client + identifier field. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryConnectionClientStateResponse is the response type for the + Query/ConnectionClientState RPC method + ibc.core.connection.v1.QueryConnectionConsensusStateResponse: + type: object + properties: + consensus_state: + type: object + properties: + '@type': + type: string + description: >- + A URL/resource name that uniquely identifies the type of the + serialized + + protocol buffer message. This string must contain at least + + one "/" character. The last segment of the URL's path must + represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in a + canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary all types + that they + + expect it to use in the context of Any. However, for URLs which + use the + + scheme `http`, `https`, or no scheme, one can optionally set up a + type + + server that maps type URLs to message definitions as follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the + official + + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + `Any` contains an arbitrary serialized protocol buffer message along + with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values in the + form + + of utility functions or additional generated methods of the Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + + 'type.googleapis.com/full.type.name' as the type URL and the unpack + + methods only use the fully qualified type name after the last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield type + + name "y.z". + + + + JSON + + ==== + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with an + + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + + representation, that representation will be embedded adding a field + + `value` which holds the custom JSON in addition to the `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + title: consensus state associated with the channel + client_id: + type: string + title: client ID associated with the consensus state + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: |- + QueryConnectionConsensusStateResponse is the response type for the + Query/ConnectionConsensusState RPC method + ibc.core.connection.v1.QueryConnectionResponse: + type: object + properties: + connection: + title: connection associated with the request identifier + type: object + properties: + client_id: + type: string + description: client associated with this connection. + versions: + type: array + items: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: list of features compatible with the specified identifier + description: >- + Version defines the versioning scheme used to negotiate the IBC + verison in + + the connection handshake. + description: >- + IBC version which can be utilised to determine encodings or + protocols for + + channels or packets utilising this connection. + state: + description: current state of the connection end. + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + default: STATE_UNINITIALIZED_UNSPECIFIED + counterparty: + description: counterparty chain associated with this connection. + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain associated + with a given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty chain + associated with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will be + append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + delay_period: + type: string + format: uint64 + description: >- + delay period that must pass before a consensus state can be used + for + + packet-verification NOTE: delay period logic is only implemented + by some + + clients. + description: >- + ConnectionEnd defines a stateful object on a chain connected to + another + + separate one. + + NOTE: there must only be 2 defined ConnectionEnds to establish + + a connection between two chains. + proof: + type: string + format: byte + title: merkle proof of existence + proof_height: + title: height at which the proof was retrieved + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryConnectionResponse is the response type for the Query/Connection RPC + + method. Besides the connection end, it includes a proof and the height + from + + which the proof was retrieved. + ibc.core.connection.v1.QueryConnectionsResponse: + type: object + properties: + connections: + type: array + items: + type: object + properties: + id: + type: string + description: connection identifier. + client_id: + type: string + description: client associated with this connection. + versions: + type: array + items: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: list of features compatible with the specified identifier + description: >- + Version defines the versioning scheme used to negotiate the + IBC verison in + + the connection handshake. + title: >- + IBC version which can be utilised to determine encodings or + protocols for + + channels or packets utilising this connection + state: + description: current state of the connection end. + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + default: STATE_UNINITIALIZED_UNSPECIFIED + counterparty: + description: counterparty chain associated with this connection. + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain associated + with a given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty chain + associated with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will be + append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + delay_period: + type: string + format: uint64 + description: delay period associated with this connection. + description: |- + IdentifiedConnection defines a connection with additional connection + identifier field. + description: list of stored connections of the chain. + pagination: + title: pagination response + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + height: + title: query block height + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + description: >- + QueryConnectionsResponse is the response type for the Query/Connections + RPC + + method. + ibc.core.connection.v1.State: + type: string + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + default: STATE_UNINITIALIZED_UNSPECIFIED + description: |- + State defines if a connection is in one of the following states: + INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A connection end has just started the opening handshake. + - STATE_TRYOPEN: A connection end has acknowledged the handshake step on the counterparty + chain. + - STATE_OPEN: A connection end has completed the handshake. + ibc.core.connection.v1.Version: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: list of features compatible with the specified identifier + description: |- + Version defines the versioning scheme used to negotiate the IBC verison in + the connection handshake. + shareledger.asset.Asset: + type: object + properties: + creator: + type: string + hash: + type: string + format: byte + UUID: + type: string + status: + type: boolean + rate: + type: string + format: int64 + shareledger.asset.MsgCreateAssetResponse: + type: object + shareledger.asset.MsgDeleteAssetResponse: + type: object + shareledger.asset.MsgUpdateAssetResponse: + type: object + shareledger.asset.QueryAssetByUUIDResponse: + type: object + properties: + asset: + type: object + properties: + creator: + type: string + hash: + type: string + format: byte + UUID: + type: string + status: + type: boolean + rate: + type: string + format: int64 + shareledger.booking.Booking: + type: object + properties: + bookID: + type: string + booker: + type: string + UUID: + type: string + duration: + type: string + format: int64 + isCompleted: + type: boolean + shareledger.booking.MsgCompleteBookingResponse: + type: object + shareledger.booking.MsgCreateBookingResponse: + type: object + shareledger.booking.QueryBookingResponse: + type: object + properties: + booking: + type: object + properties: + bookID: + type: string + booker: + type: string + UUID: + type: string + duration: + type: string + format: int64 + isCompleted: + type: boolean + shareledger.document.Document: + type: object + properties: + holder: + type: string + issuer: + type: string + proof: + type: string + data: + type: string + version: + type: integer + format: int32 + shareledger.document.MsgCreateDocumentResponse: + type: object + shareledger.document.MsgCreateDocumentsResponse: + type: object + shareledger.document.MsgRevokeDocumentResponse: + type: object + shareledger.document.MsgUpdateDocumentResponse: + type: object + shareledger.document.QueryDocumentByHolderIdResponse: + type: object + properties: + documents: + type: array + items: + type: object + properties: + holder: + type: string + issuer: + type: string + proof: + type: string + data: + type: string + version: + type: integer + format: int32 + shareledger.document.QueryDocumentByProofResponse: + type: object + properties: + document: + type: object + properties: + holder: + type: string + issuer: + type: string + proof: + type: string + data: + type: string + version: + type: integer + format: int32 + shareledger.document.QueryDocumentOfHolderByIssuerResponse: + type: object + properties: + documents: + type: array + items: + type: object + properties: + holder: + type: string + issuer: + type: string + proof: + type: string + data: + type: string + version: + type: integer + format: int32 + shareledger.electoral.AccState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.MsgEnrollAccountOperatorsResponse: + type: object + shareledger.electoral.MsgEnrollDocIssuersResponse: + type: object + shareledger.electoral.MsgEnrollIdSignersResponse: + type: object + shareledger.electoral.MsgEnrollLoadersResponse: + type: object + shareledger.electoral.MsgEnrollVoterResponse: + type: object + shareledger.electoral.MsgRevokeAccountOperatorsResponse: + type: object + shareledger.electoral.MsgRevokeDocIssuersResponse: + type: object + shareledger.electoral.MsgRevokeIdSignersResponse: + type: object + shareledger.electoral.MsgRevokeLoadersResponse: + type: object + shareledger.electoral.MsgRevokeVoterResponse: + type: object + shareledger.electoral.QueryAccStateResponse: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryAccStatesResponse: + type: object + properties: + accState: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + pagination: + type: object + properties: + next_key: + type: string + format: byte + title: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + shareledger.electoral.QueryAccountOperatorResponse: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryAccountOperatorsResponse: + type: object + properties: + accStates: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryDocumentIssuerResponse: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryDocumentIssuersResponse: + type: object + properties: + accStates: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryIdSignerResponse: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryIdSignersResponse: + type: object + properties: + accStates: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryLoaderResponse: + type: object + properties: + accState: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryLoadersResponse: + type: object + properties: + loaders: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryVoterResponse: + type: object + properties: + voter: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.electoral.QueryVotersResponse: + type: object + properties: + voters: + type: array + items: + type: object + properties: + key: + type: string + address: + type: string + status: + type: string + shareledger.gentlemint.ActionLevelFee: + type: object + properties: + action: + type: string + level: + type: string + creator: + type: string + shareledger.gentlemint.LevelFeeDetail: + type: object + properties: + level: + type: string + creator: + type: string + originalFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + convertedFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + shareledger.gentlemint.MsgBurnResponse: + type: object + shareledger.gentlemint.MsgBuyShrResponse: + type: object + properties: + log: + type: string + shareledger.gentlemint.MsgDeleteActionLevelFeeResponse: + type: object + shareledger.gentlemint.MsgDeleteLevelFeeResponse: + type: object + shareledger.gentlemint.MsgLoadFeeResponse: + type: object + shareledger.gentlemint.MsgLoadResponse: + type: object + shareledger.gentlemint.MsgSendResponse: + type: object + shareledger.gentlemint.MsgSetActionLevelFeeResponse: + type: object + shareledger.gentlemint.MsgSetExchangeResponse: + type: object + shareledger.gentlemint.MsgSetLevelFeeResponse: + type: object + shareledger.gentlemint.QueryActionLevelFeeResponse: + type: object + properties: + action: + type: string + level: + type: string + fee: + type: string + shareledger.gentlemint.QueryActionLevelFeesResponse: + type: object + properties: + actionLevelFee: + type: array + items: + type: object + properties: + action: + type: string + level: + type: string + creator: + type: string + shareledger.gentlemint.QueryBalancesResponse: + type: object + properties: + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + shareledger.gentlemint.QueryCheckFeesResponse: + type: object + properties: + convertedFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + sufficientFee: + type: boolean + sufficientFundForFee: + type: boolean + costLoadingFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + DecCoin defines a token with a denomination and a decimal amount. + + NOTE: The amount field is an Dec which implements the custom method + signatures required by gogoproto. + shareledger.gentlemint.QueryExchangeRateResponse: + type: object + properties: + rate: + type: string + shareledger.gentlemint.QueryLevelFeeResponse: + type: object + properties: + levelFee: + type: object + properties: + level: + type: string + creator: + type: string + originalFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + convertedFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + shareledger.gentlemint.QueryLevelFeesResponse: + type: object + properties: + levelFees: + type: array + items: + type: object + properties: + level: + type: string + creator: + type: string + originalFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + DecCoin defines a token with a denomination and a decimal + amount. + + + NOTE: The amount field is an Dec which implements the custom + method + + signatures required by gogoproto. + convertedFee: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + shareledger.id.BaseID: + type: object + properties: + issuerAddress: + type: string + backupAddress: + type: string + ownerAddress: + type: string + extraData: + type: string + shareledger.id.Id: + type: object + properties: + id: + type: string + data: + type: object + properties: + issuerAddress: + type: string + backupAddress: + type: string + ownerAddress: + type: string + extraData: + type: string + shareledger.id.MsgCreateIdResponse: + type: object + shareledger.id.MsgCreateIdsResponse: + type: object + shareledger.id.MsgReplaceIdOwnerResponse: + type: object + shareledger.id.MsgUpdateIdResponse: + type: object + shareledger.id.QueryIdByAddressResponse: + type: object + properties: + id: + type: object + properties: + id: + type: string + data: + type: object + properties: + issuerAddress: + type: string + backupAddress: + type: string + ownerAddress: + type: string + extraData: + type: string + shareledger.id.QueryIdByIdResponse: + type: object + properties: + id: + type: object + properties: + id: + type: string + data: + type: object + properties: + issuerAddress: + type: string + backupAddress: + type: string + ownerAddress: + type: string + extraData: + type: string diff --git a/go.mod b/go.mod index 1e9430a3..3caf397b 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,31 @@ module github.com/sharering/shareledger -go 1.15 +go 1.16 require ( - github.com/ShareRing/modules v0.1.1-0.20210419032759-78436d4463dc - github.com/cosmos/cosmos-sdk v0.38.3 - github.com/gorilla/mux v1.7.4 - github.com/spf13/cobra v1.0.0 - github.com/spf13/viper v1.7.0 - github.com/stretchr/testify v1.5.1 - github.com/tendermint/go-amino v0.15.1 - github.com/tendermint/tendermint v0.33.3 - github.com/tendermint/tm-db v0.5.1 + github.com/cosmos/cosmos-sdk v0.44.3 + github.com/cosmos/ibc-go v1.2.2 + github.com/gogo/protobuf v1.3.3 + github.com/golang/protobuf v1.5.2 + github.com/google/go-cmp v0.5.7 // indirect + github.com/google/uuid v1.3.0 + github.com/gorilla/mux v1.8.0 + github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/spf13/cast v1.3.1 + github.com/spf13/cobra v1.2.1 + github.com/spf13/viper v1.8.1 + github.com/stretchr/testify v1.7.0 + github.com/tendermint/spm v0.1.9 + github.com/tendermint/tendermint v0.34.14 + github.com/tendermint/tm-db v0.6.4 + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect + google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e + google.golang.org/grpc v1.45.0 ) +replace ( + github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 + github.com/cosmos/cosmos-sdk => github.com/ShareRing/cosmos-sdk v0.44.6-cli + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + google.golang.org/grpc => google.golang.org/grpc v1.33.2 +) diff --git a/go.sum b/go.sum index 0bdca76b..56062e6f 100644 --- a/go.sum +++ b/go.sum @@ -1,218 +1,431 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/99designs/keyring v1.1.3 h1:mEV3iyZWjkxQ7R8ia8GcG97vCX5zQQ7n4o8R2BylwQY= -github.com/99designs/keyring v1.1.3/go.mod h1:657DQuMrBZRtuL/voxVyiyb6zpMehlm5vLB9Qwrv904= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= +filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200102211924-4bcbc698314f h1:4O1om+UVU+Hfcihr1timk8YNXHxzZWgCo7ofnrZRApw= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200102211924-4bcbc698314f/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ShareRing/modules v0.1.0 h1:o81tM/nqwpVbWgLXOgYaxvgDWco2McsYX6B3iA2m2Oc= -github.com/ShareRing/modules v0.1.0/go.mod h1:2Xj1p/yDkhNjCId+JYWi60Qo/OfleqpVQ9jzd6NiNmI= -github.com/ShareRing/modules v0.1.1-0.20210416082311-79cd7ff56725 h1:59ORvYZMBIZXSwa/h80T0GT8ExYDkQ8HIzwt2CQkCc8= -github.com/ShareRing/modules v0.1.1-0.20210416082311-79cd7ff56725/go.mod h1:qMqIfUanPquMs242gMElAPrs8C3AnHGf/Fa8dwpiaZo= -github.com/ShareRing/modules v0.1.1-0.20210419025427-e04763ce9786 h1:MNBDJ7oVw0sumnb2OEvv+jh7m9Om6fSEARh9oo14rL8= -github.com/ShareRing/modules v0.1.1-0.20210419025427-e04763ce9786/go.mod h1:qMqIfUanPquMs242gMElAPrs8C3AnHGf/Fa8dwpiaZo= -github.com/ShareRing/modules v0.1.1-0.20210419032759-78436d4463dc h1:ZfLA/eP7g26/1xAvzJmW0/IWQvxAa3byfP6BqY2tBGA= -github.com/ShareRing/modules v0.1.1-0.20210419032759-78436d4463dc/go.mod h1:qmnLwK5QGwLjzj1GwZDKwuA/K0JpcaSksW+mnS+z6Mw= +github.com/ShareRing/cosmos-sdk v0.44.6-cli h1:mxHJVhwfGMdBev0RQ6h79hgF1Q2I8mlB3Ujy1B/C9Qc= +github.com/ShareRing/cosmos-sdk v0.44.6-cli/go.mod h1:XXS/asyCqWNWkx2rW6pSuen+EVcpAFxq6khrhnZgHaQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/Workiva/go-datastructures v1.0.52 h1:PLSK6pwn8mYdaoaCZEMsXBpBotr4HHn9abU0yMQt0NI= github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= +github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= +github.com/adlio/schema v1.1.13 h1:LeNMVg5Z1FX+Qgz8tJUijBLRdcpbFUElz+d1489On98= +github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d h1:1aAija9gr0Hyv4KfQcRcwlmFIrhkDmIj2dz5bkg/s/8= -github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d/go.mod h1:icNx/6QdFblhsEjZehARqbNumymUT/ydwlLojFdv7Sk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d h1:xG8Pj6Y6J760xwETNmMzmlt38QSwz0BLp1cZ09g27uw= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= +github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a h1:RQMUrEILyYJEoAT34XS/kLu40vC0+po/UfxrBBA4qZE= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzLaqF2mCNg= +github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= +github.com/confio/ics23/go v0.0.0-20200817220745-f173e6211efb/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/confio/ics23/go v0.6.3/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/confio/ics23/go v0.6.6 h1:pkOy18YxxJ/r0XFDCnrl4Bjv6h4LkBSpLS6F38mrKL8= +github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/cosmos-sdk v0.38.3 h1:qIBTiw+2T9POaSUJ5rvbBbXeq8C8btBlJxnSegPBd3Y= -github.com/cosmos/cosmos-sdk v0.38.3/go.mod h1:rzWOofbKfRt3wxiylmYWEFHnxxGj0coyqgWl2I9obAw= -github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= +github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= +github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/iavl v0.15.0-rc3.0.20201009144442-230e9bdf52cd/go.mod h1:3xOIaNNX19p0QrX0VqWa6voPRoJRGGYtny+DH8NEPvE= +github.com/cosmos/iavl v0.15.0-rc5/go.mod h1:WqoPL9yPTQ85QBMT45OOUzPxG/U/JcJoN7uMjgxke/I= +github.com/cosmos/iavl v0.15.3/go.mod h1:OLjQiAQ4fGD2KDZooyJG9yz+p2ao2IAYSbke8mVvSA4= +github.com/cosmos/iavl v0.17.3 h1:s2N819a2olOmiauVa0WAhoIJq9EhSXE9HDBAoR9k+8Y= +github.com/cosmos/iavl v0.17.3/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w= +github.com/cosmos/ibc-go v1.2.2 h1:bs6TZ8Es1kycIu2AHlRZ9dzJ+mveqlLN/0sjWtRH88o= +github.com/cosmos/ibc-go v1.2.2/go.mod h1:XmYjsRFOs6Q9Cz+CSsX21icNoH27vQKb3squgnCOCbs= +github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= +github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76/go.mod h1:0mkLWIoZuQ7uBoospo5Q9zIpqq6rYCPJDSUdeCJvPM8= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v2 v2.2007.1/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= +github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= +github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a h1:mq+R6XEM6lJX5VlLyZIrUSP8tSuJp82xTK89hvBwJbU= -github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= +github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= +github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 h1:ur2rms48b3Ep1dxh7aUV2FZEQ8jEVO2F6ILKx8ofkAg= +github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f h1:8N8XWLZelZNibkhM1FuF+3Ad3YIbgirjdMiVA0eUkaM= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -220,14 +433,18 @@ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoP github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= @@ -241,73 +458,130 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= +github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= +github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= +github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jhump/protoreflect v1.9.0 h1:npqHz788dryJiR/l6K/RUQAyh2SwV91+d1dnh4RjO9w= +github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -315,16 +589,43 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -333,13 +634,27 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= +github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -347,6 +662,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -355,8 +671,11 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.5.0 h1:Ctq0iGpCmr3jeP77kbF2UxgvRwzWWz+4Bh9/vJTyg1A= -github.com/prometheus/client_golang v1.5.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -369,30 +688,64 @@ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.29.0 h1:3jqPBvKT4OHAbje2Ql7KeaaSicDBCxMYwEJU1zRJceE= +github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rakyll/statik v0.1.6 h1:uICcfUXpgqtw2VopbIncslhAmE5hwc4g20TEyEENBNs= -github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= +github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.23.0 h1:UskrK+saS9P9Y789yNNulYKdARjPZuS35B8gJF2x60g= +github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI916Qo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= +github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= +github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= +github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -401,15 +754,20 @@ github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPH github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M= -github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -417,10 +775,15 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= +github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -431,88 +794,159 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= +github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= -github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= -github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= -github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/iavl v0.13.2 h1:O1m08/Ciy53l9IYmf75uIRVvrNsfjEbre8u/yCu/oqk= -github.com/tendermint/iavl v0.13.2/go.mod h1:vE1u0XAGXYjHykd4BLp8p/yivrw2PF1TuoljBcsQoGA= -github.com/tendermint/tendermint v0.33.2/go.mod h1:25DqB7YvV1tN3tHsjWoc2vFtlwICfrub9XO6UBO+4xk= -github.com/tendermint/tendermint v0.33.3 h1:6lMqjEoCGejCzAghbvfQgmw87snGSqEhDTo/jw+W8CI= -github.com/tendermint/tendermint v0.33.3/go.mod h1:25DqB7YvV1tN3tHsjWoc2vFtlwICfrub9XO6UBO+4xk= -github.com/tendermint/tm-db v0.4.1/go.mod h1:JsJ6qzYkCGiGwm5GHl/H5GLI9XLb6qZX7PRe425dHAY= -github.com/tendermint/tm-db v0.5.0/go.mod h1:lSq7q5WRR/njf1LnhiZ/lIJHk2S8Y1Zyq5oP/3o9C2U= -github.com/tendermint/tm-db v0.5.1 h1:H9HDq8UEA7Eeg13kdYckkgwwkQLBnJGgX4PgLJRhieY= -github.com/tendermint/tm-db v0.5.1/go.mod h1:g92zWjHpCYlEvQXvy9M168Su8V1IBEeawpXVVBaK4f4= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tendermint/spm v0.1.9 h1:O1DJF4evS8wgk5SZqRcO29irNNtKQmTpvQ0xFzUiczI= +github.com/tendermint/spm v0.1.9/go.mod h1:iHgfQ5YOI6ONc9E7ugGQolVdfSMHpeXfZ/OpXuN/42Q= +github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4= +github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg= +github.com/tendermint/tendermint v0.34.0/go.mod h1:Aj3PIipBFSNO21r+Lq3TtzQ+uKESxkbA3yo/INM4QwQ= +github.com/tendermint/tendermint v0.34.13/go.mod h1:6RVVRBqwtKhA+H59APKumO+B7Nye4QXSFc6+TYxAxCI= +github.com/tendermint/tendermint v0.34.14 h1:GCXmlS8Bqd2Ix3TQCpwYLUNHe+Y+QyJsm5YE+S/FkPo= +github.com/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= +github.com/tendermint/tm-db v0.6.2/go.mod h1:GYtQ67SUvATOcoY8/+x6ylk8Qo02BQyLrAs+yAcLvGI= +github.com/tendermint/tm-db v0.6.3/go.mod h1:lfA1dL9/Y/Y8wwyPp2NMLyn5P5Ptr/gvDFNWtrCWSf8= +github.com/tendermint/tm-db v0.6.4 h1:3N2jlnYQkXNQclQwd/eKV/NzlqPlfK21cpRRIx80XXQ= +github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= +github.com/tidwall/gjson v1.6.7/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/sjson v1.1.4/go.mod h1:wXpKXu8CtDjKAZ+3DrKY5ROCorDFahq8l0tey/Lx1fg= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vmihailenco/msgpack/v5 v5.1.4/go.mod h1:C5gboKD0TJPqWDTVTtrQNfRbiBwHZGo8UTqP/9/XvLI= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -529,25 +963,75 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -555,27 +1039,88 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -593,22 +1138,82 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -619,51 +1224,110 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201111145450-ac7456db90a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e h1:fNKDNuUyC4WH+inqDMpfXDdfvwfYILbsX+oskGZ8hxg= +google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/proto/asset/asset.proto b/proto/asset/asset.proto new file mode 100644 index 00000000..688e6d74 --- /dev/null +++ b/proto/asset/asset.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package shareledger.asset; + +option go_package = "github.com/sharering/shareledger/x/asset/types"; + +message Asset { + string creator = 1; + bytes hash = 2; + string UUID = 3; + bool status = 4; + int64 rate = 5; +} diff --git a/proto/asset/genesis.proto b/proto/asset/genesis.proto new file mode 100644 index 00000000..bc4934cc --- /dev/null +++ b/proto/asset/genesis.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package shareledger.asset; + +// this line is used by starport scaffolding # genesis/proto/import +import "gogoproto/gogo.proto"; +import "asset/asset.proto"; + +option go_package = "github.com/sharering/shareledger/x/asset/types"; + +// GenesisState defines the asset module's genesis state. +message GenesisState { + // this line is used by starport scaffolding # genesis/proto/state + repeated Asset assets = 1 [(gogoproto.nullable) = true]; +} diff --git a/proto/asset/query.proto b/proto/asset/query.proto new file mode 100644 index 00000000..bb8e0d16 --- /dev/null +++ b/proto/asset/query.proto @@ -0,0 +1,33 @@ +syntax = "proto3"; +package shareledger.asset; + +import "gogoproto/gogo.proto"; +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "asset/asset.proto"; +// this line is used by starport scaffolding # 1 + +option go_package = "github.com/sharering/shareledger/x/asset/types"; + +// Query defines the gRPC querier service. +service Query { + // Queries a list of assetByUUID items. + rpc AssetByUUID(QueryAssetByUUIDRequest) returns (QueryAssetByUUIDResponse) { + option (google.api.http).get = "/shareledger/asset/{uuid}"; + } + +// this line is used by starport scaffolding # 2 +} + +message QueryAssetByUUIDRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string uuid = 1; +} + +message QueryAssetByUUIDResponse { + Asset asset = 1; +} + +// this line is used by starport scaffolding # 3 diff --git a/proto/asset/tx.proto b/proto/asset/tx.proto new file mode 100644 index 00000000..4a17e795 --- /dev/null +++ b/proto/asset/tx.proto @@ -0,0 +1,46 @@ +syntax = "proto3"; +package shareledger.asset; + +// this line is used by starport scaffolding # proto/tx/import + +option go_package = "github.com/sharering/shareledger/x/asset/types"; + +// Msg defines the Msg service. +service Msg { + rpc CreateAsset(MsgCreateAsset) returns (MsgCreateAssetResponse); + rpc UpdateAsset(MsgUpdateAsset) returns (MsgUpdateAssetResponse); + rpc DeleteAsset(MsgDeleteAsset) returns (MsgDeleteAssetResponse); +// this line is used by starport scaffolding # proto/tx/rpc +} + +message MsgCreateAsset { + string creator = 1; + bytes hash = 2; + string UUID = 3; + bool status = 4; + int64 rate = 5; +} + +message MsgCreateAssetResponse { +} + +message MsgUpdateAsset { + string creator = 1; + bytes hash = 2; + string UUID = 3; + bool status = 4; + int64 rate = 5; +} + +message MsgUpdateAssetResponse { +} + +message MsgDeleteAsset { + string owner = 1; + string UUID = 2; +} + +message MsgDeleteAssetResponse { +} + +// this line is used by starport scaffolding # proto/tx/message \ No newline at end of file diff --git a/proto/booking/booking.proto b/proto/booking/booking.proto new file mode 100644 index 00000000..536bf8b8 --- /dev/null +++ b/proto/booking/booking.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package shareledger.booking; + +option go_package = "github.com/sharering/shareledger/x/booking/types"; + +message Booking { + string bookID = 1; + string booker = 2; + string UUID = 3; + int64 duration = 4; + bool isCompleted = 5; +} \ No newline at end of file diff --git a/proto/booking/genesis.proto b/proto/booking/genesis.proto new file mode 100644 index 00000000..3afc51e5 --- /dev/null +++ b/proto/booking/genesis.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package shareledger.booking; + +// this line is used by starport scaffolding # genesis/proto/import +import "gogoproto/gogo.proto"; +import "booking/booking.proto"; + +option go_package = "github.com/sharering/shareledger/x/booking/types"; + +// GenesisState defines the booking module's genesis state. +message GenesisState { + // this line is used by starport scaffolding # genesis/proto/state + repeated Booking bookings = 1 [(gogoproto.nullable) = true]; +} diff --git a/proto/booking/query.proto b/proto/booking/query.proto new file mode 100644 index 00000000..0d93d1a9 --- /dev/null +++ b/proto/booking/query.proto @@ -0,0 +1,33 @@ +syntax = "proto3"; +package shareledger.booking; + +import "booking/booking.proto"; +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "gogoproto/gogo.proto"; +// this line is used by starport scaffolding # 1 + +option go_package = "github.com/sharering/shareledger/x/booking/types"; + +// Query defines the gRPC querier service. +service Query { + // Queries a list of booking items. + rpc Booking(QueryBookingRequest) returns (QueryBookingResponse) { + option (google.api.http).get = "/shareledger/booking/{bookID}"; + } + +// this line is used by starport scaffolding # 2 +} + +message QueryBookingRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string bookID = 1; +} + +message QueryBookingResponse { + Booking booking = 1; +} + +// this line is used by starport scaffolding # 3 diff --git a/proto/booking/tx.proto b/proto/booking/tx.proto new file mode 100644 index 00000000..dcd79cad --- /dev/null +++ b/proto/booking/tx.proto @@ -0,0 +1,32 @@ +syntax = "proto3"; +package shareledger.booking; + +// this line is used by starport scaffolding # proto/tx/import + +option go_package = "github.com/sharering/shareledger/x/booking/types"; + +// Msg defines the Msg service. +service Msg { + rpc CreateBooking(MsgCreateBooking) returns (MsgCreateBookingResponse); + rpc CompleteBooking(MsgCompleteBooking) returns (MsgCompleteBookingResponse); +// this line is used by starport scaffolding # proto/tx/rpc +} + +message MsgCreateBooking { + string booker = 1; + string UUID = 2; + int64 duration = 3; +} + +message MsgCreateBookingResponse { +} + +message MsgCompleteBooking { + string booker = 1; + string bookID = 2; +} + +message MsgCompleteBookingResponse { +} + +// this line is used by starport scaffolding # proto/tx/message \ No newline at end of file diff --git a/proto/document/doc_basic_state.proto b/proto/document/doc_basic_state.proto new file mode 100644 index 00000000..8df82f60 --- /dev/null +++ b/proto/document/doc_basic_state.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; +package shareledger.document; + +option go_package = "github.com/sharering/shareledger/x/document/types"; + + +message DocBasicState { + + string holder = 1; + string issuer = 2; +} diff --git a/proto/document/doc_detail_state.proto b/proto/document/doc_detail_state.proto new file mode 100644 index 00000000..c7a26cc3 --- /dev/null +++ b/proto/document/doc_detail_state.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; +package shareledger.document; + +option go_package = "github.com/sharering/shareledger/x/document/types"; + + +message DocDetailState { + + string data = 1; + int32 version = 2; +} diff --git a/proto/document/document.proto b/proto/document/document.proto new file mode 100644 index 00000000..a0a13361 --- /dev/null +++ b/proto/document/document.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; +package shareledger.document; + +option go_package = "github.com/sharering/shareledger/x/document/types"; + + +message Document { + string holder = 1; + string issuer = 2; + string proof = 3; + string data = 4; + int32 version = 5; +} diff --git a/proto/document/genesis.proto b/proto/document/genesis.proto new file mode 100644 index 00000000..05780ac9 --- /dev/null +++ b/proto/document/genesis.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package shareledger.document; + +import "gogoproto/gogo.proto"; +import "document/document.proto"; +// this line is used by starport scaffolding # genesis/proto/import + +option go_package = "github.com/sharering/shareledger/x/document/types"; + +// GenesisState defines the document module's genesis state. +message GenesisState { + // this line is used by starport scaffolding # genesis/proto/state + repeated Document documents = 1 [(gogoproto.nullable) = true]; +} diff --git a/proto/document/query.proto b/proto/document/query.proto new file mode 100644 index 00000000..e4cec0a0 --- /dev/null +++ b/proto/document/query.proto @@ -0,0 +1,66 @@ +syntax = "proto3"; +package shareledger.document; + +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "gogoproto/gogo.proto"; +import "document/document.proto"; +// this line is used by starport scaffolding # 1 + +option go_package = "github.com/sharering/shareledger/x/document/types"; + +// Query defines the gRPC querier service. +service Query { + // Queries a list of documentByProof items. + rpc DocumentByProof(QueryDocumentByProofRequest) returns (QueryDocumentByProofResponse) { + option (google.api.http).get = "/shareledger/document/proof/{proof}"; + } + +// Queries a list of documentByHolderId items. + rpc DocumentByHolderId(QueryDocumentByHolderIdRequest) returns (QueryDocumentByHolderIdResponse) { + option (google.api.http).get = "/shareledger/document/{id}"; + } + +// Queries a list of documentOfHolderByIssuer items. + rpc DocumentOfHolderByIssuer(QueryDocumentOfHolderByIssuerRequest) returns (QueryDocumentOfHolderByIssuerResponse) { + option (google.api.http).get = "/shareledger/document/{holder}/{issuer}"; + } + +// this line is used by starport scaffolding # 2 +} + +message QueryDocumentByProofRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string proof = 1; +} + +message QueryDocumentByProofResponse { + Document document = 1; +} + +message QueryDocumentByHolderIdRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string id = 1; +} + +message QueryDocumentByHolderIdResponse { + repeated Document documents = 1; +} + +message QueryDocumentOfHolderByIssuerRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string holder = 1; + string issuer = 2; +} + +message QueryDocumentOfHolderByIssuerResponse { + repeated Document documents = 1; +} + +// this line is used by starport scaffolding # 3 diff --git a/proto/document/tx.proto b/proto/document/tx.proto new file mode 100644 index 00000000..928d881b --- /dev/null +++ b/proto/document/tx.proto @@ -0,0 +1,56 @@ +syntax = "proto3"; +package shareledger.document; + +// this line is used by starport scaffolding # proto/tx/import + +option go_package = "github.com/sharering/shareledger/x/document/types"; + +// Msg defines the Msg service. +service Msg { + rpc CreateDocument(MsgCreateDocument) returns (MsgCreateDocumentResponse); + rpc CreateDocuments(MsgCreateDocuments) returns (MsgCreateDocumentsResponse); + rpc RevokeDocument(MsgRevokeDocument) returns (MsgRevokeDocumentResponse); + rpc UpdateDocument(MsgUpdateDocument) returns (MsgUpdateDocumentResponse); +// this line is used by starport scaffolding # proto/tx/rpc +} + +message MsgCreateDocument { + string data = 1; + string holder = 2; + string issuer = 3; + string proof = 4; +} + +message MsgCreateDocumentResponse { +} + +message MsgCreateDocuments { + repeated string data = 1; + repeated string holder = 2; + string issuer = 3; + repeated string proof = 4; +} + +message MsgCreateDocumentsResponse { +} + +message MsgRevokeDocument { + string holder = 1; + string issuer = 2; + string proof = 3; +} + +message MsgRevokeDocumentResponse { +} + +message MsgUpdateDocument { + string data = 1; + string holder = 2; + string issuer = 3; + string proof = 4; +} + +message MsgUpdateDocumentResponse { +} + +// this line is used by starport scaffolding # proto/tx/message \ No newline at end of file diff --git a/proto/electoral/acc_state.proto b/proto/electoral/acc_state.proto new file mode 100644 index 00000000..55ad1c1e --- /dev/null +++ b/proto/electoral/acc_state.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; +package shareledger.electoral; + +option go_package = "github.com/sharering/shareledger/x/electoral/types"; + + + +message AccState { + string key = 1; + string address = 2; + string status = 3; +} + diff --git a/proto/electoral/authority.proto b/proto/electoral/authority.proto new file mode 100644 index 00000000..853676cd --- /dev/null +++ b/proto/electoral/authority.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package shareledger.electoral; + +option go_package = "github.com/sharering/shareledger/x/electoral/types"; + +import "gogoproto/gogo.proto"; + + +message Authority { + string address = 1; + +} diff --git a/proto/electoral/genesis.proto b/proto/electoral/genesis.proto new file mode 100644 index 00000000..0dc27a3f --- /dev/null +++ b/proto/electoral/genesis.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; +package shareledger.electoral; + +import "electoral/acc_state.proto"; +import "electoral/authority.proto"; +import "electoral/treasurer.proto"; +// this line is used by starport scaffolding # genesis/proto/import +import "gogoproto/gogo.proto"; + +option go_package = "github.com/sharering/shareledger/x/electoral/types"; + +// GenesisState defines the electoral module's genesis state. +message GenesisState { + repeated AccState accStateList = 1 [(gogoproto.nullable) = false]; + Authority authority = 2; + Treasurer treasurer = 3; + // this line is used by starport scaffolding # genesis/proto/state +} diff --git a/proto/electoral/query.proto b/proto/electoral/query.proto new file mode 100644 index 00000000..30b2a411 --- /dev/null +++ b/proto/electoral/query.proto @@ -0,0 +1,172 @@ +syntax = "proto3"; +package shareledger.electoral; + +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "electoral/acc_state.proto"; +import "electoral/authority.proto"; +import "electoral/treasurer.proto"; +// this line is used by starport scaffolding # 1 +import "gogoproto/gogo.proto"; + +option go_package = "github.com/sharering/shareledger/x/electoral/types"; + +// Query defines the gRPC querier service. +service Query { + // Queries a accState by index. + rpc AccState(QueryAccStateRequest) returns (QueryAccStateResponse) { + option (google.api.http).get = "/shareledger/electoral/accStates/{key}"; + } + + // Queries a list of accState items. + rpc AccStates(QueryAccStatesRequest) returns (QueryAccStatesResponse) { + option (google.api.http).get = "/shareledger/electoral/accStates"; + } + +// Queries a list of Voter items. + rpc Voter(QueryVoterRequest) returns (QueryVoterResponse) { + option (google.api.http).get = "/shareledger/electoral/voters/{address}"; + } + +// Queries a list of Loader items. + rpc Loader(QueryLoaderRequest) returns (QueryLoaderResponse) { + option (google.api.http).get = "/shareledger/electoral/loaders/{address}"; + } + + // Queries a list of idSigner items. + rpc IdSigner(QueryIdSignerRequest) returns (QueryIdSignerResponse) { + option (google.api.http).get = "/shareledger/electoral/idSigners/{address}"; + } + + // Queries a list of idSigners items. + rpc IdSigners(QueryIdSignersRequest) returns (QueryIdSignersResponse) { + option (google.api.http).get = "/shareledger/electoral/idSigners"; + } + + // Queries a list of accountOperator items. + rpc AccountOperator(QueryAccountOperatorRequest) returns (QueryAccountOperatorResponse) { + option (google.api.http).get = "/shareledger/electoral/accountOperators/{address}"; + } + + // Queries a list of accountOperators items. + rpc AccountOperators(QueryAccountOperatorsRequest) returns (QueryAccountOperatorsResponse) { + option (google.api.http).get = "/shareledger/electoral/accountOperators"; + } + + // Queries a list of documentIssuer items. + rpc DocumentIssuer(QueryDocumentIssuerRequest) returns (QueryDocumentIssuerResponse) { + option (google.api.http).get = "/shareledger/electoral/documentIssuers/{address}"; + } + + // Queries a list of documentIssuers items. + rpc DocumentIssuers(QueryDocumentIssuersRequest) returns (QueryDocumentIssuersResponse) { + option (google.api.http).get = "/shareledger/electoral/documentIssuers"; + } + +// Queries a list of Voters items. + rpc Voters(QueryVotersRequest) returns (QueryVotersResponse) { + option (google.api.http).get = "/shareledger/electoral/voters"; + } + +// Queries a list of Loaders items. + rpc Loaders(QueryLoadersRequest) returns (QueryLoadersResponse) { + option (google.api.http).get = "/shareledger/electoral/loaders"; + } + +// this line is used by starport scaffolding # 2 +} + +message QueryAccStateRequest { + string key = 1; + +} + +message QueryAccStateResponse { + AccState accState = 1 [(gogoproto.nullable) = false]; +} + +message QueryAccStatesRequest { + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +message QueryAccStatesResponse { + repeated AccState accState = 1 [(gogoproto.nullable) = false]; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +message QueryVoterRequest { + string address = 1; +} + +message QueryVoterResponse { + AccState voter = 1 [(gogoproto.nullable) = false]; +} + +message QueryLoaderRequest { + string address = 1; +} + +message QueryLoaderResponse { + AccState accState = 1; +} + +message QueryIdSignerRequest { + string address = 1; +} + +message QueryIdSignerResponse { + AccState accState = 1; +} + +message QueryIdSignersRequest { +} + +message QueryIdSignersResponse { + repeated AccState accStates = 1; +} + +message QueryAccountOperatorRequest { + string address = 1; +} + +message QueryAccountOperatorResponse { + AccState accState = 1; +} + +message QueryAccountOperatorsRequest { +} + +message QueryAccountOperatorsResponse { + repeated AccState accStates = 1; +} + +message QueryDocumentIssuerRequest { + string address = 1; +} + +message QueryDocumentIssuerResponse { + AccState accState = 1; +} + +message QueryDocumentIssuersRequest { +} + +message QueryDocumentIssuersResponse { + repeated AccState accStates = 1; +} + +message QueryVotersRequest { +} + +message QueryVotersResponse { + repeated AccState voters = 1; +} + +message QueryLoadersRequest { +} + +message QueryLoadersResponse { + repeated AccState loaders = 1; +} + +// this line is used by starport scaffolding # 3 diff --git a/proto/electoral/treasurer.proto b/proto/electoral/treasurer.proto new file mode 100644 index 00000000..7d7ccca0 --- /dev/null +++ b/proto/electoral/treasurer.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package shareledger.electoral; + +option go_package = "github.com/sharering/shareledger/x/electoral/types"; + +import "gogoproto/gogo.proto"; + + +message Treasurer { + string address = 1; + +} diff --git a/proto/electoral/tx.proto b/proto/electoral/tx.proto new file mode 100644 index 00000000..d6ee20f4 --- /dev/null +++ b/proto/electoral/tx.proto @@ -0,0 +1,104 @@ +syntax = "proto3"; +package shareledger.electoral; + +import "electoral/acc_state.proto"; +// this line is used by starport scaffolding # proto/tx/import + +option go_package = "github.com/sharering/shareledger/x/electoral/types"; + +// Msg defines the Msg service. +service Msg { + rpc EnrollVoter(MsgEnrollVoter) returns (MsgEnrollVoterResponse); + rpc RevokeVoter(MsgRevokeVoter) returns (MsgRevokeVoterResponse); + rpc EnrollLoaders(MsgEnrollLoaders) returns (MsgEnrollLoadersResponse); + rpc RevokeLoaders(MsgRevokeLoaders) returns (MsgRevokeLoadersResponse); + rpc EnrollIdSigners(MsgEnrollIdSigners) returns (MsgEnrollIdSignersResponse); + rpc RevokeIdSigners(MsgRevokeIdSigners) returns (MsgRevokeIdSignersResponse); + rpc EnrollDocIssuers(MsgEnrollDocIssuers) returns (MsgEnrollDocIssuersResponse); + rpc RevokeDocIssuers(MsgRevokeDocIssuers) returns (MsgRevokeDocIssuersResponse); + rpc EnrollAccountOperators(MsgEnrollAccountOperators) returns (MsgEnrollAccountOperatorsResponse); + rpc RevokeAccountOperators(MsgRevokeAccountOperators) returns (MsgRevokeAccountOperatorsResponse); +// this line is used by starport scaffolding # proto/tx/rpc +} + +message MsgEnrollVoter { + string creator = 1; + string address = 2; +} + +message MsgEnrollVoterResponse { +} + +message MsgRevokeVoter { + string creator = 1; + string address = 2; +} + +message MsgRevokeVoterResponse { +} + +message MsgEnrollLoaders { + string creator = 1; + repeated string addresses = 2; +} + +message MsgEnrollLoadersResponse { +} + +message MsgRevokeLoaders { + string creator = 1; + repeated string addresses = 2; +} + +message MsgRevokeLoadersResponse { +} + +message MsgEnrollIdSigners { + string creator = 1; + repeated string addresses = 2; +} + +message MsgEnrollIdSignersResponse { +} + +message MsgRevokeIdSigners { + string creator = 1; + repeated string addresses = 2; +} + +message MsgRevokeIdSignersResponse { +} + +message MsgEnrollDocIssuers { + string creator = 1; + repeated string addresses = 2; +} + +message MsgEnrollDocIssuersResponse { +} + +message MsgRevokeDocIssuers { + string creator = 1; + repeated string addresses = 2; +} + +message MsgRevokeDocIssuersResponse { +} + +message MsgEnrollAccountOperators { + string creator = 1; + repeated string addresses = 2; +} + +message MsgEnrollAccountOperatorsResponse { +} + +message MsgRevokeAccountOperators { + string creator = 1; + repeated string addresses = 2; +} + +message MsgRevokeAccountOperatorsResponse { +} + +// this line is used by starport scaffolding # proto/tx/message \ No newline at end of file diff --git a/proto/gentlemint/action_level_fee.proto b/proto/gentlemint/action_level_fee.proto new file mode 100644 index 00000000..114a2069 --- /dev/null +++ b/proto/gentlemint/action_level_fee.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; +package shareledger.gentlemint; + +option go_package = "github.com/sharering/shareledger/x/gentlemint/types"; + + + +message ActionLevelFee { + string action = 1; + string level = 2; + string creator = 3; +} + diff --git a/proto/gentlemint/exchange_rate.proto b/proto/gentlemint/exchange_rate.proto new file mode 100644 index 00000000..7a8fdd7f --- /dev/null +++ b/proto/gentlemint/exchange_rate.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package shareledger.gentlemint; + +option go_package = "github.com/sharering/shareledger/x/gentlemint/types"; + +import "gogoproto/gogo.proto"; + + +message ExchangeRate { + string rate = 1; + +} diff --git a/proto/gentlemint/genesis.proto b/proto/gentlemint/genesis.proto new file mode 100644 index 00000000..6e07aed1 --- /dev/null +++ b/proto/gentlemint/genesis.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; +package shareledger.gentlemint; + +import "gentlemint/exchange_rate.proto"; +import "gentlemint/level_fee.proto"; +import "gentlemint/action_level_fee.proto"; +// this line is used by starport scaffolding # genesis/proto/import +import "gogoproto/gogo.proto"; + +option go_package = "github.com/sharering/shareledger/x/gentlemint/types"; + +// GenesisState defines the gentlemint module's genesis state. +message GenesisState { + ExchangeRate exchangeRate = 1; + repeated LevelFee levelFeeList = 2 [(gogoproto.nullable) = false]; + repeated ActionLevelFee actionLevelFeeList = 3 [(gogoproto.nullable) = false]; + // this line is used by starport scaffolding # genesis/proto/state +} diff --git a/proto/gentlemint/level_fee.proto b/proto/gentlemint/level_fee.proto new file mode 100644 index 00000000..58060218 --- /dev/null +++ b/proto/gentlemint/level_fee.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; +package shareledger.gentlemint; + +import "cosmos/base/v1beta1/coin.proto"; +import "gogoproto/gogo.proto"; + +option go_package = "github.com/sharering/shareledger/x/gentlemint/types"; + + + +message LevelFee { + string level = 1; + cosmos.base.v1beta1.DecCoin fee = 2 [(gogoproto.nullable) = false]; + string creator = 3; +} + +message LevelFeeDetail { + string level = 1; + string creator = 3; + cosmos.base.v1beta1.DecCoin originalFee = 2 [(gogoproto.nullable) = false]; + cosmos.base.v1beta1.Coin convertedFee = 4; +} \ No newline at end of file diff --git a/proto/gentlemint/query.proto b/proto/gentlemint/query.proto new file mode 100644 index 00000000..f6e44656 --- /dev/null +++ b/proto/gentlemint/query.proto @@ -0,0 +1,117 @@ +syntax = "proto3"; +package shareledger.gentlemint; + +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "gentlemint/exchange_rate.proto"; +import "gentlemint/level_fee.proto"; +import "gentlemint/action_level_fee.proto"; +import "cosmos/base/v1beta1/coin.proto"; +// this line is used by starport scaffolding # 1 +import "gogoproto/gogo.proto"; + + +option go_package = "github.com/sharering/shareledger/x/gentlemint/types"; + +// Query defines the gRPC querier service. +service Query { +// Queries a exchangeRate by index. + rpc ExchangeRate(QueryExchangeRateRequest) returns (QueryExchangeRateResponse) { + option (google.api.http).get = "/shareledger/gentlemint/exchangeRate"; + } + +// Queries a levelFee by index. + rpc LevelFee(QueryLevelFeeRequest) returns (QueryLevelFeeResponse) { + option (google.api.http).get = "/shareledger/gentlemint/levelFee/{level}"; + } + + // Queries a list of levelFee items. + rpc LevelFees(QueryLevelFeesRequest) returns (QueryLevelFeesResponse) { + option (google.api.http).get = "/shareledger/gentlemint/levelFee"; + } + +// Queries a actionLevelFee by index. + rpc ActionLevelFee(QueryActionLevelFeeRequest) returns (QueryActionLevelFeeResponse) { + option (google.api.http).get = "/shareledger/gentlemint/actionLevelFee/{action}"; + } + + // Queries a list of actionLevelFee items. + rpc ActionLevelFees(QueryActionLevelFeesRequest) returns (QueryActionLevelFeesResponse) { + option (google.api.http).get = "/shareledger/gentlemint/actionLevelFee"; + } + +// Queries a list of checkFees items. + rpc CheckFees(QueryCheckFeesRequest) returns (QueryCheckFeesResponse) { + option (google.api.http).get = "/shareledger/gentlemint/checkFees"; + } + +// Queries a list of balances items. + rpc Balances(QueryBalancesRequest) returns (QueryBalancesResponse) { + option (google.api.http).get = "/shareledger/gentlemint/balances"; + } + +// this line is used by starport scaffolding # 2 +} + +message QueryExchangeRateRequest {} + +message QueryExchangeRateResponse { + string rate = 1; +} + +message QueryLevelFeeRequest { + string level = 1; + +} + +message QueryLevelFeeResponse { + LevelFeeDetail levelFee = 1 [(gogoproto.nullable) = false]; +} + +message QueryLevelFeesRequest { +} + +message QueryLevelFeesResponse { + repeated LevelFeeDetail levelFees = 1 [(gogoproto.nullable) = false]; +} + +message QueryActionLevelFeeRequest { + string action = 1; + +} + +message QueryActionLevelFeeResponse { + string action = 1; + string level = 2; + string fee = 3; +} + +message QueryActionLevelFeesRequest { + +} + +message QueryActionLevelFeesResponse { + repeated ActionLevelFee actionLevelFee = 1 [(gogoproto.nullable) = false]; +} + +message QueryCheckFeesRequest { + string address = 1; + repeated string actions = 2; +} + +message QueryCheckFeesResponse { + cosmos.base.v1beta1.Coin convertedFee = 1; + bool sufficientFee = 2; + bool sufficientFundForFee = 3; + cosmos.base.v1beta1.DecCoin costLoadingFee = 4; +} + +message QueryBalancesRequest { + string address = 1; +} + +message QueryBalancesResponse { + repeated cosmos.base.v1beta1.DecCoin coins = 1; +} + +// this line is used by starport scaffolding # 3 diff --git a/proto/gentlemint/tx.proto b/proto/gentlemint/tx.proto new file mode 100644 index 00000000..ae4a1aef --- /dev/null +++ b/proto/gentlemint/tx.proto @@ -0,0 +1,111 @@ +syntax = "proto3"; +package shareledger.gentlemint; + +import "gentlemint/level_fee.proto"; +import "gentlemint/action_level_fee.proto"; +import "gogoproto/gogo.proto"; +// this line is used by starport scaffolding # proto/tx/import +import "cosmos/base/v1beta1/coin.proto"; + +option go_package = "github.com/sharering/shareledger/x/gentlemint/types"; + +// Msg defines the Msg service. +service Msg { + rpc BuyShr(MsgBuyShr) returns (MsgBuyShrResponse); + rpc SetExchange(MsgSetExchange) returns (MsgSetExchangeResponse); + rpc SetLevelFee(MsgSetLevelFee) returns (MsgSetLevelFeeResponse); + rpc DeleteLevelFee(MsgDeleteLevelFee) returns (MsgDeleteLevelFeeResponse); + rpc SetActionLevelFee(MsgSetActionLevelFee) returns (MsgSetActionLevelFeeResponse); + rpc DeleteActionLevelFee(MsgDeleteActionLevelFee) returns (MsgDeleteActionLevelFeeResponse); + rpc LoadFee(MsgLoadFee) returns (MsgLoadFeeResponse); + rpc Load(MsgLoad) returns (MsgLoadResponse); + rpc Send(MsgSend) returns (MsgSendResponse); + rpc Burn(MsgBurn) returns (MsgBurnResponse); +// this line is used by starport scaffolding # proto/tx/rpc +} + +message MsgBuyShr { + string creator = 1; + string amount = 2; +} + +message MsgBuyShrResponse { + string log = 1; +} + + +message MsgSetExchange { + string creator = 1; + string rate = 2; +} + +message MsgSetExchangeResponse { +} + +message MsgSetLevelFee { + string creator = 1; + string level = 2; + + cosmos.base.v1beta1.DecCoin fee = 3 + [(gogoproto.nullable) = false]; +} +message MsgSetLevelFeeResponse {} + +message MsgDeleteLevelFee { + string creator = 1; + string level = 2; +} +message MsgDeleteLevelFeeResponse {} + +message MsgSetActionLevelFee { + string creator = 1; + string action = 2; + + string level = 3; +} +message MsgSetActionLevelFeeResponse {} + +message MsgDeleteActionLevelFee { + string creator = 1; + string action = 2; +} +message MsgDeleteActionLevelFeeResponse {} + +message MsgLoadFee { + string creator = 1; + cosmos.base.v1beta1.DecCoin shrp = 2; +} + +message MsgLoadFeeResponse { +} + +message MsgLoad { + string creator = 1; + string address = 2; + repeated cosmos.base.v1beta1.DecCoin coins = 3 + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"]; +} + +message MsgLoadResponse { +} + +message MsgSend { + string creator = 1; + string address = 2; + repeated cosmos.base.v1beta1.DecCoin coins = 3 + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"]; +} + +message MsgSendResponse { +} + +message MsgBurn { + string creator = 1; + repeated cosmos.base.v1beta1.DecCoin coins = 2 + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"]; +} + +message MsgBurnResponse { +} + +// this line is used by starport scaffolding # proto/tx/message \ No newline at end of file diff --git a/proto/id/base_id.proto b/proto/id/base_id.proto new file mode 100644 index 00000000..4df0c6c4 --- /dev/null +++ b/proto/id/base_id.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; +package shareledger.id; + +option go_package = "github.com/sharering/shareledger/x/id/types"; + + +message BaseID { + + string issuerAddress = 1; + string backupAddress = 2; + string ownerAddress = 3; + string extraData = 4; +} \ No newline at end of file diff --git a/proto/id/genesis.proto b/proto/id/genesis.proto new file mode 100644 index 00000000..02a9a08f --- /dev/null +++ b/proto/id/genesis.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package shareledger.id; + +// this line is used by starport scaffolding # genesis/proto/import +import "gogoproto/gogo.proto"; +import "id/id.proto"; + +option go_package = "github.com/sharering/shareledger/x/id/types"; + +// GenesisState defines the id module's genesis state. +message GenesisState { + // this line is used by starport scaffolding # genesis/proto/state + repeated Id IDs = 1 [(gogoproto.nullable) = true]; +} diff --git a/proto/id/id.proto b/proto/id/id.proto new file mode 100644 index 00000000..9f762250 --- /dev/null +++ b/proto/id/id.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; +package shareledger.id; + +import "id/base_id.proto"; + +option go_package = "github.com/sharering/shareledger/x/id/types"; + + +message Id { + + string id = 1; + BaseID data = 2; +} diff --git a/proto/id/query.proto b/proto/id/query.proto new file mode 100644 index 00000000..1ffeaada --- /dev/null +++ b/proto/id/query.proto @@ -0,0 +1,49 @@ +syntax = "proto3"; +package shareledger.id; + +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "gogoproto/gogo.proto"; +import "id/id.proto"; +// this line is used by starport scaffolding # 1 + +option go_package = "github.com/sharering/shareledger/x/id/types"; + +// Query defines the gRPC querier service. +service Query { + // Queries a list of idByAddress items. + rpc IdByAddress(QueryIdByAddressRequest) returns (QueryIdByAddressResponse) { + option (google.api.http).get = "/shareledger/id/address/{address}"; + } + +// Queries a list of idById items. + rpc IdById(QueryIdByIdRequest) returns (QueryIdByIdResponse) { + option (google.api.http).get = "/shareledger/id/id/{id}"; + } + +// this line is used by starport scaffolding # 2 +} + +message QueryIdByAddressRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string address = 1; +} + +message QueryIdByAddressResponse { + Id id = 1; +} + +message QueryIdByIdRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string id = 1; +} + +message QueryIdByIdResponse { + Id id = 1; +} + +// this line is used by starport scaffolding # 3 diff --git a/proto/id/tx.proto b/proto/id/tx.proto new file mode 100644 index 00000000..c3cf35d3 --- /dev/null +++ b/proto/id/tx.proto @@ -0,0 +1,57 @@ +syntax = "proto3"; +package shareledger.id; + +// this line is used by starport scaffolding # proto/tx/import + +option go_package = "github.com/sharering/shareledger/x/id/types"; + +// Msg defines the Msg service. +service Msg { + rpc CreateId(MsgCreateId) returns (MsgCreateIdResponse); + rpc CreateIds(MsgCreateIds) returns (MsgCreateIdsResponse); + rpc UpdateId(MsgUpdateId) returns (MsgUpdateIdResponse); + rpc ReplaceIdOwner(MsgReplaceIdOwner) returns (MsgReplaceIdOwnerResponse); +// this line is used by starport scaffolding # proto/tx/rpc +} + +message MsgCreateId { + string issuerAddress = 1; + string backupAddress = 2; + string extraData = 3; + string id = 4; + string ownerAddress = 5; +} + +message MsgCreateIdResponse { +} + +message MsgCreateIds { + string issuerAddress = 1; + repeated string backupAddress = 2; + repeated string extraData = 3; + repeated string id = 4; + repeated string ownerAddress = 5; +} + +message MsgCreateIdsResponse { +} + +message MsgUpdateId { + string issuerAddress = 1; + string id = 2; + string extraData = 3; +} + +message MsgUpdateIdResponse { +} + +message MsgReplaceIdOwner { + string backupAddress = 1; + string id = 2; + string ownerAddress = 3; +} + +message MsgReplaceIdOwnerResponse { +} + +// this line is used by starport scaffolding # proto/tx/message \ No newline at end of file diff --git a/testnet/docker/Makefile b/testnet/docker/Makefile deleted file mode 100644 index 9509ddff..00000000 --- a/testnet/docker/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -all: mynode rest-server - -mynode: - docker build --tag shareledger/mynode shareledgernode - -rest-server: - docker build --tag shareledger/rest-server rest-server - -.PHONY: all rest-server mynode - diff --git a/testnet/docker/rest-server/Dockerfile b/testnet/docker/rest-server/Dockerfile deleted file mode 100644 index 81b4d0fd..00000000 --- a/testnet/docker/rest-server/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM alpine:3.7 - -RUN apk update && \ - apk upgrade && \ - apk --no-cache add curl jq file - -VOLUME /shareledger -WORKDIR /shareledger -EXPOSE 1317 -ENTRYPOINT ["/usr/bin/wrapper.sh"] -CMD ["rest-server"] -STOPSIGNAL SIGTERM - -COPY wrapper.sh /usr/bin/wrapper.sh - diff --git a/testnet/docker/rest-server/wrapper.sh b/testnet/docker/rest-server/wrapper.sh deleted file mode 100755 index b0d12eb8..00000000 --- a/testnet/docker/rest-server/wrapper.sh +++ /dev/null @@ -1,21 +0,0 @@ -BINARY=/shareledger/${BINARY:-slcli} -NODE=${NODE:-http://192.168.10.2:80} - -## -## Assert linux binary -## -if ! [ -f "${BINARY}" ]; then - echo "The binary $(basename "${BINARY}") cannot be found. Please add the binary to the shared folder. Please use the BINARY environment variable if the name of the binary is not 'slcli' E.g.: -e BINARY=slcli_my_test_version" - exit 1 -fi -BINARY_CHECK="$(file "$BINARY" | grep 'ELF 64-bit LSB executable, x86-64')" -if [ -z "${BINARY_CHECK}" ]; then - echo "Binary needs to be OS linux, ARCH amd64" - exit 1 -fi - -echo "Connecting to node ${NODE}" -"$BINARY" "$@" --node "$NODE" --trust-node --laddr tcp://0.0.0.0:1317 - -chmod 777 -R /shareledger - diff --git a/testnet/docker/shareledgernode/Dockerfile b/testnet/docker/shareledgernode/Dockerfile deleted file mode 100644 index 963e1ad5..00000000 --- a/testnet/docker/shareledgernode/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu:18.04 - -RUN apt-get update && \ - apt-get -y upgrade && \ - apt-get -y install curl wget jq file build-essential libsnappy-dev && \ - wget https://github.com/google/leveldb/archive/v1.20.tar.gz && \ - tar -zxvf v1.20.tar.gz && \ - cd leveldb-1.20/ && \ - make && \ - cp -r out-static/lib* out-shared/lib* /usr/local/lib/ && \ - cd include/ && \ - cp -r leveldb /usr/local/include/ && \ - ldconfig && \ - rm -f v1.20.tar.gz - -WORKDIR /shareledger -EXPOSE 26656 26657 -ENTRYPOINT ["/usr/bin/wrapper.sh"] -CMD ["start"] -STOPSIGNAL SIGTERM - -COPY wrapper.sh /usr/bin/wrapper.sh - diff --git a/testnet/docker/shareledgernode/wrapper.sh b/testnet/docker/shareledgernode/wrapper.sh deleted file mode 100755 index 775769ec..00000000 --- a/testnet/docker/shareledgernode/wrapper.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env sh - -BINARY=/shareledger/${BINARY:-shareledger} -ID=${ID:-0} -LOG=${LOG:-shareledger.log} - -## -## Assert linux binary -## -if ! [ -f "${BINARY}" ]; then - echo "The binary $(basename "${BINARY}") cannot be found. Please add the binary to the shared folder. Please use the BINARY environment variable if the name of the binary is not 'shareledger' E.g.: -e BINARY=shareledger_my_test_version" - exit 1 -fi -BINARY_CHECK="$(file "$BINARY" | grep 'ELF 64-bit LSB executable, x86-64')" -if [ -z "${BINARY_CHECK}" ]; then - echo "Binary needs to be OS linux, ARCH amd64" - exit 1 -fi - -## -## Run binary with all parameters -## -export NSDHOME="/shareledger/node${ID}/shareledger" - -if [ -d "`dirname ${NSDHOME}/${LOG}`" ]; then - "$BINARY" --home "$NSDHOME" "$@" | tee "${NSDHOME}/${LOG}" -else - "$BINARY" --home "$NSDHOME" "$@" -fi - -chmod 777 -R /shareledger diff --git a/testnet/main.go b/testnet/main.go deleted file mode 100644 index d441f215..00000000 --- a/testnet/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -func main() { - buildBinaries() - createTestnet() - // dockerComposeUp() -} diff --git a/testnet/testnet.go b/testnet/testnet.go deleted file mode 100644 index 9e65662b..00000000 --- a/testnet/testnet.go +++ /dev/null @@ -1,112 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "io" - "os" - "os/exec" - "strings" -) - -const ( - WorkDir = "./build/" - KeyRing = "os" - NSD = WorkDir + "shareledger" - NSCLI = WorkDir + "slcli" - chainID = "SHR-VoyagerNet" -) - -var ( - makePath string = "/usr/bin/make" - dockerComposePath = "/usr/local/bin/docker-compose" - output io.Writer = os.Stdout -) - -func buildBinaries() error { - _, err := execCmdAndWait(makePath, "clean", "build", "build-docker") - if err != nil { - fmt.Println("Build failed. error: ", err) - } - return err -} - -func dockerComposeUp() error { - return execCmd(dockerComposePath, []string{"up"}) -} - -func dockerComposeDown() error { - return execCmd(dockerComposePath, []string{"down"}) -} - -func createTestnet() error { - _, err := execCmdAndWait(NSD, "testnet", chainID, "-o", WorkDir, "--keyring-backend", KeyRing) - if err != nil { - return err - } - return nil -} - -func execCmd(name string, arguments []string) error { - cmd := exec.Command(name, arguments...) - err := writeoutput(cmd, nil) - if err != nil { - return err - } - return cmd.Start() -} - -func execCmdAndWait(name string, arguments ...string) (string, error) { - cmd := exec.Command(name, arguments...) - - var output strings.Builder - - captureOutput := func(s string) { - output.WriteString(s) - output.WriteRune('\n') - } - err := writeoutput(cmd, captureOutput) - - if err != nil { - return "", err - } - - err = cmd.Start() - if err != nil { - return "", err - } - - err = cmd.Wait() - if err != nil { - return "", err - } - - return output.String(), nil -} - -func writeoutput(cmd *exec.Cmd, captureOutput func(string)) error { - stderrReader, err := cmd.StderrPipe() - if err != nil { - return err - } - - stdoutReader, err := cmd.StdoutPipe() - if err != nil { - return err - } - - go outputHandler("stderr", stderrReader, captureOutput) - go outputHandler("stdout", stdoutReader, captureOutput) - return nil -} - -func outputHandler(prefix string, reader io.Reader, captureOutput func(string)) { - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - s := scanner.Text() - fmt.Fprintf(output, "%s | %s\n", prefix, s) - if captureOutput != nil { - captureOutput(s) - } - } -} diff --git a/tests/README.md b/tests/README.md deleted file mode 100644 index 75db0e9b..00000000 --- a/tests/README.md +++ /dev/null @@ -1 +0,0 @@ -This is based on the gaia integration test \ No newline at end of file diff --git a/tests/document_test.go b/tests/document_test.go deleted file mode 100644 index 6ebf0698..00000000 --- a/tests/document_test.go +++ /dev/null @@ -1,650 +0,0 @@ -package tests - -import ( - "fmt" - "testing" - - "github.com/ShareRing/modules/document" - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestDocCreate_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - doc := f.QueryDocByProof(proof) - require.NotNil(t, doc) - require.Equal(t, proof, doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, data, doc.Data) - - f.Cleanup() -} - -func TestDocCreate_Duplicate(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - doc := f.QueryDocByProof(proof) - require.NotNil(t, doc) - require.Equal(t, proof, doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, data, doc.Data) - - ok, stdOut, _ := f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes ", issuer.String())) - - require.True(t, ok) - require.Contains(t, stdOut, document.ErrDocExisted.Error()) - - f.Cleanup() -} - -func TestDocCreateInBatch_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderIds := []string{"id-001", "id-002", "id-003"} - proofs := []string{"a89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "b89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8"} - datas := []string{"extradata-001", "extradata-002", "extradata-003"} - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - ok, stdOut, stdErr := f.CreateNewDocInBatch(holderIds, proofs, datas, fmt.Sprintf("--from %s --yes ", issuer.String())) - fmt.Println(stdOut) - fmt.Println(stdErr) - - require.True(t, ok) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - for i := 0; i < len(holderIds); i++ { - doc := f.QueryDocByProof(proofs[i]) - require.NotNil(t, doc) - require.Equal(t, proofs[i], doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, datas[i], doc.Data) - require.Equal(t, holderIds[i], doc.Holder) - - } - - f.Cleanup() -} - -func TestDocCreateInBatch_Duplicate(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderIds := []string{"id-001", "id-002", "id-003"} - proofs := []string{"a89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "b89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8"} - datas := []string{"extradata-001", "extradata-002", "extradata-003"} - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderIds[2], proofs[2], "test2222", fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - ok, stdOut, _ := f.CreateNewDocInBatch(holderIds, proofs, datas, fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, ok) - require.Contains(t, stdOut, document.ErrDocExisted.Error()) - - f.Cleanup() -} - -func TestDocCreateInBatch_LowFee(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderIds := []string{"id-001", "id-002", "id-003"} - proofs := []string{"a89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "b89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8"} - datas := []string{"extradata-001", "extradata-002", "extradata-003"} - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - ok, stdOut, _ := f.CreateNewDocInBatch(holderIds, proofs, datas, fmt.Sprintf("--from %s --yes --fees 290000000shr", issuer.String())) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, ok) - require.Contains(t, stdOut, "required: 3000000000shr") - - f.Cleanup() -} - -func TestDocUpdate_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - doc := f.QueryDocByProof(proof) - require.NotNil(t, doc) - require.Equal(t, proof, doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, data, doc.Data) - - newData := "new-data" - ok, _, _ := f.UdpateDoc(holderId, proof, newData, fmt.Sprintf("--from %s --yes ", issuer.String())) - - require.True(t, ok) - - docUpdated := f.QueryDocByProof(proof) - require.NotNil(t, docUpdated) - require.Equal(t, proof, docUpdated.Proof) - require.Equal(t, issuer.String(), docUpdated.Issuer.String()) - require.Equal(t, newData, docUpdated.Data) - require.Equal(t, doc.Version+1, docUpdated.Version) - - f.Cleanup() -} - -func TestDocUpdate_LowFee(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - doc := f.QueryDocByProof(proof) - require.NotNil(t, doc) - require.Equal(t, proof, doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, data, doc.Data) - - newData := "new-data" - - ok, stdOut, _ := f.UdpateDoc(holderId, proof, newData, fmt.Sprintf("--from %s --yes --fees=10shr", issuer.String())) - - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, ok) - require.Contains(t, stdOut, "required: 600000000shr") - - f.Cleanup() -} - -func TestDocUpdate_NotExist_Holder(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - doc := f.QueryDocByProof(proof) - require.NotNil(t, doc) - require.Equal(t, proof, doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, data, doc.Data) - - newData := "new-data" - ok, stdOut, _ := f.UdpateDoc(holderId+"1", proof, newData, fmt.Sprintf("--from %s --yes ", issuer.String())) - require.Contains(t, stdOut, document.ErrDocNotExisted.Error()) - - require.True(t, ok) - - docUpdated := f.QueryDocByProof(proof) - require.NotNil(t, docUpdated) - require.Equal(t, proof, docUpdated.Proof) - require.Equal(t, issuer.String(), docUpdated.Issuer.String()) - require.Equal(t, data, docUpdated.Data) - require.Equal(t, doc.Version, docUpdated.Version) - - f.Cleanup() -} - -func TestDocUpdate_NotExist_Proof(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - doc := f.QueryDocByProof(proof) - require.NotNil(t, doc) - require.Equal(t, proof, doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, data, doc.Data) - - newData := "new-data" - ok, stdOut, _ := f.UdpateDoc(holderId, proof+"1", newData, fmt.Sprintf("--from %s --yes ", issuer.String())) - require.Contains(t, stdOut, document.ErrDocNotExisted.Error()) - - require.True(t, ok) - - docUpdated := f.QueryDocByProof(proof) - require.NotNil(t, docUpdated) - require.Equal(t, proof, docUpdated.Proof) - require.Equal(t, issuer.String(), docUpdated.Issuer.String()) - require.Equal(t, data, docUpdated.Data) - require.Equal(t, doc.Version, docUpdated.Version) - - f.Cleanup() -} - -func TestDocUpdate_NotExist_Issuer(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - docIssuer := f.KeyAddress(keyDocIssuer) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - // user1 := f.KeyAddress(keyUser1) - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer, docIssuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes ", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - doc := f.QueryDocByProof(proof) - require.NotNil(t, doc) - require.Equal(t, proof, doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, data, doc.Data) - - newData := "new-data" - ok, stdOut, _ := f.UdpateDoc(holderId, proof, newData, fmt.Sprintf("--from %s --yes ", docIssuer.String())) - require.Contains(t, stdOut, document.ErrDocNotExisted.Error()) - - require.True(t, ok) - - docUpdated := f.QueryDocByProof(proof) - require.NotNil(t, docUpdated) - require.Equal(t, proof, docUpdated.Proof) - require.Equal(t, issuer.String(), docUpdated.Issuer.String()) - require.Equal(t, data, docUpdated.Data) - require.Equal(t, doc.Version, docUpdated.Version) - - f.Cleanup() -} - -func TestDocRevoke_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderIds := []string{"id-001", "id-002", "id-003"} - proofs := []string{"a89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "b89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8"} - datas := []string{"extradata-001", "extradata-002", "extradata-003"} - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - ok, _, _ := f.CreateNewDocInBatch(holderIds, proofs, datas, fmt.Sprintf("--from %s --yes ", issuer.String())) - - require.True(t, ok) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - revokeRs, _, _ := f.RevokeDoc(holderIds[2], proofs[2], fmt.Sprintf("--from %s --yes ", issuer.String())) - - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, revokeRs) - for i := 0; i < len(holderIds)-1; i++ { - doc := f.QueryDocByProof(proofs[i]) - require.NotNil(t, doc) - require.Equal(t, proofs[i], doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, datas[i], doc.Data) - require.Equal(t, holderIds[i], doc.Holder) - require.Equal(t, uint16(0), doc.Version) - } - - docRevoked := f.QueryDocByProof(proofs[2]) - require.NotNil(t, docRevoked) - require.Equal(t, proofs[2], docRevoked.Proof) - require.Equal(t, issuer.String(), docRevoked.Issuer.String()) - require.Equal(t, datas[2], docRevoked.Data) - require.Equal(t, holderIds[2], docRevoked.Holder) - require.Equal(t, uint16(document.DocRevokeFlag), docRevoked.Version) - - f.Cleanup() -} - -func TestDocRevoke_LowFee(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderIds := []string{"id-001", "id-002", "id-003"} - proofs := []string{"a89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "b89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8"} - datas := []string{"extradata-001", "extradata-002", "extradata-003"} - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - ok, _, _ := f.CreateNewDocInBatch(holderIds, proofs, datas, fmt.Sprintf("--from %s --yes ", issuer.String())) - - require.True(t, ok) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - ok, stdOut, _ := f.RevokeDoc(holderIds[2], proofs[2], fmt.Sprintf("--from %s --yes --fees 10shr", issuer.String())) - - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, ok) - require.Contains(t, stdOut, "required: 1000000000shr") - - f.Cleanup() -} - -func TestDocRevoke_NotExist(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderIds := []string{"id-001", "id-002", "id-003"} - proofs := []string{"a89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "b89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8"} - datas := []string{"extradata-001", "extradata-002", "extradata-003"} - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accountOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - ok, _, _ := f.CreateNewDocInBatch(holderIds, proofs, datas, fmt.Sprintf("--from %s --yes ", issuer.String())) - - require.True(t, ok) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - revokeRs, stdOut, _ := f.RevokeDoc(holderIds[2], "not-exist", fmt.Sprintf("--from %s --yes ", issuer.String())) - - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, revokeRs) - require.Contains(t, stdOut, document.ErrDocNotExisted.Error()) - - for i := 0; i < len(holderIds)-1; i++ { - doc := f.QueryDocByProof(proofs[i]) - require.NotNil(t, doc) - require.Equal(t, proofs[i], doc.Proof) - require.Equal(t, issuer.String(), doc.Issuer.String()) - require.Equal(t, datas[i], doc.Data) - require.Equal(t, holderIds[i], doc.Holder) - require.Equal(t, uint16(0), doc.Version) - } - - f.Cleanup() -} - -func TestDocQuery_ByHolder_OK(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderIds := []string{"id-001", "id-001", "id-003"} - proofs := []string{"a89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "b89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8"} - datas := []string{"extradata-001", "extradata-002", "extradata-003"} - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 10shr", accOperator.String())) - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - ok, stdOut, stdErr := f.CreateNewDocInBatch(holderIds, proofs, datas, fmt.Sprintf("--from %s --yes ", issuer.String())) - fmt.Println(stdOut) - fmt.Println(stdErr) - - require.True(t, ok) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - docOf1 := f.QueryDocByHolder(holderIds[0]) - - fmt.Println(docOf1) - require.Equal(t, 2, len(docOf1)) - - f.Cleanup() -} - -func TestDocCreate_LowFee(t *testing.T) { - - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - holderId := "id-001" - proof := "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6" - data := "extradata-001" - - // Enroll doc issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 100000000shr", accOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - revokeRs, stdOut, _ := f.CreateNewDoc(holderId, proof, data, fmt.Sprintf("--from %s --yes --fees 2shr", issuer.String())) - require.True(t, revokeRs) - require.Contains(t, stdOut, "insufficient fee") - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.Cleanup() -} diff --git a/tests/genesis-v0.0.1.json b/tests/genesis-v0.0.1.json deleted file mode 100644 index 6fdf9414..00000000 --- a/tests/genesis-v0.0.1.json +++ /dev/null @@ -1 +0,0 @@ -{"app_hash":"","app_state":{"asset":{"Assets":[{"Rate":"10","creator":"shareledger1nh2qkcmpc6vte9er89p5d94j4ynndffra9j4r9","hash":"bXloYXNo","status":false,"uuid":"myuuid"},{"Rate":"10","creator":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","hash":"bXloYXNo","status":true,"uuid":"myuuid1"},{"Rate":"10","creator":"shareledger1nh2qkcmpc6vte9er89p5d94j4ynndffra9j4r9","hash":"bXloYXNoMg==","status":false,"uuid":"myuuid2"},{"Rate":"10","creator":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","hash":"bXloYXNo","status":false,"uuid":"myuuid3"},{"Rate":"10","creator":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","hash":"bXloYXNo","status":false,"uuid":"myuuid4"},{"Rate":"10","creator":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","hash":"bXloYXNo","status":false,"uuid":"myuuid5"},{"Rate":"10","creator":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","hash":"bXloYXNo","status":false,"uuid":"myuuid9"}]},"auth":{"accounts":[{"type":"cosmos-sdk/ModuleAccount","value":{"account_number":21,"address":"shareledger1qqws2lzf3zxmjf050wj0pjahtm04y7ynccflxd","coins":[{"amount":"70","denom":"shrp"}],"name":"booking","permissions":null,"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":30,"address":"shareledger1p4lav5ar5tn86yafvwkmzph422q7jk6rxtlznm","coins":[{"amount":"20","denom":"shr"}],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":29,"address":"shareledger1pmm3et7v2nmhg7xsdy4cwknjw3k6mgl8unruww","coins":[{"amount":"20","denom":"shr"}],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":6,"address":"shareledger1z5e9mr292gz82axxpz57p8q0yvt2e06cqa7jus","coins":[{"amount":"85","denom":"cent"},{"amount":"423","denom":"shr"},{"amount":"17","denom":"shrp"}],"public_key":"shareledgerpub1addwnpepqg64p9cgzg9gtppaf74cp9pkm77q2kdce2ewxa5frpya6jj72gqqku0qr3e","sequence":59}},{"type":"cosmos-sdk/Account","value":{"account_number":7,"address":"shareledger1rtxawmftz0mqkc34ffg36mq96ctv9chjxpetex","coins":[{"amount":"100","denom":"shr"}],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":15,"address":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","coins":[{"amount":"612","denom":"cent"},{"amount":"487","denom":"shrp"}],"public_key":"shareledgerpub1addwnpepqfmfhtcv34hvu9tk6dhp6nr38x4geepnd9s6r3a602uu8uw527duuc2546k","sequence":73}},{"type":"cosmos-sdk/Account","value":{"account_number":10,"address":"shareledger19w7khxj5dcxfrukpqztyeq7ejn5fpwtrxs0pyn","coins":[{"amount":"100","denom":"shr"}],"public_key":"shareledgerpub1addwnpepqv7f3xdsm4zc6en76qcx5g3l2gy2w990hf8t4ux3jp329qwx856g64geyqh","sequence":1}},{"type":"cosmos-sdk/Account","value":{"account_number":25,"address":"shareledger1x0k4rlxuflw3srs6sx7vlyhurzzaa5av5cywjy","coins":[{"amount":"18","denom":"shr"}],"public_key":"shareledgerpub1addwnpepqv8m6y6n0n3y3ym04jac9ye77kllypy354e3eq94vx7nptmgmauxzlc4n8g","sequence":2}},{"type":"cosmos-sdk/Account","value":{"account_number":31,"address":"shareledger1xu92yyjtueqtv4cfcshxr66chq64462lakct34","coins":[{"amount":"20","denom":"shr"}],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":9,"address":"shareledger18r5ne52vthfnercc5gsdlc2sax05tcvajtp8c0","coins":[{"amount":"100","denom":"shr"}],"public_key":"shareledgerpub1addwnpepq03yef6t28fkamg3wt2s6llggtf3ekcvfg8r8ax0ct54us5vwz94qy7awgt","sequence":1}},{"type":"cosmos-sdk/ModuleAccount","value":{"account_number":4,"address":"shareledger1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3dltkcu","coins":[{"amount":"4000000","denom":"shr"}],"name":"bonded_tokens_pool","permissions":["burner","staking"],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":11,"address":"shareledger12n75mjxld5mqzzy625augv9tmr8ve2h07v00g8","coins":[{"amount":"100","denom":"shr"}],"public_key":"shareledgerpub1addwnpepq0grnmsye64ra86rufn5yy4exn4fgjg4w58gd0h875dwgkqq7we52xvpvmz","sequence":1}},{"type":"cosmos-sdk/ModuleAccount","value":{"account_number":5,"address":"shareledger1tygms3xhhs3yv487phx3dw4a95jn7t7lelh8wg","coins":[],"name":"not_bonded_tokens_pool","permissions":["burner","staking"],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":16,"address":"shareledger1tf0fdqva0lv8k8mz02mqt2emtxu6q4eu2a2h77","coins":[{"amount":"20","denom":"shr"}],"public_key":"shareledgerpub1addwnpepqfm5878k094fwkxcq2t5flpta8ts96x3nzdpr0gpkxvetwmk4ddvkpyrd9r","sequence":4}},{"type":"cosmos-sdk/Account","value":{"account_number":28,"address":"shareledger1t3szq9rvhr80r2y8wpzt79jlpz7czh7ffk6c6g","coins":[{"amount":"20","denom":"shr"}],"public_key":"","sequence":0}},{"type":"cosmos-sdk/ModuleAccount","value":{"account_number":14,"address":"shareledger1wfhcuxxgh9hjs4meagavuj78uak9wfdwcm0exn","coins":[{"amount":"915","denom":"cent"},{"amount":"1543","denom":"shr"},{"amount":"735","denom":"shrp"}],"name":"gentlemint","permissions":["minter","burner"],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":27,"address":"shareledger1wah9n94xrfxf5xj00dxncu58wss8cdfzrkvhne","coins":[{"amount":"20","denom":"shr"}],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":24,"address":"shareledger10ysd42c7ge5ekrx2aghxrlf47xnpqa0tpm89v8","coins":[{"amount":"18","denom":"shr"}],"public_key":"shareledgerpub1addwnpepq04sfj2enzdqlyl58jwmm2xnkh9qfwu4gr8vcnzpvqcdlpgsky06zrhgkfh","sequence":2}},{"type":"cosmos-sdk/Account","value":{"account_number":17,"address":"shareledger10aa0nda8yqs2f4hh5hadcm22mcx8fxewd3zlzx","coins":[{"amount":"20","denom":"shr"}],"public_key":"shareledgerpub1addwnpepq20gzf0975nv6v7glkzje2xeu2yp4ht3t0kg55veeyyee6dt4hny6hjv83d","sequence":4}},{"type":"cosmos-sdk/ModuleAccount","value":{"account_number":3,"address":"shareledger1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lmx9g5","coins":[{"amount":"821","denom":"shr"}],"name":"distribution","permissions":null,"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":20,"address":"shareledger1nh2qkcmpc6vte9er89p5d94j4ynndffra9j4r9","coins":[{"amount":"43","denom":"cent"},{"amount":"17","denom":"shrp"}],"public_key":"shareledgerpub1addwnpepqtq3ygwm0x8hrswngqjupll33ww96u6zcummpzr3am6vg4myu23uvhf5fv4","sequence":10}},{"type":"cosmos-sdk/Account","value":{"account_number":19,"address":"shareledger14trh52vs63xqk5zey2kk3a6j7zqn8aw5zgnu7d","coins":[{"amount":"20","denom":"shr"}],"public_key":"shareledgerpub1addwnpepq2n0efxw77uxmlw26e8lhnd03jyruywmjfx5k2m2gntj8erwsca8525dpnk","sequence":4}},{"type":"cosmos-sdk/Account","value":{"account_number":26,"address":"shareledger14lma5uqrh4n704hymywz8wctq3k9p85waf3c5s","coins":[{"amount":"18","denom":"shr"}],"public_key":"shareledgerpub1addwnpepqvxn3sylr5pqpaqxhzqzj20sq4xcfx4l8rjpjf25cfnq9rqdztcxv94a428","sequence":2}},{"type":"cosmos-sdk/Account","value":{"account_number":8,"address":"shareledger1klzrnn5f83shlgaz078kdl3fvxnkrv55tulpwl","coins":[{"amount":"100","denom":"shr"}],"public_key":"shareledgerpub1addwnpepqdmpvk7ds9h70vz9w8tf4ql9u470m6ukrxwre4jn5m2tl5wwwqjf7ahpps8","sequence":1}},{"type":"cosmos-sdk/Account","value":{"account_number":23,"address":"shareledger1hs3rga0luxngud39prz9qhrtksxkn835fu08uu","coins":[{"amount":"18","denom":"shr"}],"public_key":"shareledgerpub1addwnpepqtu3z2wyffrqj4yaf7as9gd35gn8lr3lunl5hrxhncpzj2r3p6sh2jnlyc7","sequence":2}},{"type":"cosmos-sdk/Account","value":{"account_number":13,"address":"shareledger1eyh2k62g3e7jec0r57sp4kxt99zkhevr8zt0mx","coins":[{"amount":"175","denom":"cent"},{"amount":"138","denom":"shr"},{"amount":"144","denom":"shrp"}],"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":18,"address":"shareledger16rkzu5leaqsjp5awksuja63ka4zmtatmxkutxc","coins":[{"amount":"20","denom":"shr"}],"public_key":"shareledgerpub1addwnpepqtsz65xmmvrr4xx6fkv6nmggxk8m8p3mwvcttwq6y37tm576t0yuk48u0gc","sequence":4}},{"type":"cosmos-sdk/ModuleAccount","value":{"account_number":12,"address":"shareledger17xpfvakm2amg962yls6f84z3kell8c5lgape2k","coins":[],"name":"fee_collector","permissions":null,"public_key":"","sequence":0}},{"type":"cosmos-sdk/Account","value":{"account_number":22,"address":"shareledger17dtz35cl0fpmvnznngc6y45tklsc535hucck9w","coins":[{"amount":"9","denom":"shr"}],"public_key":"shareledgerpub1addwnpepq27k66h8qwk6mgaxxeeqhnts9hxy0lh5dfmrt0pnxtkcd4xlnemuwjvggln","sequence":11}}],"params":{"max_memo_characters":"256","sig_verify_cost_ed25519":"590","sig_verify_cost_secp256k1":"1000","tx_sig_limit":"7","tx_size_cost_per_byte":"10"}},"bank":{"send_enabled":true},"booking":{"Bookings":[{"IsCompleted":false,"bookingId":"34e5b67fed9aa3aabb02","duration":"1","renter":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","uuid":"myuuid4"},{"IsCompleted":true,"bookingId":"43453822f1d422365ca8","duration":"1","renter":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","uuid":"myuuid1"},{"IsCompleted":false,"bookingId":"4602315ba55baefe19f6","duration":"1","renter":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","uuid":"myuuid3"},{"IsCompleted":false,"bookingId":"617ad1e529b9f13c6b73","duration":"1","renter":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","uuid":"myuuid2"},{"IsCompleted":false,"bookingId":"931a23ebb123867d545b","duration":"1","renter":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","uuid":"myuuid5"},{"IsCompleted":false,"bookingId":"b0d35c5c453bfcb25206","duration":"1","renter":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","uuid":"myuuid"},{"IsCompleted":false,"bookingId":"d164400d44324956d415","duration":"1","renter":"shareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","uuid":"myuuid9"}]},"distribution":{"delegator_starting_infos":[{"delegator_address":"shareledger19w7khxj5dcxfrukpqztyeq7ejn5fpwtrxs0pyn","starting_info":{"creation_height":"0","previous_period":"1","stake":"1000000.000000000000000000"},"validator_address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc"},{"delegator_address":"shareledger18r5ne52vthfnercc5gsdlc2sax05tcvajtp8c0","starting_info":{"creation_height":"0","previous_period":"1","stake":"1000000.000000000000000000"},"validator_address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy"},{"delegator_address":"shareledger12n75mjxld5mqzzy625augv9tmr8ve2h07v00g8","starting_info":{"creation_height":"0","previous_period":"1","stake":"1000000.000000000000000000"},"validator_address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv"},{"delegator_address":"shareledger1klzrnn5f83shlgaz078kdl3fvxnkrv55tulpwl","starting_info":{"creation_height":"0","previous_period":"1","stake":"1000000.000000000000000000"},"validator_address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5"}],"delegator_withdraw_infos":[],"fee_pool":{"community_pool":[{"amount":"16.420000000000000000","denom":"shr"}]},"outstanding_rewards":[{"outstanding_rewards":[{"amount":"197.832500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc"},{"outstanding_rewards":[{"amount":"199.182500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy"},{"outstanding_rewards":[{"amount":"202.382500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv"},{"outstanding_rewards":[{"amount":"205.182500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5"}],"params":{"base_proposer_reward":"0.010000000000000000","bonus_proposer_reward":"0.040000000000000000","community_tax":"0.020000000000000000","withdraw_addr_enabled":true},"previous_proposer":"shareledgervalcons17ac9q76hdzst7jvvvlpf4p9nz7a0saz5ygauu7","validator_accumulated_commissions":[{"accumulated":[{"amount":"197.832500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc"},{"accumulated":[{"amount":"199.182500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy"},{"accumulated":[{"amount":"202.382500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv"},{"accumulated":[{"amount":"205.182500000000000000","denom":"shr"}],"validator_address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5"}],"validator_current_rewards":[{"rewards":{"period":"2","rewards":null},"validator_address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc"},{"rewards":{"period":"2","rewards":null},"validator_address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy"},{"rewards":{"period":"2","rewards":null},"validator_address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv"},{"rewards":{"period":"2","rewards":null},"validator_address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5"}],"validator_historical_rewards":[{"period":"1","rewards":{"cumulative_reward_ratio":null,"reference_count":2},"validator_address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc"},{"period":"1","rewards":{"cumulative_reward_ratio":null,"reference_count":2},"validator_address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy"},{"period":"1","rewards":{"cumulative_reward_ratio":null,"reference_count":2},"validator_address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv"},{"period":"1","rewards":{"cumulative_reward_ratio":null,"reference_count":2},"validator_address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5"}],"validator_slash_events":[]},"electoral":{"Addresses":["shareledger12n75mjxld5mqzzy625augv9tmr8ve2h07v00g8","shareledger18r5ne52vthfnercc5gsdlc2sax05tcvajtp8c0","shareledger19w7khxj5dcxfrukpqztyeq7ejn5fpwtrxs0pyn","shareledger1klzrnn5f83shlgaz078kdl3fvxnkrv55tulpwl"]},"gentlemint":{"ExchangeRate":"200","LoaderKeys":["shrploadershareledger10aa0nda8yqs2f4hh5hadcm22mcx8fxewd3zlzx","shrploadershareledger14trh52vs63xqk5zey2kk3a6j7zqn8aw5zgnu7d","shrploadershareledger16rkzu5leaqsjp5awksuja63ka4zmtatmxkutxc","shrploadershareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj","shrploadershareledger1tf0fdqva0lv8k8mz02mqt2emtxu6q4eu2a2h77"]},"genutil":{"gentxs":[]},"identity":{"IDSigners":["IdSignershareledger10ysd42c7ge5ekrx2aghxrlf47xnpqa0tpm89v8","IdSignershareledger14lma5uqrh4n704hymywz8wctq3k9p85waf3c5s","IdSignershareledger17dtz35cl0fpmvnznngc6y45tklsc535hucck9w","IdSignershareledger1hs3rga0luxngud39prz9qhrtksxkn835fu08uu","IdSignershareledger1p4lav5ar5tn86yafvwkmzph422q7jk6rxtlznm","IdSignershareledger1pmm3et7v2nmhg7xsdy4cwknjw3k6mgl8unruww","IdSignershareledger1t3szq9rvhr80r2y8wpzt79jlpz7czh7ffk6c6g","IdSignershareledger1wah9n94xrfxf5xj00dxncu58wss8cdfzrkvhne","IdSignershareledger1x0k4rlxuflw3srs6sx7vlyhurzzaa5av5cywjy","IdSignershareledger1xu92yyjtueqtv4cfcshxr66chq64462lakct34"],"IDs":{"IdSignershareledger10ysd42c7ge5ekrx2aghxrlf47xnpqa0tpm89v8":"\n\u0006active","IdSignershareledger14lma5uqrh4n704hymywz8wctq3k9p85waf3c5s":"\n\u0006active","IdSignershareledger17dtz35cl0fpmvnznngc6y45tklsc535hucck9w":"\n\u0006active","IdSignershareledger1hs3rga0luxngud39prz9qhrtksxkn835fu08uu":"\n\u0006active","IdSignershareledger1p4lav5ar5tn86yafvwkmzph422q7jk6rxtlznm":"\n\u0006active","IdSignershareledger1pmm3et7v2nmhg7xsdy4cwknjw3k6mgl8unruww":"\n\u0006active","IdSignershareledger1t3szq9rvhr80r2y8wpzt79jlpz7czh7ffk6c6g":"\n\u0006active","IdSignershareledger1wah9n94xrfxf5xj00dxncu58wss8cdfzrkvhne":"\n\u0006active","IdSignershareledger1x0k4rlxuflw3srs6sx7vlyhurzzaa5av5cywjy":"\n\u0006active","IdSignershareledger1xu92yyjtueqtv4cfcshxr66chq64462lakct34":"\n\u0006active","Idshareledger1rh6lf04vz6hcgkpwwhge8pqga8yjc9qg3602lj":"myhash"}},"slashing":{"missed_blocks":{"shareledgervalcons130cafqjf4svm45hd6w2ktrxt66p4uvdhqs6l2a":[],"shareledgervalcons17ac9q76hdzst7jvvvlpf4p9nz7a0saz5ygauu7":[],"shareledgervalcons18ps7aapwhqzeqv2wq64desx3wqkudyf6sa2mkz":[],"shareledgervalcons1xlmt95nt7fv2rgxm5fqgku0py623pj0gvm6fqa":[]},"params":{"downtime_jail_duration":"600000000000","min_signed_per_window":"0.500000000000000000","signed_blocks_window":"100","slash_fraction_double_sign":"0.050000000000000000","slash_fraction_downtime":"0.010000000000000000"},"signing_infos":{"shareledgervalcons130cafqjf4svm45hd6w2ktrxt66p4uvdhqs6l2a":{"address":"shareledgervalcons130cafqjf4svm45hd6w2ktrxt66p4uvdhqs6l2a","index_offset":"22750","jailed_until":"1970-01-01T00:00:00Z","missed_blocks_counter":"0","start_height":"0","tombstoned":false},"shareledgervalcons17ac9q76hdzst7jvvvlpf4p9nz7a0saz5ygauu7":{"address":"shareledgervalcons17ac9q76hdzst7jvvvlpf4p9nz7a0saz5ygauu7","index_offset":"22750","jailed_until":"1970-01-01T00:00:00Z","missed_blocks_counter":"0","start_height":"0","tombstoned":false},"shareledgervalcons18ps7aapwhqzeqv2wq64desx3wqkudyf6sa2mkz":{"address":"shareledgervalcons18ps7aapwhqzeqv2wq64desx3wqkudyf6sa2mkz","index_offset":"22750","jailed_until":"1970-01-01T00:00:00Z","missed_blocks_counter":"0","start_height":"0","tombstoned":false},"shareledgervalcons1xlmt95nt7fv2rgxm5fqgku0py623pj0gvm6fqa":{"address":"shareledgervalcons1xlmt95nt7fv2rgxm5fqgku0py623pj0gvm6fqa","index_offset":"22750","jailed_until":"1970-01-01T00:00:00Z","missed_blocks_counter":"0","start_height":"0","tombstoned":false}}},"staking":{"delegations":[{"delegator_address":"shareledger19w7khxj5dcxfrukpqztyeq7ejn5fpwtrxs0pyn","shares":"1000000.000000000000000000","validator_address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc"},{"delegator_address":"shareledger18r5ne52vthfnercc5gsdlc2sax05tcvajtp8c0","shares":"1000000.000000000000000000","validator_address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy"},{"delegator_address":"shareledger12n75mjxld5mqzzy625augv9tmr8ve2h07v00g8","shares":"1000000.000000000000000000","validator_address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv"},{"delegator_address":"shareledger1klzrnn5f83shlgaz078kdl3fvxnkrv55tulpwl","shares":"1000000.000000000000000000","validator_address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5"}],"exported":true,"last_total_power":"4","last_validator_powers":[{"Address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc","Power":"1"},{"Address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy","Power":"1"},{"Address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv","Power":"1"},{"Address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5","Power":"1"}],"params":{"bond_denom":"shr","historical_entries":0,"max_entries":7,"max_validators":100,"unbonding_time":"1814400000000000"},"redelegations":null,"unbonding_delegations":null,"validators":[{"commission":{"commission_rates":{"max_change_rate":"1.000000000000000000","max_rate":"1.000000000000000000","rate":"1.000000000000000000"},"update_time":"2020-09-04T11:12:10.883066161Z"},"consensus_pubkey":"shareledgervalconspub1zcjduepqmdcgyql6arw7pyw0se0s79pljn6xa2uxjn5crrx2r90mad5sn4cs6r263f","delegator_shares":"1000000.000000000000000000","description":{"details":"","identity":"","moniker":"node2","security_contact":"","website":""},"jailed":false,"min_self_delegation":"1","operator_address":"shareledgervaloper19w7khxj5dcxfrukpqztyeq7ejn5fpwtrwd2yvc","status":2,"tokens":"1000000","unbonding_height":"0","unbonding_time":"1970-01-01T00:00:00Z"},{"commission":{"commission_rates":{"max_change_rate":"1.000000000000000000","max_rate":"1.000000000000000000","rate":"1.000000000000000000"},"update_time":"2020-09-04T11:12:10.883066161Z"},"consensus_pubkey":"shareledgervalconspub1zcjduepqmcac963wrlhy3kf3der8gr27lp76pypmf7hq8js50z3784l502mstq00uf","delegator_shares":"1000000.000000000000000000","description":{"details":"","identity":"","moniker":"node1","security_contact":"","website":""},"jailed":false,"min_self_delegation":"1","operator_address":"shareledgervaloper18r5ne52vthfnercc5gsdlc2sax05tcva6kyzsy","status":2,"tokens":"1000000","unbonding_height":"0","unbonding_time":"1970-01-01T00:00:00Z"},{"commission":{"commission_rates":{"max_change_rate":"1.000000000000000000","max_rate":"1.000000000000000000","rate":"1.000000000000000000"},"update_time":"2020-09-04T11:12:10.883066161Z"},"consensus_pubkey":"shareledgervalconspub1zcjduepqs8vfaxqmqzw44trk5d4ysjey8gvw6weqzwdrqqvdfpyg6jqy6lss9mwu8f","delegator_shares":"1000000.000000000000000000","description":{"details":"","identity":"","moniker":"node3","security_contact":"","website":""},"jailed":false,"min_self_delegation":"1","operator_address":"shareledgervaloper12n75mjxld5mqzzy625augv9tmr8ve2h0k322qv","status":2,"tokens":"1000000","unbonding_height":"0","unbonding_time":"1970-01-01T00:00:00Z"},{"commission":{"commission_rates":{"max_change_rate":"1.000000000000000000","max_rate":"1.000000000000000000","rate":"1.000000000000000000"},"update_time":"2020-09-04T11:12:10.883066161Z"},"consensus_pubkey":"shareledgervalconspub1zcjduepqqvlkyqzw5p54hlkd2asreljp9wn4j4hhkcz8e9ucp20e67skwstq8hkwj9","delegator_shares":"1000000.000000000000000000","description":{"details":"","identity":"","moniker":"node0","security_contact":"","website":""},"jailed":false,"min_self_delegation":"1","operator_address":"shareledgervaloper1klzrnn5f83shlgaz078kdl3fvxnkrv55rp6yx5","status":2,"tokens":"1000000","unbonding_height":"0","unbonding_time":"1970-01-01T00:00:00Z"}]},"supply":{"supply":[{"amount":"915","denom":"cent"},{"amount":"4002143","denom":"shr"},{"amount":"735","denom":"shrp"}]}},"chain_id":"ShareRing-VoyagerNet","consensus_params":{"block":{"max_bytes":"22020096","max_gas":"-1","time_iota_ms":"1000"},"evidence":{"max_age_duration":"172800000000000","max_age_num_blocks":"100000"},"validator":{"pub_key_types":["ed25519"]}},"genesis_time":"2020-09-04T11:12:10.883066161Z","validators":[{"address":"","name":"node2","power":"1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"23CCA/ro3eCRz4ZfDxQ/lPRuq4aU6YGMyhlfvraQnXE="}},{"address":"","name":"node1","power":"1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"3juC6i4f7kjZMW5GdA1e+H2gkDtPrgPKFHij49f0erc="}},{"address":"","name":"node3","power":"1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"gdiemBsAnVqsdqNqSEskOhjtOyATmjABjUhIjUgE1+E="}},{"address":"","name":"node0","power":"1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"Az9iAE6gaVv+zVdgPP5BK6dZVve2BHyXmAqfnXoWdBY="}}]} diff --git a/tests/genesis.v0.0.2.json b/tests/genesis.v0.0.2.json deleted file mode 100644 index 3bb9cd89..00000000 --- a/tests/genesis.v0.0.2.json +++ /dev/null @@ -1,368 +0,0 @@ -{ - "app_hash": "", - "app_state": { - "asset": { "Assets": null }, - "auth": { - "accounts": [ - { - "type": "cosmos-sdk/Account", - "value": { - "account_number": 7, - "address": "shareledger1pddd4kn2xyuy7acj4fetfzrusu56ygjn0klqjj", - "coins": [ - { "amount": "999982", "denom": "shr" }, - { "amount": "1000000", "denom": "shrp" } - ], - "public_key": "shareledgerpub1addwnpepq23fll3c94ryxvuw3r5qxt3nm6pqtwfv0vagrw6v4z4tukglyxu2qeevacx", - "sequence": 5 - } - }, - { - "type": "cosmos-sdk/Account", - "value": { - "account_number": 4, - "address": "shareledger1pdn8c6npsvrd5ljksnq0m70ygd0n777tpnmjxc", - "coins": [ - { "amount": "1000003", "denom": "shr" }, - { "amount": "1000000", "denom": "shrp" } - ], - "public_key": "", - "sequence": 0 - } - }, - { - "type": "cosmos-sdk/Account", - "value": { - "account_number": 6, - "address": "shareledger1ywe8kjv98t7tnttt356g4k832lxhtw5ejdxl98", - "coins": [ - { "amount": "999999", "denom": "shr" }, - { "amount": "1000000", "denom": "shrp" } - ], - "public_key": "shareledgerpub1addwnpepqgltsv9gckrms783d47f487vd8suwx204ktp29daguv67zulc3epusnewkj", - "sequence": 1 - } - }, - { - "type": "cosmos-sdk/Account", - "value": { - "account_number": 3, - "address": "shareledger18ynvs356etaj08vtr4hkw563jnm75nldgqustq", - "coins": [ - { "amount": "999988", "denom": "shr" }, - { "amount": "1000000", "denom": "shrp" } - ], - "public_key": "shareledgerpub1addwnpepqwsh8jkvq83xx0gf4akwgthla00gkdwqk4jpq3kz6rgeatl6jrjrue5lsxu", - "sequence": 2 - } - }, - { - "type": "cosmos-sdk/ModuleAccount", - "value": { - "account_number": 1, - "address": "shareledger1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3dltkcu", - "coins": [{ "amount": "1000000", "denom": "shr" }], - "name": "bonded_tokens_pool", - "permissions": ["burner", "staking"], - "public_key": "", - "sequence": 0 - } - }, - { - "type": "cosmos-sdk/ModuleAccount", - "value": { - "account_number": 2, - "address": "shareledger1tygms3xhhs3yv487phx3dw4a95jn7t7lelh8wg", - "coins": [], - "name": "not_bonded_tokens_pool", - "permissions": ["burner", "staking"], - "public_key": "", - "sequence": 0 - } - }, - { - "type": "cosmos-sdk/ModuleAccount", - "value": { - "account_number": 0, - "address": "shareledger1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lmx9g5", - "coins": [{ "amount": "28", "denom": "shr" }], - "name": "distribution", - "permissions": null, - "public_key": "", - "sequence": 0 - } - }, - { - "type": "cosmos-sdk/Account", - "value": { - "account_number": 5, - "address": "shareledger1kgcv40xdrrs94fqvnsq6y9epvhy7ecwshe89s6", - "coins": [{ "amount": "1000000", "denom": "shrp" }], - "public_key": "shareledgerpub1addwnpepqvx3rhgj364h7wtcu6alzd6j4u0dxcm97498mj8jp5w5k4dnjtr46kkrsa8", - "sequence": 1 - } - }, - { - "type": "cosmos-sdk/Account", - "value": { - "account_number": 8, - "address": "shareledger1u99yyw5yunntu62k298wu65ush6pce8hm74g0k", - "coins": [ - { "amount": "1000000", "denom": "shr" }, - { "amount": "1000000", "denom": "shrp" } - ], - "public_key": "", - "sequence": 0 - } - }, - { - "type": "cosmos-sdk/ModuleAccount", - "value": { - "account_number": 9, - "address": "shareledger17xpfvakm2amg962yls6f84z3kell8c5lgape2k", - "coins": [], - "name": "fee_collector", - "permissions": null, - "public_key": "", - "sequence": 0 - } - } - ], - "params": { - "max_memo_characters": "256", - "sig_verify_cost_ed25519": "590", - "sig_verify_cost_secp256k1": "1000", - "tx_sig_limit": "7", - "tx_size_cost_per_byte": "10" - } - }, - "bank": { "send_enabled": true }, - "booking": { "Bookings": null }, - "distribution": { - "delegator_starting_infos": [ - { - "delegator_address": "shareledger1kgcv40xdrrs94fqvnsq6y9epvhy7ecwshe89s6", - "starting_info": { - "creation_height": "0", - "previous_period": "1", - "stake": "1000000.000000000000000000" - }, - "validator_address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3" - } - ], - "delegator_withdraw_infos": [], - "fee_pool": { - "community_pool": [{ "amount": "0.560000000000000000", "denom": "shr" }] - }, - "outstanding_rewards": [ - { - "outstanding_rewards": [ - { "amount": "27.440000000000000000", "denom": "shr" } - ], - "validator_address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3" - } - ], - "params": { - "base_proposer_reward": "0.010000000000000000", - "bonus_proposer_reward": "0.040000000000000000", - "community_tax": "0.020000000000000000", - "withdraw_addr_enabled": true - }, - "previous_proposer": "shareledgervalcons17j2zysuzejak8zjjn7wzl60tu0zlfyqvcwztmd", - "validator_accumulated_commissions": [ - { - "accumulated": [{ "amount": "2.744000000000000000", "denom": "shr" }], - "validator_address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3" - } - ], - "validator_current_rewards": [ - { - "rewards": { - "period": "2", - "rewards": [{ "amount": "24.696000000000000000", "denom": "shr" }] - }, - "validator_address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3" - } - ], - "validator_historical_rewards": [ - { - "period": "1", - "rewards": { "cumulative_reward_ratio": null, "reference_count": 2 }, - "validator_address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3" - } - ], - "validator_slash_events": [] - }, - "doc": { - "Documents": [ - { - "data": "d1", - "holder": "h1", - "issuer": "shareledger1pddd4kn2xyuy7acj4fetfzrusu56ygjn0klqjj", - "proof": "d1", - "version": 0 - }, - { - "data": "d2", - "holder": "h2", - "issuer": "shareledger1pddd4kn2xyuy7acj4fetfzrusu56ygjn0klqjj", - "proof": "d2", - "version": 0 - }, - { - "data": "data-data ", - "holder": "holder-data", - "issuer": "shareledger1pddd4kn2xyuy7acj4fetfzrusu56ygjn0klqjj", - "proof": "proof-data ", - "version": 0 - }, - { - "data": "d1", - "holder": "id1", - "issuer": "shareledger1pddd4kn2xyuy7acj4fetfzrusu56ygjn0klqjj", - "proof": "p1", - "version": 0 - }, - { - "data": "d2", - "holder": "id2", - "issuer": "shareledger1pddd4kn2xyuy7acj4fetfzrusu56ygjn0klqjj", - "proof": "p2", - "version": 0 - } - ] - }, - "electoral": { - "Addresses": ["shareledger1kgcv40xdrrs94fqvnsq6y9epvhy7ecwshe89s6"] - }, - "gentlemint": { - "account_operators": [ - { - "address": "shareledger1ywe8kjv98t7tnttt356g4k832lxhtw5ejdxl98", - "status": "active" - } - ], - "authority": "shareledger18ynvs356etaj08vtr4hkw563jnm75nldgqustq", - "document_issuer": [ - { - "address": "shareledger1pddd4kn2xyuy7acj4fetfzrusu56ygjn0klqjj", - "status": "active" - } - ], - "exchange_rate": "200", - "id_signers": null, - "loader_keys": null, - "treasurer": "shareledger1pdn8c6npsvrd5ljksnq0m70ygd0n777tpnmjxc" - }, - "genutil": { "gentxs": [] }, - "id": { "IDs": [] }, - "identity": { "IDSigners": null, "IDs": {} }, - "slashing": { - "missed_blocks": { - "shareledgervalcons17j2zysuzejak8zjjn7wzl60tu0zlfyqvcwztmd": [] - }, - "params": { - "downtime_jail_duration": "600000000000", - "min_signed_per_window": "0.500000000000000000", - "signed_blocks_window": "100", - "slash_fraction_double_sign": "0.050000000000000000", - "slash_fraction_downtime": "0.010000000000000000" - }, - "signing_infos": { - "shareledgervalcons17j2zysuzejak8zjjn7wzl60tu0zlfyqvcwztmd": { - "address": "shareledgervalcons17j2zysuzejak8zjjn7wzl60tu0zlfyqvcwztmd", - "index_offset": "20207", - "jailed_until": "1970-01-01T00:00:00Z", - "missed_blocks_counter": "0", - "start_height": "0", - "tombstoned": false - } - } - }, - "staking": { - "delegations": [ - { - "delegator_address": "shareledger1kgcv40xdrrs94fqvnsq6y9epvhy7ecwshe89s6", - "shares": "1000000.000000000000000000", - "validator_address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3" - } - ], - "exported": true, - "last_total_power": "1", - "last_validator_powers": [ - { - "Address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3", - "Power": "1" - } - ], - "params": { - "bond_denom": "shr", - "historical_entries": 0, - "max_entries": 7, - "max_validators": 100, - "unbonding_time": "1814400000000000" - }, - "redelegations": null, - "unbonding_delegations": null, - "validators": [ - { - "commission": { - "commission_rates": { - "max_change_rate": "0.010000000000000000", - "max_rate": "0.200000000000000000", - "rate": "0.100000000000000000" - }, - "update_time": "2021-02-02T06:38:32.788670114Z" - }, - "consensus_pubkey": "shareledgervalconspub1zcjduepqduq4ynng6fmu9t5ln6y86mjvtmqks4qfvwjg3gvfujut86dgu4fslq7kmz", - "delegator_shares": "1000000.000000000000000000", - "description": { - "details": "", - "identity": "", - "moniker": "test", - "security_contact": "", - "website": "" - }, - "jailed": false, - "min_self_delegation": "1", - "operator_address": "shareledgervaloper1kgcv40xdrrs94fqvnsq6y9epvhy7ecwslyzqc3", - "status": 2, - "tokens": "1000000", - "unbonding_height": "0", - "unbonding_time": "1970-01-01T00:00:00Z" - } - ] - }, - "supply": { - "supply": [ - { "amount": "6000000", "denom": "shr" }, - { "amount": "6000000", "denom": "shrp" } - ] - } - }, - "chain_id": "testing", - "consensus_params": { - "block": { - "max_bytes": "22020096", - "max_gas": "-1", - "time_iota_ms": "1000" - }, - "evidence": { - "max_age_duration": "172800000000000", - "max_age_num_blocks": "100000" - }, - "validator": { "pub_key_types": ["ed25519"] } - }, - "genesis_time": "2021-02-02T06:38:32.788670114Z", - "validators": [ - { - "address": "", - "name": "test", - "power": "1", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "bwFSTmjSd8Kun56IfW5MXsFoVAljpIihieS4s+mo5VM=" - } - } - ] -} diff --git a/tests/gentlemint_load_and_burn_test.go b/tests/gentlemint_load_and_burn_test.go deleted file mode 100644 index fd50467c..00000000 --- a/tests/gentlemint_load_and_burn_test.go +++ /dev/null @@ -1,296 +0,0 @@ -package tests - -import ( - "fmt" - "strings" - "testing" - - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestGentlemint_LoadSHR_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - amount := "10" - - loadCmd := fmt.Sprintf("load-shr %s %s", treasurer.String(), amount) - - // Load - _, stdOut, _ := f.ExecuteGentlemintTxCommand(loadCmd, fmt.Sprintf("--from %s --yes", authority.String())) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.Cleanup() -} - -func TestGentlemint_BurnSHR_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - amount := "10" - burnCmd := fmt.Sprintf("burn-shr %s", amount) - loadCmd := fmt.Sprintf("load-shr %s %s", treasurer.String(), amount) - - // Load - f.ExecuteGentlemintTxCommand(loadCmd, fmt.Sprintf("--from %s --yes", authority.String())) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - _, stdOut, _ := f.ExecuteGentlemintTxCommand(burnCmd, fmt.Sprintf("--from %s --yes", treasurer.String())) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.Cleanup() -} - -func TestGentlemint_Enroll_ShrpLoader_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - enrollLoaderCmd := fmt.Sprintf("enroll-loaders %s", treasurer.String()) - - // Load - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes", authority.String())) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.Cleanup() -} - -func TestGentlemint_Revoke_ShrpLoader_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - enrollLoaderCmd := fmt.Sprintf("enroll-loaders %s", treasurer.String()) - revokeLoaderCmd := fmt.Sprintf("revoke-loaders %s", treasurer.String()) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes", authority.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // Revoke - _, stdOut2, _ := f.ExecuteGentlemintTxCommand(revokeLoaderCmd, fmt.Sprintf("--from %s --yes", authority.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - txRepsonse2 := ParseStdOut(t, stdOut2) - require.Equal(t, uint32(0), txRepsonse2.Code) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.Cleanup() -} - -func TestGentlemint_LoadSHRP_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - emptyAccount := f.KeyAddress(keyEmtyUser) - amount := "10" - - loadCmd := fmt.Sprintf("load-shrp %s %s", emptyAccount.String(), amount) - enrollLoaderCmd := fmt.Sprintf("enroll-loaders %s", treasurer.String()) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes", authority.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // Load - _, stdOut2, _ := f.ExecuteGentlemintTxCommand(loadCmd, fmt.Sprintf("--from %s --yes", treasurer.String())) - - txRepsonse2 := ParseStdOut(t, stdOut2) - require.Equal(t, uint32(0), txRepsonse2.Code) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - balance := f.QueryAccount(emptyAccount) - - require.Equal(t, "9", balance.GetCoins().AmountOf("shrp").String()) - require.Equal(t, "9", balance.GetCoins().AmountOf("shr").String()) - - f.Cleanup() -} - -func TestGentlemint_BurnSHRP_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - // emptyAccount := f.KeyAddress(keyEmtyUser) - amount := "10" - burnAmount := "1" - - enrollLoaderCmd := fmt.Sprintf("enroll-loaders %s", treasurer.String()) - loadCmd := fmt.Sprintf("load-shrp %s %s", treasurer.String(), amount) - burnCmd := fmt.Sprintf("burn-shrp %s", burnAmount) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes", authority.String())) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // Load - _, stdOut2, _ := f.ExecuteGentlemintTxCommand(loadCmd, fmt.Sprintf("--from %s --yes", treasurer.String())) - - txRepsonse2 := ParseStdOut(t, stdOut2) - require.Equal(t, uint32(0), txRepsonse2.Code) - - // Burn - _, stdOut3, _ := f.ExecuteGentlemintTxCommand(burnCmd, fmt.Sprintf("--from %s --yes", treasurer.String())) - - txRepsonse3 := ParseStdOut(t, stdOut3) - require.Equal(t, uint32(0), txRepsonse3.Code) - - f.Cleanup() -} - -func TestGentlemint_SetExchangeRate_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - - treasurer := f.KeyAddress(keyTreasurer) - - rate := "99" - setExchageRateCmd := fmt.Sprintf("set-exchange %s", rate) - - _, stdOut, _ := f.ExecuteGentlemintTxCommand(setExchageRateCmd, fmt.Sprintf("--from %s --yes", treasurer.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - cmd := fmt.Sprintf("%s query gentlemint get-exchange %v", f.GaiacliBinary, f.Flags()) - flags := []string{} - exchangeRate, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - - require.Equal(t, rate, strings.Replace(exchangeRate, "\"", "", -1)) - - f.Cleanup() -} - -func TestGentlemint_BuySHR_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - // emptyAccount := f.KeyAddress(keyEmtyUser) - amount := "10" - buyAmount := "1" - - enrollLoaderCmd := fmt.Sprintf("enroll-loaders %s", treasurer.String()) - loadCmd := fmt.Sprintf("load-shrp %s %s", treasurer.String(), amount) - buyCmd := fmt.Sprintf("buy-shr %s", buyAmount) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes", authority.String())) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // Load - _, stdOut2, _ := f.ExecuteGentlemintTxCommand(loadCmd, fmt.Sprintf("--from %s --yes", treasurer.String())) - - txRepsonse2 := ParseStdOut(t, stdOut2) - require.Equal(t, uint32(0), txRepsonse2.Code) - - // Buy - _, stdOut3, _ := f.ExecuteGentlemintTxCommand(buyCmd, fmt.Sprintf("--from %s --yes", treasurer.String())) - - txRepsonse3 := ParseStdOut(t, stdOut3) - require.Equal(t, uint32(0), txRepsonse3.Code) - - f.Cleanup() -} diff --git a/tests/gentlemint_test.go b/tests/gentlemint_test.go deleted file mode 100644 index 05cf4e60..00000000 --- a/tests/gentlemint_test.go +++ /dev/null @@ -1,713 +0,0 @@ -package tests - -import ( - "fmt" - "testing" - - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - app "github.com/sharering/shareledger" - "github.com/sharering/shareledger/x/gentlemint" - "github.com/sharering/shareledger/x/gentlemint/types" - gentTypes "github.com/sharering/shareledger/x/gentlemint/types" - "github.com/stretchr/testify/require" -) - -func TestGentlemint_EnrollAccountOperator_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - _, operators := createRandomAddr(3) - - // Enroll - _, stdOut, _ := f.EnrollAccountOperator(operators, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - txRepsonse := sdk.TxResponse{} - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdOut), &txRepsonse) - require.Nil(t, err) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - info := f.QueryAllAccountOperator() - - // Append the pre-operators - operators = append(operators, f.KeyAddress(keyAccOp)) - - require.Equal(t, len(operators), len(info)) - - require.Contains(t, operators, info[0].Address) - require.Contains(t, operators, info[1].Address) - require.Contains(t, operators, info[2].Address) - require.Contains(t, operators, info[3].Address) - - require.Equal(t, gentTypes.Active, info[0].Status) - require.Equal(t, gentTypes.Active, info[1].Status) - require.Equal(t, gentTypes.Active, info[2].Status) - require.Equal(t, gentTypes.Active, info[3].Status) - - acc0 := f.QueryAccountOperator(operators[0]) - require.Equal(t, gentTypes.Active, acc0.Status) - require.Equal(t, operators[0], acc0.Address) - - // Check events - for _, event := range txRepsonse.Logs[0].Events { - if event.Type == gentTypes.EventTypeEnrollAccOp { - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: operators[0].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: operators[1].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: operators[2].String()}) - } else if event.Type == sdk.EventTypeMessage { - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyModule, Value: gentTypes.ModuleName}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyAction, Value: gentTypes.EventTypeEnrollAccOp}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeySender, Value: authority.String()}) - } - } - - f.Cleanup() -} - -func TestGentlemint_EnrollAccountOperator_NotAuthority(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyUser1) - _, operators := createRandomAddr(1) - - // Enroll - _, stdOut, _ := f.EnrollAccountOperator(operators, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - require.Contains(t, stdOut, types.ErrSenderIsNotAuthority) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - acc0 := f.QueryAccountOperator(operators[0]) - require.Empty(t, acc0.Status) - require.Empty(t, acc0.Address) - - f.Cleanup() -} - -func TestGentlemint_RevokeAccountOperator_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - _, operators := createRandomAddr(3) - - // Enroll - f.EnrollAccountOperator(operators, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - _, stdOut, _ := f.RevokeAccountOperator([]sdk.AccAddress{operators[0], operators[1]}, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - txRepsonse := sdk.TxResponse{} - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdOut), &txRepsonse) - require.Nil(t, err) - - acc0 := f.QueryAccountOperator(operators[0]) - require.Equal(t, gentTypes.Inactive, acc0.Status) - require.Equal(t, operators[0], acc0.Address) - - // acc1 := f.QueryAccountOperator(operators[1]) - // require.Equal(t, gentTypes.Inactive, acc1.Status) - // require.Equal(t, operators[1], acc1.Address) - - // Check events - for _, event := range txRepsonse.Logs[0].Events { - if event.Type == gentTypes.EventTypeRevokeAccOp { - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: operators[0].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: operators[1].String()}) - } else if event.Type == sdk.EventTypeMessage { - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyModule, Value: gentTypes.ModuleName}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyAction, Value: gentTypes.EventTypeRevokeAccOp}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeySender, Value: authority.String()}) - } - } - - f.Cleanup() -} - -func TestGentlemint_RevokeAccountOperator_DoesNotExist(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - _, operators := createRandomAddr(3) - _, doesNotExistOperators := createRandomAddr(1) - - // Enroll - f.EnrollAccountOperator(operators, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - _, stdOut, _ := f.RevokeAccountOperator([]sdk.AccAddress{operators[0], doesNotExistOperators[0]}, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - require.Contains(t, stdOut, types.ErrDoesNotExist.Error()) - - acc0 := f.QueryAccountOperator(operators[0]) - require.Equal(t, gentTypes.Active, acc0.Status) - require.Equal(t, operators[0], acc0.Address) - - f.Cleanup() -} - -func TestGentlemint_RevokeAccountOperator_Inactive(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - _, operators := createRandomAddr(3) - - // Enroll - f.EnrollAccountOperator(operators, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - f.RevokeAccountOperator([]sdk.AccAddress{operators[0]}, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - _, stdOut, _ := f.RevokeAccountOperator([]sdk.AccAddress{operators[1], operators[0]}, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - require.Contains(t, stdOut, types.ErrDoesNotExist.Error()) - - acc0 := f.QueryAccountOperator(operators[0]) - require.Equal(t, gentTypes.Inactive, acc0.Status) - require.Equal(t, operators[0], acc0.Address) - - acc1 := f.QueryAccountOperator(operators[1]) - require.Equal(t, gentTypes.Active, acc1.Status) - require.Equal(t, operators[1], acc1.Address) - - f.Cleanup() -} - -func TestGentlemint_RevokeAccountOperator_NotAuthority(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - user1 := f.KeyAddress(keyUser1) - _, operators := createRandomAddr(1) - - // Enroll - f.EnrollAccountOperator(operators, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - _, stdOut, _ := f.RevokeAccountOperator([]sdk.AccAddress{operators[0]}, fmt.Sprintf("--from %s --yes --fees 1shr", user1.String())) - - require.Contains(t, stdOut, types.ErrSenderIsNotAuthority) - - acc0 := f.QueryAccountOperator(operators[0]) - require.Equal(t, gentTypes.Active, acc0.Status) - require.Equal(t, operators[0], acc0.Address) - - f.Cleanup() -} - -//-______________________________________________ - -func TestGentlemint_EnrollIssuer_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accOperator := f.KeyAddress(keyAccOp) - _, issuers := createRandomAddr(3) - - // Enroll issuer - _, stdOut, _ := f.EnrollDocIssuer(issuers, fmt.Sprintf("--from %s --yes --fees 1shr", accOperator.String())) - txRepsonse := sdk.TxResponse{} - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdOut), &txRepsonse) - require.Nil(t, err) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - acc := f.QueryDocumentIssuer(issuers[0]) - - require.Equal(t, acc.Address, issuers[0]) - require.Equal(t, acc.Status, gentlemint.ActiveStatus) - - // Check events - for _, event := range txRepsonse.Logs[0].Events { - if event.Type == gentTypes.EventTypeEnrollDocIssuer { - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: issuers[0].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: issuers[1].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: issuers[2].String()}) - } else if event.Type == sdk.EventTypeMessage { - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyModule, Value: gentTypes.ModuleName}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyAction, Value: gentTypes.EventTypeEnrollDocIssuer}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeySender, Value: accOperator.String()}) - } - } - - f.Cleanup() -} - -func TestGentlemint_RevokeIssuer_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accOperator := f.KeyAddress(keyAccOp) - _, issuers := createRandomAddr(3) - - // Enroll issuer - f.EnrollDocIssuer(issuers, fmt.Sprintf("--from %s --yes --fees 1shr", accOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - _, stdOut, _ := f.RevokeDocIssuer([]sdk.AccAddress{issuers[0], issuers[1]}, fmt.Sprintf("--from %s --yes --fees 1shr", accOperator.String())) - txRepsonse := sdk.TxResponse{} - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdOut), &txRepsonse) - require.Nil(t, err) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - acc := f.QueryDocumentIssuer(issuers[0]) - - require.Equal(t, acc.Address, issuers[0]) - require.Equal(t, acc.Status, gentlemint.InactiveStatus) - - // Check events - for _, event := range txRepsonse.Logs[0].Events { - if event.Type == gentTypes.EventTypeRevokeDocIssuer { - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: issuers[0].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: issuers[1].String()}) - // require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: issuers[2].String()}) - } else if event.Type == sdk.EventTypeMessage { - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyModule, Value: gentTypes.ModuleName}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyAction, Value: gentTypes.EventTypeRevokeDocIssuer}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeySender, Value: accOperator.String()}) - } - } - - f.Cleanup() -} - -func TestGentlemint_RevokeIssuer_NotAccountOperator(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - authority := f.KeyAddress(keyAuthority) - - // Enroll issuer - f.EnrollDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1shr", accOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - _, stdOut, _ := f.RevokeDocIssuer([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - acc := f.QueryDocumentIssuer(issuer) - - require.Equal(t, acc.Address, issuer) - require.Equal(t, acc.Status, gentlemint.ActiveStatus) - require.Contains(t, stdOut, gentTypes.ErrSenderIsNotAccountOperator) - - f.Cleanup() -} - -//_________________________________________________________________________________ - -func TestGentlemint_EnrollIdSigner_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - // user1 := f.KeyAddress(keyUser1) - // user2 := f.KeyAddress(keyUser2) - // user3 := f.KeyAddress(keyUser3) - - _, signers := createRandomAddr(3) - // Enroll id signer - success, stdOut, _ := f.EnrollIdSigner(signers, fmt.Sprintf("--from %s --yes --fees 1shr", accountOperator.String())) - - txRepsonse := sdk.TxResponse{} - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdOut), &txRepsonse) - require.Nil(t, err) - - require.True(t, success) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - ids1 := f.QuerySigner(signers[0]) - - require.NotNil(t, ids1) - require.Equal(t, ids1.Address.String(), signers[0].String()) - require.True(t, ids1.IsActive()) - - ids2 := f.QuerySigner(signers[1]) - - require.NotNil(t, ids2) - require.Equal(t, ids2.Address.String(), signers[1].String()) - require.True(t, ids2.IsActive()) - - ids3 := f.QuerySigner(signers[2]) - - require.NotNil(t, ids3) - require.Equal(t, ids3.Address.String(), signers[2].String()) - require.True(t, ids3.IsActive()) - - // Check events - expectEvents := []string{gentTypes.EventTypeEnrollIdSigner, sdk.EventTypeMessage, "transfer"} - for _, event := range txRepsonse.Logs[0].Events { - require.Contains(t, expectEvents, event.Type) - if event.Type == gentTypes.EventTypeEnrollIdSigner { - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: signers[0].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: signers[1].String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: signers[2].String()}) - } else if event.Type == sdk.EventTypeMessage { - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyModule, Value: gentTypes.ModuleName}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyAction, Value: gentTypes.EventTypeEnrollIdSigner}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeySender, Value: accountOperator.String()}) - } - } - - f.Cleanup() -} - -func TestGentlemint_EnrollIdSigner_NotAccountOperator(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - treasurer := f.KeyAddress(keyTreasurer) - user1 := f.KeyAddress(keyUser1) - user2 := f.KeyAddress(keyUser2) - - // Enroll id signer - success, stdOut, _ := f.EnrollIdSigner([]sdk.AccAddress{user1, user2}, fmt.Sprintf("--from %s --yes --fees 1shr", treasurer.String())) - require.Contains(t, stdOut, gentTypes.ErrSenderIsNotAccountOperator) - require.True(t, success) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - ids1 := f.QuerySigner(user1) - require.NotNil(t, ids1) - require.True(t, ids1.IsEmpty()) - require.False(t, ids1.IsActive()) - - ids2 := f.QuerySigner(user2) - require.NotNil(t, ids2) - require.True(t, ids2.IsEmpty()) - require.False(t, ids2.IsActive()) - - f.Cleanup() -} - -func TestGentlemint_RevokeIdSigner_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - user1 := f.KeyAddress(keyUser1) - user2 := f.KeyAddress(keyUser2) - user3 := f.KeyAddress(keyUser3) - - // Enroll id signer - success, _, _ := f.EnrollIdSigner([]sdk.AccAddress{user1, user2, user3}, fmt.Sprintf("--from %s --yes --fees 1shr", accountOperator.String())) - require.True(t, success) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - // Revoke - revokeSuccess, stdOut, _ := f.RevokeIdSigner([]sdk.AccAddress{user2, user3}, fmt.Sprintf("--from %s --yes --fees 1shr", accountOperator.String())) - require.True(t, revokeSuccess) - - txRepsonse := sdk.TxResponse{} - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdOut), &txRepsonse) - require.Nil(t, err) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - ids1 := f.QuerySigner(user1) - - require.NotNil(t, ids1) - require.Equal(t, ids1.Address.String(), user1.String()) - require.True(t, ids1.IsActive()) - - ids2 := f.QuerySigner(user2) - - require.NotNil(t, ids2) - require.False(t, ids2.IsActive()) - - ids3 := f.QuerySigner(user3) - - require.NotNil(t, ids3) - require.False(t, ids3.IsActive()) - - // Check events - expectEvents := []string{gentTypes.EventTypeRevokeIdSigner, sdk.EventTypeMessage, "transfer"} - for _, event := range txRepsonse.Logs[0].Events { - require.Contains(t, expectEvents, event.Type) - if event.Type == gentTypes.EventTypeRevokeIdSigner { - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: user2.String()}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: gentTypes.EventAttrAddress, Value: user3.String()}) - - } else if event.Type == sdk.EventTypeMessage { - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyModule, Value: gentTypes.ModuleName}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeyAction, Value: gentTypes.EventTypeRevokeIdSigner}) - require.Contains(t, event.Attributes, sdk.Attribute{Key: sdk.AttributeKeySender, Value: accountOperator.String()}) - } - } - - f.Cleanup() -} - -func TestGentlemint_RevokeIdSigner_NotAccountOperator(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - treasurer := f.KeyAddress(keyTreasurer) - user1 := f.KeyAddress(keyUser1) - user2 := f.KeyAddress(keyUser2) - user3 := f.KeyAddress(keyUser3) - - // Enroll id signer - success, _, _ := f.EnrollIdSigner([]sdk.AccAddress{user1, user2, user3}, fmt.Sprintf("--from %s --yes --fees 1shr", accountOperator.String())) - require.True(t, success) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - // Revoke - _, stdOut, _ := f.RevokeIdSigner([]sdk.AccAddress{user1}, fmt.Sprintf("--from %s --yes --fees 1shr", treasurer.String())) - require.Contains(t, stdOut, gentTypes.ErrSenderIsNotAccountOperator) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - ids1 := f.QuerySigner(user1) - - require.NotNil(t, ids1) - require.Equal(t, ids1.Address.String(), user1.String()) - require.True(t, ids1.IsActive()) - - ids2 := f.QuerySigner(user2) - - require.NotNil(t, ids2) - require.Equal(t, ids2.Address.String(), user2.String()) - require.True(t, ids2.IsActive()) - - f.Cleanup() -} - -func TestGentlemint_EnrollSHRPLoader_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - enrollLoaderCmd := fmt.Sprintf("enroll-loaders %s", treasurer.String()) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - f.Cleanup() -} - -func TestGentlemint_RevokeSHRPLoader_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - enrollLoaderCmd := fmt.Sprintf("revoke-loaders %s", treasurer.String()) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - f.Cleanup() -} - -func TestGentlemint_SendSHR_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - treasurer := f.KeyAddress(keyTreasurer) - emptyAccount := f.KeyAddress(keyEmtyUser) - - amount := "100" - cmd := fmt.Sprintf("send-shr %s %s", emptyAccount.String(), amount) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(cmd, fmt.Sprintf("--from %s --yes --fees 10shr", treasurer.String())) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - balance := f.QueryAccount(emptyAccount) - - require.Equal(t, amount, balance.GetCoins().AmountOf("shr").String()) - - f.Cleanup() -} - -func TestGentlemint_SendSHRP_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - - emptyAccount := f.KeyAddress(keyEmtyUser) - amount := "10" - - loadCmd := fmt.Sprintf("load-shrp %s %s", treasurer.String(), amount) - enrollLoaderCmd := fmt.Sprintf("enroll-loaders %s", treasurer.String()) - - // Enroll - _, stdOut, _ := f.ExecuteGentlemintTxCommand(enrollLoaderCmd, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - tests.WaitForNextNBlocksTM(1, f.Port) - - txRepsonse := ParseStdOut(t, stdOut) - require.Equal(t, uint32(0), txRepsonse.Code) - - // Load - _, stdOut2, _ := f.ExecuteGentlemintTxCommand(loadCmd, fmt.Sprintf("--from %s --yes --fees 1shr", treasurer.String())) - - txRepsonse2 := ParseStdOut(t, stdOut2) - require.Equal(t, uint32(0), txRepsonse2.Code) - - // Send - cmd := fmt.Sprintf("send-shrp %s %s", emptyAccount.String(), amount) - _, stdOut3, _ := f.ExecuteGentlemintTxCommand(cmd, fmt.Sprintf("--from %s --yes --fees 10shr", treasurer.String())) - - txRepsonse3 := ParseStdOut(t, stdOut3) - require.Equal(t, uint32(0), txRepsonse3.Code) - - balance := f.QueryAccount(emptyAccount) - - require.Equal(t, amount, balance.GetCoins().AmountOf("shrp").String()) - - f.Cleanup() -} diff --git a/tests/id_test.go b/tests/id_test.go deleted file mode 100644 index fafb4900..00000000 --- a/tests/id_test.go +++ /dev/null @@ -1,544 +0,0 @@ -package tests - -import ( - "fmt" - "testing" - - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gatecheck" - "github.com/stretchr/testify/require" -) - -func TestIdCreate_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.Equal(t, id, rsId.Id) - require.Equal(t, backup.String(), rsId.BackupAddr.String()) - require.Equal(t, owner.String(), rsId.OwnerAddr.String()) - require.Equal(t, issuer.String(), rsId.IssuerAddr.String()) - require.Equal(t, extraData, rsId.ExtraData) - - rsId2 := f.QueryIdByOwner(owner) - - require.NotNil(t, rsId2) - require.Equal(t, id, rsId2.Id) - require.Equal(t, backup, rsId2.BackupAddr) - require.Equal(t, owner.String(), rsId2.OwnerAddr.String()) - require.Equal(t, issuer, rsId2.IssuerAddr) - require.Equal(t, extraData, rsId2.ExtraData) - - f.Cleanup() -} - -func TestIdCreate_LowFee(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - revokeRs, stdOut, _ := f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 100000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, revokeRs) - require.Contains(t, stdOut, "required: 600000000shr") - - f.Cleanup() -} - -func TestIdCreateInBatch_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - issuer := f.KeyAddress(keyIdSigner) - accountOperator := f.KeyAddress(keyAccOp) - - _, owners := createRandomAddr(3) - _, backups := createRandomAddr(3) - - ids := []string{"id-b-1", "id-b-2", "id-b-3"} - extras := []string{"extras-b-1", "extras-b-2", "extras-b-3"} - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateIdInBatch(ids, backups, owners, extras, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - for i, id := range ids { - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.Equal(t, ids[i], rsId.Id) - require.Equal(t, backups[i].String(), rsId.BackupAddr.String()) - require.Equal(t, owners[i].String(), rsId.OwnerAddr.String()) - require.Equal(t, issuer.String(), rsId.IssuerAddr.String()) - require.Equal(t, extras[i], rsId.ExtraData) - } - - f.Cleanup() -} -func TestIdCreateInBatch_LowFee(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - issuer := f.KeyAddress(keyIdSigner) - accountOperator := f.KeyAddress(keyAccOp) - - _, owners := createRandomAddr(3) - _, backups := createRandomAddr(3) - - ids := []string{"id-b-1", "id-b-2", "id-b-3"} - extras := []string{"extras-b-1", "extras-b-2", "extras-b-3"} - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - revokeRs, stdOut, _ := f.CreateIdInBatch(ids, backups, owners, extras, fmt.Sprintf("--from %s --yes --fees 10000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - require.True(t, revokeRs) - require.Contains(t, stdOut, "required: 1800000000shr") - - // wait for a block confirmation - // tests.WaitForNextNBlocksTM(1, f.Port) - - f.Cleanup() -} - -func TestIdCreateInBatch_CallerIsNotIdSigner(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - treasurer := f.KeyAddress(keyTreasurer) - - _, owners := createRandomAddr(3) - _, backups := createRandomAddr(3) - - ids := []string{"id-b-1", "id-b-2", "id-b-3"} - extras := []string{"extras-b-1", "extras-b-2", "extras-b-3"} - - _, stdOut, _ := f.CreateIdInBatch(ids, backups, owners, extras, fmt.Sprintf("--from %s --yes --fees 1000000000shr", treasurer.String())) - - require.Contains(t, stdOut, gatecheck.NotIdSignerErr) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - for _, id := range ids { - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.True(t, rsId.IsEmpty()) - } - - f.Cleanup() -} - -func TestIdCreate_CallerIsNotIssuer(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - issuer := f.KeyAddress(keyValidator) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-not-issuer" - extraData := "extradata-002" - - _, stdOut, _ := f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - require.Contains(t, stdOut, gatecheck.NotIdSignerErr) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.Equal(t, id, rsId.Id) - require.Empty(t, rsId.BackupAddr) - require.Empty(t, rsId.OwnerAddr.String()) - require.Empty(t, rsId.IssuerAddr) - require.Empty(t, rsId.ExtraData) - - rsId2 := f.QueryIdByOwner(owner) - - require.NotNil(t, rsId2) - require.Empty(t, rsId2.Id) - require.Empty(t, rsId2.BackupAddr) - require.Empty(t, rsId2.OwnerAddr.String()) - require.Empty(t, rsId2.IssuerAddr) - require.Empty(t, rsId2.ExtraData) - - f.Cleanup() -} - -func TestIdUpdate_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.Equal(t, id, rsId.Id) - require.Equal(t, backup.String(), rsId.BackupAddr.String()) - require.Equal(t, owner.String(), rsId.OwnerAddr.String()) - require.Equal(t, issuer.String(), rsId.IssuerAddr.String()) - require.Equal(t, extraData, rsId.ExtraData) - - // Update id - newExtradata := "newExtradata" - f.UpdateId(id, newExtradata, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - updatedId := f.QueryIdById(id) - - require.NotNil(t, updatedId) - require.Equal(t, id, updatedId.Id) - require.Equal(t, backup.String(), updatedId.BackupAddr.String()) - require.Equal(t, owner.String(), updatedId.OwnerAddr.String()) - require.Equal(t, issuer.String(), updatedId.IssuerAddr.String()) - require.Equal(t, newExtradata, updatedId.ExtraData) - - f.Cleanup() -} - -func TestIdUpdate_LowFee(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - // Update id - newExtradata := "newExtradata" - - revokeRs, stdOut, _ := f.UpdateId(id, newExtradata, fmt.Sprintf("--from %s --yes --fees 10000shr", issuer.String())) - require.True(t, revokeRs) - require.Contains(t, stdOut, "600000000shr") - - f.Cleanup() -} - -func TestIdUpdate_CallerIsNotIdSigner(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - user3 := f.KeyAddress(keyUser3) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.Equal(t, id, rsId.Id) - require.Equal(t, backup.String(), rsId.BackupAddr.String()) - require.Equal(t, owner.String(), rsId.OwnerAddr.String()) - require.Equal(t, issuer.String(), rsId.IssuerAddr.String()) - require.Equal(t, extraData, rsId.ExtraData) - - // Update id - newExtradata := "newExtradata" - _, stdOut, _ := f.UpdateId(id, newExtradata, fmt.Sprintf("--from %s --yes --fees 1000000000shr", user3.String())) - - require.Contains(t, stdOut, gatecheck.NotIdSignerErr) - - updatedId := f.QueryIdById(id) - - require.NotNil(t, updatedId) - require.Equal(t, id, updatedId.Id) - require.Equal(t, backup.String(), updatedId.BackupAddr.String()) - require.Equal(t, owner.String(), updatedId.OwnerAddr.String()) - require.Equal(t, issuer.String(), updatedId.IssuerAddr.String()) - require.Equal(t, extraData, updatedId.ExtraData) - - f.Cleanup() -} - -func TestIdReplaceOwner_Success(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.Equal(t, id, rsId.Id) - require.Equal(t, backup.String(), rsId.BackupAddr.String()) - require.Equal(t, owner.String(), rsId.OwnerAddr.String()) - require.Equal(t, issuer.String(), rsId.IssuerAddr.String()) - require.Equal(t, extraData, rsId.ExtraData) - - // Update id - f.ReplaceIdOwner(id, backup, fmt.Sprintf("--from %s --yes --fees 1000000000shr", backup.String())) - - updatedId := f.QueryIdById(id) - - require.NotNil(t, updatedId) - require.Equal(t, id, updatedId.Id) - require.Equal(t, backup.String(), updatedId.BackupAddr.String()) - require.Equal(t, backup.String(), updatedId.OwnerAddr.String()) - require.Equal(t, issuer.String(), updatedId.IssuerAddr.String()) - require.Equal(t, extraData, updatedId.ExtraData) - - f.Cleanup() -} - -func TestIdReplaceOwner_LowFee(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - revokeRs, stdOut, _ := f.ReplaceIdOwner(id, backup, fmt.Sprintf("--from %s --yes --fees 100000shr", backup.String())) - - require.True(t, revokeRs) - require.Contains(t, stdOut, "required: 600000000shr") - - f.Cleanup() -} - -func TestIdReplaceOwner_CallerIsNotBackup(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - defer proc.Stop(false) - - // Save key addresses for later use - accountOperator := f.KeyAddress(keyAccOp) - issuer := f.KeyAddress(keyIdSigner) - owner := f.KeyAddress(keyUser1) - backup := f.KeyAddress(keyUser2) - id := "id-001" - extraData := "extradata-001" - - // Enroll id signer - f.EnrollIdSigner([]sdk.AccAddress{issuer}, fmt.Sprintf("--from %s --yes --fees 1000000000shr", accountOperator.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateId(id, backup, owner, extraData, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - rsId := f.QueryIdById(id) - - require.NotNil(t, rsId) - require.Equal(t, id, rsId.Id) - require.Equal(t, backup.String(), rsId.BackupAddr.String()) - require.Equal(t, owner.String(), rsId.OwnerAddr.String()) - require.Equal(t, issuer.String(), rsId.IssuerAddr.String()) - require.Equal(t, extraData, rsId.ExtraData) - - // Update id - _, stdOut, _ := f.ReplaceIdOwner(id, backup, fmt.Sprintf("--from %s --yes --fees 1000000000shr", issuer.String())) - - require.Contains(t, stdOut, gatecheck.NotBackupAccountErr) - - updatedId := f.QueryIdById(id) - - require.NotNil(t, updatedId) - require.Equal(t, id, updatedId.Id) - require.Equal(t, backup.String(), updatedId.BackupAddr.String()) - require.Equal(t, owner.String(), updatedId.OwnerAddr.String()) - require.Equal(t, issuer.String(), updatedId.IssuerAddr.String()) - require.Equal(t, extraData, updatedId.ExtraData) - - f.Cleanup() -} diff --git a/tests/main_test.go b/tests/main_test.go deleted file mode 100644 index 513fefef..00000000 --- a/tests/main_test.go +++ /dev/null @@ -1,101 +0,0 @@ -package tests - -import ( - "fmt" - "testing" - - app "github.com/sharering/shareledger" - "github.com/sharering/shareledger/x/gentlemint" - "github.com/stretchr/testify/require" - - id "github.com/ShareRing/modules/id" - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - genutil "github.com/cosmos/cosmos-sdk/x/genutil" -) - -func TestMain_ExportGenesis_Gentlemint_ID(t *testing.T) { - t.Parallel() - f := InitFixtures(t) - - // start gaiad server with minimum fees - minGasPrice, _ := sdk.NewDecFromStr("0.000006") - proc := f.GDStart(fmt.Sprintf("--minimum-gas-prices=%s", sdk.NewDecCoinFromDec(feeDenom, minGasPrice))) - - // Save key addresses for later use - issuer := f.KeyAddress(keyIdSigner) - issuer2 := f.KeyAddress(keyUser1) - authority := f.KeyAddress(keyAuthority) - treasurer := f.KeyAddress(keyTreasurer) - operator := f.KeyAddress(keyAccOp) - - _, owners := createRandomAddr(3) - _, backups := createRandomAddr(3) - - ids := []string{"id-b-1", "id-b-2", "id-b-3"} - extras := []string{"extras-b-1", "extras-b-2", "extras-b-3"} - proofs := []string{"proofs-b-1", "proofs-b-2", "proofs-b-3"} - - // Enroll sepcial account - f.EnrollIdSigner([]sdk.AccAddress{issuer, issuer2}, fmt.Sprintf("--from %s --yes --fees 1shr", operator.String())) - f.EnrollDocIssuer([]sdk.AccAddress{issuer, issuer2}, fmt.Sprintf("--from %s --yes --fees 1shr", operator.String())) - f.EnrollAccountOperator([]sdk.AccAddress{issuer, issuer2}, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - f.CreateIdInBatch(ids, backups, owners, extras, fmt.Sprintf("--from %s --yes --fees 1shr", issuer.String())) - f.CreateNewDocInBatch(ids, proofs, extras, fmt.Sprintf("--from %s --yes --fees 1shr", issuer.String())) - - f.RevokeIdSigner([]sdk.AccAddress{issuer2}, fmt.Sprintf("--from %s --yes --fees 1shr", operator.String())) - f.RevokeDocIssuer([]sdk.AccAddress{issuer2}, fmt.Sprintf("--from %s --yes --fees 1shr", operator.String())) - f.RevokeAccountOperator([]sdk.AccAddress{issuer2}, fmt.Sprintf("--from %s --yes --fees 1shr", authority.String())) - - // wait for a block confirmation - tests.WaitForNextNBlocksTM(1, f.Port) - - proc.Stop(false) - - cdc := app.MakeCodec() - - gen, _ := f.ExportGenesis("") - - appState, _ := genutil.GenesisStateFromGenDoc(cdc, *gen) - - gentlemintGenState := gentlemint.GetGenesisStateFromAppState(cdc, appState) - require.Equal(t, authority.String(), gentlemintGenState.Authority) - require.Equal(t, treasurer.String(), gentlemintGenState.Treasurer) - - require.Equal(t, 2, len(gentlemintGenState.IdSigners)) - require.Equal(t, 2, len(gentlemintGenState.DocumentIssuer)) - require.Equal(t, 3, len(gentlemintGenState.AccountOperators)) - - for _, signer := range gentlemintGenState.IdSigners { - if signer.Address.Equals(issuer2) { - require.Equal(t, gentlemint.InactiveStatus, signer.Status) - } else { - require.Equal(t, gentlemint.ActiveStatus, signer.Status) - } - } - - for _, operator := range gentlemintGenState.AccountOperators { - if operator.Address.Equals(issuer2) { - require.Equal(t, gentlemint.InactiveStatus, operator.Status) - } else { - require.Equal(t, gentlemint.ActiveStatus, operator.Status) - } - } - - for _, issuer := range gentlemintGenState.DocumentIssuer { - if issuer.Address.Equals(issuer2) { - require.Equal(t, gentlemint.InactiveStatus, issuer.Status) - } else { - require.Equal(t, gentlemint.ActiveStatus, issuer.Status) - } - } - - idGenState := id.GetGenesisStateFromAppState(cdc, appState) - fmt.Println(idGenState.IDs) - require.Equal(t, len(ids), len(idGenState.IDs)) - - f.Cleanup() -} diff --git a/tests/test_helpers.go b/tests/test_helpers.go deleted file mode 100644 index 62eb4320..00000000 --- a/tests/test_helpers.go +++ /dev/null @@ -1,919 +0,0 @@ -/* - * Based on https://github.com/cosmos/gaia/blob/v2.0.12/cli_test/cli_test.go - */ -package tests - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/tendermint/tendermint/crypto/secp256k1" - "github.com/tendermint/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" - - app "github.com/sharering/shareledger" - apptypes "github.com/sharering/shareledger/types" - - clientkeys "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/staking" - - idtypes "github.com/ShareRing/modules/id/types" - shareringUtils "github.com/ShareRing/modules/utils" -) - -const ( - denom = "shr" - - keyAuthority = "authority" - keyTreasurer = "treasurer" - keyValidator = "validator" - keyIdSigner = "id-signer" - keyAccOp = "acc-op" - keyDocIssuer = "doc-issuer" - keyUser1 = "user1" - keyUser2 = "user2" - keyUser3 = "user3" - keyEmtyUser = "emptyUser" - - fooDenom = "footoken" - feeDenom = "shr" - fee2Denom = "fee2token" - - keyBaz = "baz" - keyVesting = "vesting" - keyFooBarBaz = "foobarbaz" - - DefaultKeyPass = "12345678" -) - -var ( - totalCoins = sdk.NewCoins( - // sdk.NewCoin(fee2Denom, sdk.TokensFromConsensusPower(2000000)), - // sdk.NewCoin(feeDenom, sdk.TokensFromConsensusPower(2000000)), - // sdk.NewCoin(fooDenom, sdk.TokensFromConsensusPower(2000)), - sdk.NewCoin(denom, sdk.TokensFromConsensusPower(300).Add(sdk.NewInt(12))), // add coins from inflation - ) - - startCoins = sdk.NewCoins( - // sdk.NewCoin(fee2Denom, sdk.TokensFromConsensusPower(1000000)), - // sdk.NewCoin(feeDenom, sdk.TokensFromConsensusPower(1000000)), - // sdk.NewCoin(fooDenom, sdk.TokensFromConsensusPower(1000)), - sdk.NewCoin(denom, shareringUtils.SHRDecimal.Mul(sdk.NewInt(int64(1000)))), - ) - - vestingCoins = sdk.NewCoins( - sdk.NewCoin(feeDenom, sdk.TokensFromConsensusPower(500000)), - ) -) - -//___________________________________________________________________________________ -// Fixtures - -// Fixtures is used to setup the testing environment -type Fixtures struct { - BuildDir string - RootDir string - GaiadBinary string - GaiacliBinary string - ChainID string - RPCAddr string - Port string - GaiadHome string - GaiacliHome string - P2PAddr string - T *testing.T -} - -// NewFixtures creates a new instance of Fixtures with many vars set -func NewFixtures(t *testing.T) *Fixtures { - tmpDir, err := ioutil.TempDir("", "shareledger_integration_"+t.Name()+"_") - require.NoError(t, err) - - servAddr, port, err := server.FreeTCPAddr() - require.NoError(t, err) - - p2pAddr, _, err := server.FreeTCPAddr() - require.NoError(t, err) - - buildDir := os.Getenv("BUILDDIR") - if buildDir == "" { - buildDir, err = filepath.Abs("../build/") - require.NoError(t, err) - } - // apptypes.ConfigureSDK() - config := sdk.GetConfig() - config.SetBech32PrefixForAccount(apptypes.Bech32PrefixAccAddr, apptypes.Bech32PrefixAccPub) - config.SetBech32PrefixForValidator(apptypes.Bech32PrefixValAddr, apptypes.Bech32PrefixValPub) - config.SetBech32PrefixForConsensusNode(apptypes.Bech32PrefixConsAddr, apptypes.Bech32PrefixConsPub) - - return &Fixtures{ - T: t, - BuildDir: buildDir, - RootDir: tmpDir, - GaiadBinary: filepath.Join(buildDir, "shareledger"), - GaiacliBinary: filepath.Join(buildDir, "slcli"), - GaiadHome: filepath.Join(tmpDir, ".shareledger"), - GaiacliHome: filepath.Join(tmpDir, ".slcli"), - RPCAddr: servAddr, - P2PAddr: p2pAddr, - Port: port, - } -} - -// GenesisFile returns the path of the genesis file -func (f Fixtures) GenesisFile() string { - return filepath.Join(f.GaiadHome, "config", "genesis.json") -} - -// GenesisFile returns the application's genesis state -func (f Fixtures) GenesisState() simapp.GenesisState { - cdc := codec.New() - genDoc, err := tmtypes.GenesisDocFromFile(f.GenesisFile()) - require.NoError(f.T, err) - - var appState simapp.GenesisState - require.NoError(f.T, cdc.UnmarshalJSON(genDoc.AppState, &appState)) - return appState -} - -// InitFixtures is called at the beginning of a test and initializes a chain -// with 1 validator. -func InitFixtures(t *testing.T) (f *Fixtures) { - f = NewFixtures(t) - - // reset test state - f.UnsafeResetAll() - f.CLIConfig("keyring-backend", "test") - - // ensure keystore has foo and bar keys - f.KeysDelete(keyAuthority) - f.KeysDelete(keyTreasurer) - f.KeysDelete(keyValidator) - f.KeysDelete(keyIdSigner) - f.KeysDelete(keyAccOp) - f.KeysDelete(keyDocIssuer) - - f.KeysDelete(keyUser1) - f.KeysDelete(keyUser2) - f.KeysDelete(keyUser3) - f.KeysDelete(keyEmtyUser) - - f.KeysAdd(keyAuthority) - f.KeysAdd(keyTreasurer) - f.KeysAdd(keyValidator) - f.KeysAdd(keyIdSigner) - - f.KeysAdd(keyUser1) - f.KeysAdd(keyUser2) - f.KeysAdd(keyUser3) - f.KeysAdd(keyEmtyUser) - - f.KeysAdd(keyAccOp) - f.KeysAdd(keyDocIssuer) - - // ensure that CLI output is in JSON format - f.CLIConfig("output", "json") - - // NOTE: GDInit sets the ChainID - f.GDInit(keyValidator) - f.CLIConfig("chain-id", f.ChainID) - f.CLIConfig("broadcast-mode", "block") - f.CLIConfig("trust-node", "true") - - f.KeysShow(keyValidator) - - // start an account with tokens - f.AddGenesisAccount(f.KeyAddress(keyAuthority), startCoins) - f.AddGenesisAccount(f.KeyAddress(keyTreasurer), startCoins) - f.AddGenesisAccount(f.KeyAddress(keyValidator), startCoins) - f.AddGenesisAccount(f.KeyAddress(keyIdSigner), startCoins) - f.AddGenesisAccount(f.KeyAddress(keyDocIssuer), startCoins) - - f.AddGenesisAccount(f.KeyAddress(keyUser1), startCoins) - f.AddGenesisAccount(f.KeyAddress(keyUser2), startCoins) - f.AddGenesisAccount(f.KeyAddress(keyUser3), startCoins) - - f.AddGenesisAccount(f.KeyAddress(keyAccOp), startCoins) - - f.AddGenesisAuthorityAccount(f.KeyAddress(keyAuthority)) - f.AddGenesisTreasurerAccount(f.KeyAddress(keyTreasurer)) - f.AddGenesisValidatorAccount(f.KeyAddress(keyValidator)) - f.AddGenesisOperatorAccount(f.KeyAddress(keyAccOp)) - - f.GenTx(keyValidator, "--keyring-backend test --amount=1000000shr") - f.CollectGenTxs() - - return -} - -// Cleanup is meant to be run at the end of a test to clean up an remaining test state -func (f *Fixtures) Cleanup(dirs ...string) { - clean := append(dirs, f.RootDir) - for _, d := range clean { - require.NoError(f.T, os.RemoveAll(d)) - } -} - -// Flags returns the flags necessary for making most CLI calls -func (f *Fixtures) Flags() string { - return fmt.Sprintf("--home=%s --node=%s", f.GaiacliHome, f.RPCAddr) -} - -//___________________________________________________________________________________ -// id -func (f *Fixtures) CreateId(id string, backup, owner sdk.AccAddress, extraData string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx id create %s %s %s %s %v", f.GaiacliBinary, id, backup, owner, extraData, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) CreateIdInBatch(id []string, backup, owner []sdk.AccAddress, extraData []string, flags ...string) (bool, string, string) { - sep := "," - - backupArr := make([]string, 0, len(backup)) - ownerArr := make([]string, 0, len(backup)) - - for i := 0; i < len(backup); i++ { - backupArr = append(backupArr, backup[i].String()) - ownerArr = append(ownerArr, owner[i].String()) - } - - ids := strings.Join(id, sep) - owners := strings.Join(ownerArr, sep) - backups := strings.Join(backupArr, sep) - extras := strings.Join(extraData, sep) - - cmd := fmt.Sprintf("%s tx id create-batch %s %s %s %s %v", f.GaiacliBinary, ids, backups, owners, extras, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) ReplaceIdOwner(id string, newOwner sdk.AccAddress, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx id replace %s %s %v", f.GaiacliBinary, id, newOwner.String(), f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) UpdateId(id, extraData string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx id update %s %s %v", f.GaiacliBinary, id, extraData, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) QueryIdById(id string, flags ...string) idtypes.ID { - cmd := fmt.Sprintf("%s query id info id %s %v", f.GaiacliBinary, id, f.Flags()) - - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var idRs idtypes.ID - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &idRs) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return idRs -} - -func (f *Fixtures) QueryIdByOwner(owner sdk.Address, flags ...string) idtypes.ID { - cmd := fmt.Sprintf("%s query id info address %s %v", f.GaiacliBinary, owner.String(), f.Flags()) - - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var idRs idtypes.ID - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &idRs) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return idRs -} - -//___________________________________________________________________________________ -// gaiad - -// UnsafeResetAll is gaiad unsafe-reset-all -func (f *Fixtures) UnsafeResetAll(flags ...string) { - cmd := fmt.Sprintf("%s --home=%s unsafe-reset-all", f.GaiadBinary, f.GaiadHome) - executeWrite(f.T, addFlags(cmd, flags)) - err := os.RemoveAll(filepath.Join(f.GaiadHome, "config", "gentx")) - require.NoError(f.T, err) -} - -// GDInit is gaiad init -// NOTE: GDInit sets the ChainID for the Fixtures instance -func (f *Fixtures) GDInit(moniker string, flags ...string) { - cmd := fmt.Sprintf("%s init -o --home=%s %s", f.GaiadBinary, f.GaiadHome, moniker) - _, stderr := tests.ExecuteT(f.T, addFlags(cmd, flags), DefaultKeyPass) - - var chainID string - var initRes map[string]json.RawMessage - - err := json.Unmarshal([]byte(stderr), &initRes) - require.NoError(f.T, err) - - err = json.Unmarshal(initRes["chain_id"], &chainID) - require.NoError(f.T, err) - - f.ChainID = chainID -} - -// AddGenesisAccount is gaiad add-genesis-account -func (f *Fixtures) AddGenesisAccount(address sdk.AccAddress, coins sdk.Coins, flags ...string) { - cmd := fmt.Sprintf("%s add-genesis-account %s %s --home=%s", f.GaiadBinary, address, coins, f.GaiadHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags)) -} - -// GenTx is gaiad gentx -func (f *Fixtures) GenTx(name string, flags ...string) { - cmd := fmt.Sprintf("%s gentx --name=%s --home=%s --home-client=%s", f.GaiadBinary, name, f.GaiadHome, f.GaiacliHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// CollectGenTxs is gaiad collect-gentxs -func (f *Fixtures) CollectGenTxs(flags ...string) { - cmd := fmt.Sprintf("%s collect-gentxs --home=%s", f.GaiadBinary, f.GaiadHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// GDStart runs gaiad start with the appropriate flags and returns a process -func (f *Fixtures) GDStart(flags ...string) *tests.Process { - cmd := fmt.Sprintf("%s start --home=%s --rpc.laddr=%v --p2p.laddr=%v", f.GaiadBinary, f.GaiadHome, f.RPCAddr, f.P2PAddr) - proc := tests.GoExecuteTWithStdout(f.T, addFlags(cmd, flags)) - tests.WaitForTMStart(f.Port) - tests.WaitForNextNBlocksTM(1, f.Port) - return proc -} - -// GDTendermint returns the results of gaiad tendermint [query] -func (f *Fixtures) GDTendermint(query string) string { - cmd := fmt.Sprintf("%s tendermint %s --home=%s", f.GaiadBinary, query, f.GaiadHome) - success, stdout, stderr := executeWriteRetStdStreams(f.T, cmd) - require.Empty(f.T, stderr) - require.True(f.T, success) - return strings.TrimSpace(stdout) -} - -// ValidateGenesis runs gaiad validate-genesis -func (f *Fixtures) ValidateGenesis() { - cmd := fmt.Sprintf("%s validate-genesis --home=%s", f.GaiadBinary, f.GaiadHome) - executeWriteCheckErr(f.T, cmd) -} - -// gentlemint: Add default system accounts to genesis -func (f *Fixtures) AddGenesisAuthorityAccount(address sdk.AccAddress, flags ...string) { - cmd := fmt.Sprintf("%s add-genesis-authority %s --home=%s", f.GaiadBinary, address, f.GaiadHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags)) -} - -func (f *Fixtures) AddGenesisTreasurerAccount(address sdk.AccAddress, flags ...string) { - cmd := fmt.Sprintf("%s add-genesis-treasurer %s --home=%s", f.GaiadBinary, address, f.GaiadHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags)) -} -func (f *Fixtures) AddGenesisValidatorAccount(address sdk.AccAddress, flags ...string) { - cmd := fmt.Sprintf("%s add-genesis-validator %s --home=%s", f.GaiadBinary, address, f.GaiadHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags)) -} - -func (f *Fixtures) AddGenesisOperatorAccount(address sdk.AccAddress, flags ...string) { - cmd := fmt.Sprintf("%s add-genesis-account-operator %s --home=%s", f.GaiadBinary, address, f.GaiadHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags)) -} - -//___________________________________________________________________________________ -// gaiacli keys - -// KeysDelete is gaiacli keys delete -func (f *Fixtures) KeysDelete(name string, flags ...string) { - cmd := fmt.Sprintf("%s keys delete --home=%s %s", f.GaiacliBinary, f.GaiacliHome, name) - executeWrite(f.T, addFlags(cmd, append(append(flags, "-y"), "-f"))) -} - -// KeysAdd is gaiacli keys add -func (f *Fixtures) KeysAdd(name string, flags ...string) { - cmd := fmt.Sprintf("%s keys add --home=%s %s", f.GaiacliBinary, f.GaiacliHome, name) - executeWriteCheckErr(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// KeysAddRecover prepares gaiacli keys add --recover -func (f *Fixtures) KeysAddRecover(name, mnemonic string, flags ...string) (exitSuccess bool, stdout, stderr string) { - cmd := fmt.Sprintf("%s keys add --home=%s --recover %s", f.GaiacliBinary, f.GaiacliHome, name) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass, mnemonic) -} - -// KeysAddRecoverHDPath prepares gaiacli keys add --recover --account --index -func (f *Fixtures) KeysAddRecoverHDPath(name, mnemonic string, account uint32, index uint32, flags ...string) { - cmd := fmt.Sprintf("%s keys add --home=%s --recover %s --account %d --index %d", f.GaiacliBinary, f.GaiacliHome, name, account, index) - executeWriteCheckErr(f.T, addFlags(cmd, flags), DefaultKeyPass, mnemonic) -} - -// KeysShow is gaiacli keys show -func (f *Fixtures) KeysShow(name string, flags ...string) keys.KeyOutput { - cmd := fmt.Sprintf("%s keys show --home=%s %s", f.GaiacliBinary, f.GaiacliHome, name) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var ko keys.KeyOutput - err := clientkeys.UnmarshalJSON([]byte(out), &ko) - require.NoError(f.T, err) - return ko -} - -// KeyAddress returns the SDK account address from the key -func (f *Fixtures) KeyAddress(name string) sdk.AccAddress { - ko := f.KeysShow(name) - accAddr, err := sdk.AccAddressFromBech32(ko.Address) - require.NoError(f.T, err) - return accAddr -} - -//___________________________________________________________________________________ -// gaiacli config - -// CLIConfig is gaiacli config -func (f *Fixtures) CLIConfig(key, value string, flags ...string) { - cmd := fmt.Sprintf("%s config --home=%s %s %s", f.GaiacliBinary, f.GaiacliHome, key, value) - executeWriteCheckErr(f.T, addFlags(cmd, flags)) -} - -//___________________________________________________________________________________ -// gaiacli tx send/sign/broadcast - -// TxSend is gaiacli tx send -func (f *Fixtures) TxSend(from string, to sdk.AccAddress, amount sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx send %s %s %s %v", f.GaiacliBinary, from, to, amount, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxSign is gaiacli tx sign -func (f *Fixtures) TxSign(signer, fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx sign %v --from=%s %v", f.GaiacliBinary, f.Flags(), signer, fileName) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxBroadcast is gaiacli tx broadcast -func (f *Fixtures) TxBroadcast(fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx broadcast %v %v", f.GaiacliBinary, f.Flags(), fileName) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxEncode is gaiacli tx encode -func (f *Fixtures) TxEncode(fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx encode %v %v", f.GaiacliBinary, f.Flags(), fileName) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxMultisign is gaiacli tx multisign -func (f *Fixtures) TxMultisign(fileName, name string, signaturesFiles []string, - flags ...string) (bool, string, string) { - - cmd := fmt.Sprintf("%s tx multisign %v %s %s %s", f.GaiacliBinary, f.Flags(), - fileName, name, strings.Join(signaturesFiles, " "), - ) - return executeWriteRetStdStreams(f.T, cmd) -} - -//___________________________________________________________________________________ -// gaiacli tx staking - -// TxStakingCreateValidator is gaiacli tx staking create-validator -func (f *Fixtures) TxStakingCreateValidator(from, consPubKey string, amount sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx staking create-validator %v --from=%s --pubkey=%s", f.GaiacliBinary, f.Flags(), from, consPubKey) - cmd += fmt.Sprintf(" --amount=%v --moniker=%v --commission-rate=%v", amount, from, "0.05") - cmd += fmt.Sprintf(" --commission-max-rate=%v --commission-max-change-rate=%v", "0.20", "0.10") - cmd += fmt.Sprintf(" --min-self-delegation=%v", "1") - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxStakingUnbond is gaiacli tx staking unbond -func (f *Fixtures) TxStakingUnbond(from, shares string, validator sdk.ValAddress, flags ...string) bool { - cmd := fmt.Sprintf("%s tx staking unbond %s %v --from=%s %v", f.GaiacliBinary, validator, shares, from, f.Flags()) - return executeWrite(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -//___________________________________________________________________________________ -// gaiacli tx gov - -// TxGovSubmitProposal is gaiacli tx gov submit-proposal -func (f *Fixtures) TxGovSubmitProposal(from, typ, title, description string, deposit sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx gov submit-proposal %v --from=%s --type=%s", f.GaiacliBinary, f.Flags(), from, typ) - cmd += fmt.Sprintf(" --title=%s --description=%s --deposit=%s", title, description, deposit) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxGovDeposit is gaiacli tx gov deposit -func (f *Fixtures) TxGovDeposit(proposalID int, from string, amount sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx gov deposit %d %s --from=%s %v", f.GaiacliBinary, proposalID, amount, from, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxGovVote is gaiacli tx gov vote -func (f *Fixtures) TxGovVote(proposalID int, option gov.VoteOption, from string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx gov vote %d %s --from=%s %v", f.GaiacliBinary, proposalID, option, from, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxGovSubmitParamChangeProposal executes a CLI parameter change proposal -// submission. -func (f *Fixtures) TxGovSubmitParamChangeProposal( - from, proposalPath string, deposit sdk.Coin, flags ...string, -) (bool, string, string) { - - cmd := fmt.Sprintf( - "%s tx gov submit-proposal param-change %s --from=%s %v", - f.GaiacliBinary, proposalPath, from, f.Flags(), - ) - - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -// TxGovSubmitCommunityPoolSpendProposal executes a CLI community pool spend proposal -// submission. -func (f *Fixtures) TxGovSubmitCommunityPoolSpendProposal( - from, proposalPath string, deposit sdk.Coin, flags ...string, -) (bool, string, string) { - - cmd := fmt.Sprintf( - "%s tx gov submit-proposal community-pool-spend %s --from=%s %v", - f.GaiacliBinary, proposalPath, from, f.Flags(), - ) - - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -//___________________________________________________________________________________ -// gaiacli query account - -// QueryAccount is gaiacli query account -func (f *Fixtures) QueryAccount(address sdk.AccAddress, flags ...string) auth.BaseAccount { - cmd := fmt.Sprintf("%s query account %s %v", f.GaiacliBinary, address, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var initRes map[string]json.RawMessage - err := json.Unmarshal([]byte(out), &initRes) - require.NoError(f.T, err, "out %v, err %v", out, err) - value := initRes["value"] - var acc auth.BaseAccount - cdc := codec.New() - codec.RegisterCrypto(cdc) - err = cdc.UnmarshalJSON(value, &acc) - require.NoError(f.T, err, "value %v, err %v", string(value), err) - return acc -} - -//___________________________________________________________________________________ -// gaiacli query txs - -// QueryTxs is gaiacli query txs -func (f *Fixtures) QueryTxs(page, limit int, events ...string) *sdk.SearchTxsResult { - cmd := fmt.Sprintf("%s query txs --page=%d --limit=%d --events='%s' %v", f.GaiacliBinary, page, limit, queryEvents(events), f.Flags()) - out, _ := tests.ExecuteT(f.T, cmd, "") - var result sdk.SearchTxsResult - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &result) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return &result -} - -// QueryTxsInvalid query txs with wrong parameters and compare expected error -func (f *Fixtures) QueryTxsInvalid(expectedErr error, page, limit int, tags ...string) { - cmd := fmt.Sprintf("%s query txs --page=%d --limit=%d --events='%s' %v", f.GaiacliBinary, page, limit, queryEvents(tags), f.Flags()) - _, err := tests.ExecuteT(f.T, cmd, "") - require.EqualError(f.T, expectedErr, err) -} - -//___________________________________________________________________________________ -// gaiacli query staking - -// QueryStakingValidator is gaiacli query staking validator -func (f *Fixtures) QueryStakingValidator(valAddr sdk.ValAddress, flags ...string) staking.Validator { - cmd := fmt.Sprintf("%s query staking validator %s %v", f.GaiacliBinary, valAddr, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var validator staking.Validator - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &validator) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return validator -} - -// QueryStakingUnbondingDelegationsFrom is gaiacli query staking unbonding-delegations-from -func (f *Fixtures) QueryStakingUnbondingDelegationsFrom(valAddr sdk.ValAddress, flags ...string) []staking.UnbondingDelegation { - cmd := fmt.Sprintf("%s query staking unbonding-delegations-from %s %v", f.GaiacliBinary, valAddr, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var ubds []staking.UnbondingDelegation - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &ubds) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return ubds -} - -// QueryStakingDelegationsTo is gaiacli query staking delegations-to -func (f *Fixtures) QueryStakingDelegationsTo(valAddr sdk.ValAddress, flags ...string) []staking.Delegation { - cmd := fmt.Sprintf("%s query staking delegations-to %s %v", f.GaiacliBinary, valAddr, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var delegations []staking.Delegation - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &delegations) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return delegations -} - -// QueryStakingPool is gaiacli query staking pool -func (f *Fixtures) QueryStakingPool(flags ...string) staking.Pool { - cmd := fmt.Sprintf("%s query staking pool %v", f.GaiacliBinary, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var pool staking.Pool - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &pool) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return pool -} - -// QueryStakingParameters is gaiacli query staking parameters -func (f *Fixtures) QueryStakingParameters(flags ...string) staking.Params { - cmd := fmt.Sprintf("%s query staking params %v", f.GaiacliBinary, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var params staking.Params - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), ¶ms) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return params -} - -//___________________________________________________________________________________ -// gaiacli query gov - -// QueryGovParamDeposit is gaiacli query gov param deposit -func (f *Fixtures) QueryGovParamDeposit() gov.DepositParams { - cmd := fmt.Sprintf("%s query gov param deposit %s", f.GaiacliBinary, f.Flags()) - out, _ := tests.ExecuteT(f.T, cmd, "") - var depositParam gov.DepositParams - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &depositParam) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return depositParam -} - -// QueryGovParamVoting is gaiacli query gov param voting -func (f *Fixtures) QueryGovParamVoting() gov.VotingParams { - cmd := fmt.Sprintf("%s query gov param voting %s", f.GaiacliBinary, f.Flags()) - out, _ := tests.ExecuteT(f.T, cmd, "") - var votingParam gov.VotingParams - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &votingParam) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return votingParam -} - -// QueryGovParamTallying is gaiacli query gov param tallying -func (f *Fixtures) QueryGovParamTallying() gov.TallyParams { - cmd := fmt.Sprintf("%s query gov param tallying %s", f.GaiacliBinary, f.Flags()) - out, _ := tests.ExecuteT(f.T, cmd, "") - var tallyingParam gov.TallyParams - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &tallyingParam) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return tallyingParam -} - -// QueryGovProposals is gaiacli query gov proposals -func (f *Fixtures) QueryGovProposals(flags ...string) gov.Proposals { - cmd := fmt.Sprintf("%s query gov proposals %v", f.GaiacliBinary, f.Flags()) - stdout, stderr := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - if strings.Contains(stderr, "No matching proposals found") { - return gov.Proposals{} - } - require.Empty(f.T, stderr) - var out gov.Proposals - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdout), &out) - require.NoError(f.T, err) - return out -} - -// QueryGovProposal is gaiacli query gov proposal -func (f *Fixtures) QueryGovProposal(proposalID int, flags ...string) gov.Proposal { - cmd := fmt.Sprintf("%s query gov proposal %d %v", f.GaiacliBinary, proposalID, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var proposal gov.Proposal - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &proposal) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return proposal -} - -// QueryGovVote is gaiacli query gov vote -func (f *Fixtures) QueryGovVote(proposalID int, voter sdk.AccAddress, flags ...string) gov.Vote { - cmd := fmt.Sprintf("%s query gov vote %d %s %v", f.GaiacliBinary, proposalID, voter, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var vote gov.Vote - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &vote) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return vote -} - -// QueryGovVotes is gaiacli query gov votes -func (f *Fixtures) QueryGovVotes(proposalID int, flags ...string) []gov.Vote { - cmd := fmt.Sprintf("%s query gov votes %d %v", f.GaiacliBinary, proposalID, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var votes []gov.Vote - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &votes) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return votes -} - -// QueryGovDeposit is gaiacli query gov deposit -func (f *Fixtures) QueryGovDeposit(proposalID int, depositor sdk.AccAddress, flags ...string) gov.Deposit { - cmd := fmt.Sprintf("%s query gov deposit %d %s %v", f.GaiacliBinary, proposalID, depositor, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var deposit gov.Deposit - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &deposit) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return deposit -} - -// QueryGovDeposits is gaiacli query gov deposits -func (f *Fixtures) QueryGovDeposits(propsalID int, flags ...string) []gov.Deposit { - cmd := fmt.Sprintf("%s query gov deposits %d %v", f.GaiacliBinary, propsalID, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var deposits []gov.Deposit - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &deposits) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return deposits -} - -//___________________________________________________________________________________ -// query slashing - -// QuerySigningInfo returns the signing info for a validator -func (f *Fixtures) QuerySigningInfo(val string) slashing.ValidatorSigningInfo { - cmd := fmt.Sprintf("%s query slashing signing-info %s %s", f.GaiacliBinary, val, f.Flags()) - res, errStr := tests.ExecuteT(f.T, cmd, "") - require.Empty(f.T, errStr) - cdc := app.MakeCodec() - var sinfo slashing.ValidatorSigningInfo - err := cdc.UnmarshalJSON([]byte(res), &sinfo) - require.NoError(f.T, err) - return sinfo -} - -// QuerySlashingParams is gaiacli query slashing params -func (f *Fixtures) QuerySlashingParams() slashing.Params { - cmd := fmt.Sprintf("%s query slashing params %s", f.GaiacliBinary, f.Flags()) - res, errStr := tests.ExecuteT(f.T, cmd, "") - require.Empty(f.T, errStr) - cdc := app.MakeCodec() - var params slashing.Params - err := cdc.UnmarshalJSON([]byte(res), ¶ms) - require.NoError(f.T, err) - return params -} - -//___________________________________________________________________________________ -// query distribution - -// QueryRewards returns the rewards of a delegator -func (f *Fixtures) QueryRewards(delAddr sdk.AccAddress, flags ...string) distribution.QueryDelegatorTotalRewardsResponse { - cmd := fmt.Sprintf("%s query distribution rewards %s %s", f.GaiacliBinary, delAddr, f.Flags()) - res, errStr := tests.ExecuteT(f.T, cmd, "") - require.Empty(f.T, errStr) - cdc := app.MakeCodec() - var rewards distribution.QueryDelegatorTotalRewardsResponse - err := cdc.UnmarshalJSON([]byte(res), &rewards) - require.NoError(f.T, err) - return rewards -} - -//___________________________________________________________________________________ -// query supply - -// QueryTotalSupply returns the total supply of coins -func (f *Fixtures) QueryTotalSupply(flags ...string) (totalSupply sdk.Coins) { - cmd := fmt.Sprintf("%s query supply total %s", f.GaiacliBinary, f.Flags()) - res, errStr := tests.ExecuteT(f.T, cmd, "") - require.Empty(f.T, errStr) - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(res), &totalSupply) - require.NoError(f.T, err) - return totalSupply -} - -// QueryTotalSupplyOf returns the total supply of a given coin denom -func (f *Fixtures) QueryTotalSupplyOf(denom string, flags ...string) sdk.Int { - cmd := fmt.Sprintf("%s query supply total %s %s", f.GaiacliBinary, denom, f.Flags()) - res, errStr := tests.ExecuteT(f.T, cmd, "") - require.Empty(f.T, errStr) - cdc := app.MakeCodec() - var supplyOf sdk.Int - err := cdc.UnmarshalJSON([]byte(res), &supplyOf) - require.NoError(f.T, err) - return supplyOf -} - -//___________________________________________________________________________________ -// -func (f *Fixtures) ExportGenesis(flags ...string) (*tmtypes.GenesisDoc, error) { - cmd := fmt.Sprintf("%s export --home=%s", f.GaiadBinary, f.GaiadHome) - _, res, _ := executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) - - return types.GenesisDocFromJSON([]byte(res)) -} - -//___________________________________________________________________________________ -// executors - -func executeWriteCheckErr(t *testing.T, cmdStr string, writes ...string) { - require.True(t, executeWrite(t, cmdStr, writes...)) -} - -func executeWrite(t *testing.T, cmdStr string, writes ...string) (exitSuccess bool) { - exitSuccess, _, _ = executeWriteRetStdStreams(t, cmdStr, writes...) - return -} - -func executeWriteRetStdStreams(t *testing.T, cmdStr string, writes ...string) (bool, string, string) { - proc := tests.GoExecuteT(t, cmdStr) - - // Enables use of interactive commands - for _, write := range writes { - _, err := proc.StdinPipe.Write([]byte(write + "\n")) - require.NoError(t, err) - } - - // Read both stdout and stderr from the process - stdout, stderr, err := proc.ReadAll() - if err != nil { - fmt.Println("Err on proc.ReadAll()", err, cmdStr) - } - - // Log output. - if len(stdout) > 0 { - t.Log("Stdout:", string(stdout)) - } - if len(stderr) > 0 { - t.Log("Stderr:", string(stderr)) - } - - // Wait for process to exit - proc.Wait() - - // Return succes, stdout, stderr - return proc.ExitState.Success(), string(stdout), string(stderr) -} - -//___________________________________________________________________________________ -// utils - -func addFlags(cmd string, flags []string) string { - for _, f := range flags { - cmd += " " + f - } - return strings.TrimSpace(cmd) -} - -func queryEvents(events []string) (out string) { - for _, event := range events { - out += event + "&" - } - return strings.TrimSuffix(out, "&") -} - -// Write the given string to a new temporary file -func WriteToNewTempFile(t *testing.T, s string) *os.File { - fp, err := ioutil.TempFile(os.TempDir(), "cosmos_cli_test_") - require.Nil(t, err) - _, err = fp.WriteString(s) - require.Nil(t, err) - return fp -} - -func marshalStdTx(t *testing.T, stdTx auth.StdTx) []byte { - cdc := app.MakeCodec() - bz, err := cdc.MarshalBinaryBare(stdTx) - require.NoError(t, err) - return bz -} - -func unmarshalStdTx(t *testing.T, s string) (stdTx auth.StdTx) { - cdc := app.MakeCodec() - require.Nil(t, cdc.UnmarshalJSON([]byte(s), &stdTx)) - return -} - -func createRandomAddr(amount int) (prvs []secp256k1.PrivKeySecp256k1, addrs []sdk.AccAddress) { - for i := 0; i < amount; i++ { - prv := secp256k1.GenPrivKey() - addr := sdk.AccAddress(prv.PubKey().Address()) - - addrs = append(addrs, addr) - prvs = append(prvs, prv) - } - return -} diff --git a/tests/test_helpers_document_module.go b/tests/test_helpers_document_module.go deleted file mode 100644 index 9c53a7ac..00000000 --- a/tests/test_helpers_document_module.go +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Based on https://github.com/cosmos/gaia/blob/v2.0.12/cli_test/cli_test.go - */ -package tests - -import ( - "fmt" - "strings" - - doctypes "github.com/ShareRing/modules/document/types" - "github.com/cosmos/cosmos-sdk/tests" - app "github.com/sharering/shareledger" - "github.com/stretchr/testify/require" -) - -const () - -var () - -func (f *Fixtures) CreateNewDoc(holder, proof, data string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx doc create %s %s %s %v", f.GaiacliBinary, holder, proof, data, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) CreateNewDocInBatch(holder, proof, data []string, flags ...string) (bool, string, string) { - sep := "," - cmd := fmt.Sprintf("%s tx doc create-batch %s %s %s %v", f.GaiacliBinary, strings.Join(holder, sep), strings.Join(proof, sep), strings.Join(data, sep), f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) UdpateDoc(holder, proof, data string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx doc update %s %s %s %v", f.GaiacliBinary, holder, proof, data, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) RevokeDoc(holder, proof string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx doc revoke %s %s %v", f.GaiacliBinary, holder, proof, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) QueryDocByProof(proof string, flags ...string) doctypes.Doc { - cmd := fmt.Sprintf("%s query doc proof %s %v", f.GaiacliBinary, proof, f.Flags()) - - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var doc doctypes.Doc - if len(out) == 0 { - fmt.Println("STDOut is empty") - return doc - } - - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &doc) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return doc -} - -func (f *Fixtures) QueryDocByHolder(holder string, flags ...string) []doctypes.Doc { - cmd := fmt.Sprintf("%s query doc holder %s %v", f.GaiacliBinary, holder, f.Flags()) - - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - var docs []doctypes.Doc - if len(out) == 0 { - fmt.Println("STDOut is empty") - return docs - } - - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &docs) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return docs -} diff --git a/tests/test_helpers_gentlemint.go b/tests/test_helpers_gentlemint.go deleted file mode 100644 index 35cdad56..00000000 --- a/tests/test_helpers_gentlemint.go +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Based on https://github.com/cosmos/gaia/blob/v2.0.12/cli_test/cli_test.go - */ -package tests - -import ( - "fmt" - "strings" - "testing" - - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - app "github.com/sharering/shareledger" - "github.com/sharering/shareledger/x/gentlemint" - "github.com/stretchr/testify/require" -) - -const () - -var () - -//___________________________________________________________________________________ -func (f *Fixtures) EnrollDocIssuer(issuers []sdk.AccAddress, flags ...string) (bool, string, string) { - listIssuer := make([]string, 0, len(issuers)) - - for _, addr := range issuers { - listIssuer = append(listIssuer, addr.String()) - } - - signers := strings.Join(listIssuer, " ") - cmd := fmt.Sprintf("%s tx gentlemint enroll-doc-issuer %s %v", f.GaiacliBinary, signers, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) RevokeDocIssuer(issuers []sdk.AccAddress, flags ...string) (bool, string, string) { - listIssuer := make([]string, 0, len(issuers)) - - for _, addr := range issuers { - listIssuer = append(listIssuer, addr.String()) - } - - signers := strings.Join(listIssuer, " ") - cmd := fmt.Sprintf("%s tx gentlemint revoke-doc-issuer %s %v", f.GaiacliBinary, signers, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) QueryDocumentIssuer(acc sdk.AccAddress, flags ...string) gentlemint.AccState { - cmd := fmt.Sprintf("%s query gentlemint document-issuer %s %v", f.GaiacliBinary, acc, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - - // fmt.Println("out " + string(out)) - var ids gentlemint.AccState - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &ids) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return ids -} - -//___________________________________________________________________________________ -func (f *Fixtures) EnrollIdSigner(idSignerAddrs []sdk.AccAddress, flags ...string) (bool, string, string) { - lstSigner := make([]string, 0, len(idSignerAddrs)) - - for _, addr := range idSignerAddrs { - lstSigner = append(lstSigner, addr.String()) - } - - signers := strings.Join(lstSigner, " ") - cmd := fmt.Sprintf("%s tx gentlemint enroll-id-signer %s %v", f.GaiacliBinary, signers, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) RevokeIdSigner(idSignerAddrs []sdk.AccAddress, flags ...string) (bool, string, string) { - lstSigner := make([]string, 0, len(idSignerAddrs)) - - for _, addr := range idSignerAddrs { - lstSigner = append(lstSigner, addr.String()) - } - - signers := strings.Join(lstSigner, " ") - cmd := fmt.Sprintf("%s tx gentlemint revoke-id-signer %s %v", f.GaiacliBinary, signers, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) QuerySigner(idSignerAddr sdk.AccAddress, flags ...string) gentlemint.AccState { - cmd := fmt.Sprintf("%s query gentlemint id-signer %s %v", f.GaiacliBinary, idSignerAddr, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - - // fmt.Println("out " + string(out)) - var ids gentlemint.AccState - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &ids) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return ids -} - -//___________________________________________________________________________________ -func (f *Fixtures) EnrollAccountOperator(addrs []sdk.AccAddress, flags ...string) (bool, string, string) { - lstSigner := make([]string, 0, len(addrs)) - - for _, addr := range addrs { - lstSigner = append(lstSigner, addr.String()) - } - - signers := strings.Join(lstSigner, " ") - cmd := fmt.Sprintf("%s tx gentlemint enroll-account-operator %s %v", f.GaiacliBinary, signers, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) RevokeAccountOperator(accs []sdk.AccAddress, flags ...string) (bool, string, string) { - lstSigner := make([]string, 0, len(accs)) - - for _, addr := range accs { - lstSigner = append(lstSigner, addr.String()) - } - - signers := strings.Join(lstSigner, " ") - cmd := fmt.Sprintf("%s tx gentlemint revoke-account-operator %s %v", f.GaiacliBinary, signers, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func (f *Fixtures) QueryAccountOperator(addr sdk.AccAddress, flags ...string) gentlemint.AccState { - cmd := fmt.Sprintf("%s query gentlemint account-operator %s %v", f.GaiacliBinary, addr, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - - var acc gentlemint.AccState - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &acc) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return acc -} - -func (f *Fixtures) QueryAllAccountOperator(flags ...string) []gentlemint.AccState { - cmd := fmt.Sprintf("%s query gentlemint account-operators %v", f.GaiacliBinary, f.Flags()) - out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") - - var accs []gentlemint.AccState - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &accs) - require.NoError(f.T, err, "out %v\n, err %v", out, err) - return accs -} - -func (f *Fixtures) ExecuteGentlemintTxCommand(command string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx gentlemint %s %v", f.GaiacliBinary, command, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), DefaultKeyPass) -} - -func ParseStdOut(t *testing.T, stdOut string) sdk.TxResponse { - txRepsonse := sdk.TxResponse{} - cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(stdOut), &txRepsonse) - require.Nil(t, err) - return txRepsonse -} diff --git a/testutil/keeper/asset.go b/testutil/keeper/asset.go new file mode 100644 index 00000000..51336a76 --- /dev/null +++ b/testutil/keeper/asset.go @@ -0,0 +1,38 @@ +package keeper + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/asset/keeper" + "github.com/sharering/shareledger/x/asset/types" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func AssetKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(types.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) + + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + + registry := codectypes.NewInterfaceRegistry() + k := keeper.NewKeeper( + codec.NewProtoCodec(registry), + storeKey, + memStoreKey, + ) + + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + return k, ctx +} diff --git a/testutil/keeper/booking.go b/testutil/keeper/booking.go new file mode 100644 index 00000000..882721da --- /dev/null +++ b/testutil/keeper/booking.go @@ -0,0 +1,47 @@ +package keeper + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + assetkeeper "github.com/sharering/shareledger/x/asset/keeper" + "github.com/sharering/shareledger/x/booking/keeper" + "github.com/sharering/shareledger/x/booking/types" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func BookingKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(types.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) + + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + + registry := codectypes.NewInterfaceRegistry() + + var ( + ask assetkeeper.Keeper + bk bankkeeper.Keeper + ) + k := keeper.NewKeeper( + codec.NewProtoCodec(registry), + storeKey, + memStoreKey, + ask, + bk, + ) + + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + return k, ctx +} diff --git a/testutil/keeper/document.go b/testutil/keeper/document.go new file mode 100644 index 00000000..39997446 --- /dev/null +++ b/testutil/keeper/document.go @@ -0,0 +1,41 @@ +package keeper + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/document/keeper" + "github.com/sharering/shareledger/x/document/types" + idk "github.com/sharering/shareledger/x/id/keeper" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func DocumentKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(types.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) + + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + + registry := codectypes.NewInterfaceRegistry() + var idKeeper idk.Keeper + k := keeper.NewKeeper( + codec.NewProtoCodec(registry), + storeKey, + memStoreKey, + idKeeper, + ) + + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + return k, ctx +} diff --git a/testutil/keeper/electoral.go b/testutil/keeper/electoral.go new file mode 100644 index 00000000..eb5aadb6 --- /dev/null +++ b/testutil/keeper/electoral.go @@ -0,0 +1,41 @@ +package keeper + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/keeper" + "github.com/sharering/shareledger/x/electoral/types" + gk "github.com/sharering/shareledger/x/gentlemint/keeper" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func ElectoralKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(types.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) + + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + + registry := codectypes.NewInterfaceRegistry() + var gentlemintKeeper gk.Keeper + k := keeper.NewKeeper( + codec.NewProtoCodec(registry), + storeKey, + memStoreKey, + gentlemintKeeper, + ) + + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + return k, ctx +} diff --git a/testutil/keeper/gentlemint.go b/testutil/keeper/gentlemint.go new file mode 100644 index 00000000..ee94b8fe --- /dev/null +++ b/testutil/keeper/gentlemint.go @@ -0,0 +1,40 @@ +package keeper + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/keeper" + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func GentlemintKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(types.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) + + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + + registry := codectypes.NewInterfaceRegistry() + k := keeper.NewKeeper( + codec.NewProtoCodec(registry), + storeKey, + memStoreKey, + nil, + nil, + ) + + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + return k, ctx +} diff --git a/testutil/keeper/id.go b/testutil/keeper/id.go new file mode 100644 index 00000000..3b46a1c5 --- /dev/null +++ b/testutil/keeper/id.go @@ -0,0 +1,38 @@ +package keeper + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/id/keeper" + "github.com/sharering/shareledger/x/id/types" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func IdKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(types.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) + + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + + registry := codectypes.NewInterfaceRegistry() + k := keeper.NewKeeper( + codec.NewProtoCodec(registry), + storeKey, + memStoreKey, + ) + + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + return k, ctx +} diff --git a/testutil/network/config.go b/testutil/network/config.go new file mode 100644 index 00000000..30cf6f9f --- /dev/null +++ b/testutil/network/config.go @@ -0,0 +1,28 @@ +package network + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/sharering/shareledger/app" + denom "github.com/sharering/shareledger/x/utils/demo" + "github.com/tendermint/spm/cosmoscmd" +) + +func ShareLedgerTestingConfig() network.Config { + shareRingEncCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + + cosmoscmd.SetPrefixes(Bech32MainPrefix) + + config := network.DefaultConfig() + + config.Codec = shareRingEncCfg.Marshaler + config.TxConfig = shareRingEncCfg.TxConfig + config.LegacyAmino = shareRingEncCfg.Amino + config.InterfaceRegistry = shareRingEncCfg.InterfaceRegistry + config.AppConstructor = ShareLedgerChainConstructor() + config.GenesisState = app.ModuleBasics.DefaultGenesis(shareRingEncCfg.Marshaler) + config.NumValidators = 2 + config.MinGasPrices = fmt.Sprintf("0.000006%s", denom.Base) + + return config +} diff --git a/testutil/network/flags.go b/testutil/network/flags.go new file mode 100644 index 00000000..38932f1c --- /dev/null +++ b/testutil/network/flags.go @@ -0,0 +1,29 @@ +package network + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/tendermint/tendermint/libs/cli" +) + +var ( + JSONFlag = fmt.Sprintf("--%s=%s", cli.OutputFlag, "json") + SkipConfirmation = fmt.Sprintf("--%s", flags.FlagSkipConfirmation) + BlockBroadcast = fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock) + SHRFee2 = fmt.Sprintf("--%s=%s", flags.FlagFees, "2shr") + SHRFee10 = fmt.Sprintf("--%s=%s", flags.FlagFees, "10000000000nshr") +) + +func SHRFee(number int) string { + return fmt.Sprintf("--%s=%dshr", flags.FlagFees, number) +} + +func MakeByAccount(k string) string { + return fmt.Sprintf("--%s=%s", flags.FlagFrom, k) +} + +func GetFlagsQuery() []string { + return []string{ + fmt.Sprintf("--%s=%s", cli.OutputFlag, "json"), + } +} diff --git a/testutil/network/keys.go b/testutil/network/keys.go new file mode 100644 index 00000000..a3f7d284 --- /dev/null +++ b/testutil/network/keys.go @@ -0,0 +1,46 @@ +package network + +import ( + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/stretchr/testify/require" + "testing" +) + +type ( + KeyRingBuilder struct { + t *testing.T + kb keyring.Keyring + accGens []authtypes.GenesisAccount + genBalances []banktypes.Balance + } +) + +func NewKeyringBuilder(t *testing.T, kr keyring.Keyring) *KeyRingBuilder { + return &KeyRingBuilder{ + t: t, + kb: kr, + accGens: []authtypes.GenesisAccount{}, + genBalances: []banktypes.Balance{}, + } +} + +func (kb *KeyRingBuilder) BuildGenesis() (keyring.Keyring, []authtypes.GenesisAccount, []banktypes.Balance) { + return kb.kb, kb.accGens, kb.genBalances +} + +func (kb *KeyRingBuilder) InitUser(id string, coins sdk.Coins) { + info, _, err := kb.kb.NewMnemonic(id, keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + require.NoError(kb.t, err, "init fail") + Accounts[id] = info.GetAddress() + + kb.accGens = append(kb.accGens, authtypes.NewBaseAccount(info.GetAddress(), info.GetPubKey(), 0, 0)) + kb.genBalances = append(kb.genBalances, banktypes.Balance{ + Address: info.GetAddress().String(), + Coins: coins, + }) + +} diff --git a/testutil/network/network.go b/testutil/network/network.go new file mode 100644 index 00000000..f637cccc --- /dev/null +++ b/testutil/network/network.go @@ -0,0 +1,155 @@ +package network + +import ( + "bufio" + "encoding/json" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/bank/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/sharering/shareledger/app" + "github.com/sharering/shareledger/testutil/simapp" + electoraltypes "github.com/sharering/shareledger/x/electoral/types" + "io/ioutil" + "os" + "testing" +) + +const ( + Bech32MainPrefix = "shareledger" +) + +// AppConstructor defines a function which accepts a network configuration and +// creates an ABCI Application to provide to Tendermint. + +var ( + Accounts = map[string]sdk.Address{} +) + +type ( + AppConstructor = func(val network.Validator) servertypes.Application + + AccountInfo struct { + Key string + Balance sdk.Coins + } +) + +func CompileGenesis(t *testing.T, config *network.Config, genesisState map[string]json.RawMessage, au []authtypes.GenesisAccount, b []banktypes.Balance, elGen electoraltypes.GenesisState) map[string]json.RawMessage { + var bankGenesis types.GenesisState + var authGenesis authtypes.GenesisState + + err := config.Codec.UnmarshalJSON(genesisState[types.ModuleName], &bankGenesis) + if err != nil { + t.Errorf("fail to init test") + } + + err = config.Codec.UnmarshalJSON(genesisState[authtypes.ModuleName], &authGenesis) + if err != nil { + t.Errorf("fail to init test") + } + + accounts, err := authtypes.PackAccounts(au) + if err != nil { + t.Errorf("int fails") + } + + authGenesis.Accounts = append(authGenesis.Accounts, accounts...) + + bankGenesis.Balances = b + bankGenesisBz, err := config.Codec.MarshalJSON(&bankGenesis) + if err != nil { + t.Errorf("init test fail %v", err) + } + authGenesisBz, err := config.Codec.MarshalJSON(&authGenesis) + if err != nil { + t.Errorf("init test fail %v", err) + } + + genElectoralBz := config.Codec.MustMarshalJSON(&elGen) + if err != nil { + t.Errorf("init test fail %v", err) + } + genesisState[types.ModuleName] = bankGenesisBz + genesisState[authtypes.ModuleName] = authGenesisBz + genesisState[electoraltypes.ModuleName] = genElectoralBz + return genesisState +} + +// GetTestingGenesis init the genesis state for testing in here +func GetTestingGenesis(t *testing.T, config *network.Config) (keyring.Keyring, string) { + genesisState := config.GenesisState + + buf := bufio.NewReader(os.Stdin) + baseDir, err := ioutil.TempDir(t.TempDir(), config.ChainID) + if err != nil { + t.Errorf("fail to create temp dir %v", err) + } + kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, baseDir, buf, config.KeyringOptions...) + accountBuilder := NewKeyringBuilder(t, kb) + + users := []AccountInfo{ + {Key: KeyAuthority, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyTreasurer, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyOperator, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyIDSigner, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyDocIssuer, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyMillionaire, Balance: OneMillionSHRSHRPCoins}, + {Key: KeyLoader, Balance: OneMillionSHRSHRPCoins}, + + {Key: KeyEmpty1, Balance: ZeroSHRSHRP}, + {Key: KeyEmpty2, Balance: ZeroSHRSHRP}, + {Key: KeyEmpty3, Balance: ZeroSHRSHRP}, + {Key: KeyEmpty4, Balance: ZeroSHRSHRP}, + {Key: KeyEmpty5, Balance: ZeroSHRSHRP}, + + {Key: KeyAccount1, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyAccount2, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyAccount3, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyAccount4, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyAccount5, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyAccount6, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyAccount7, Balance: OneThousandSHROneHundredSHRPCoins}, + {Key: KeyAccount8, Balance: OneThousandSHROneHundredSHRPCoins}, + } + + for _, u := range users { + accountBuilder.InitUser(u.Key, u.Balance) + } + + newKeyringService, genAccounts, genBalances := accountBuilder.BuildGenesis() + + var genElectoral electoraltypes.GenesisState + genElectoral = electoraltypes.GenesisState{ + Authority: &electoraltypes.Authority{ + Address: Accounts[KeyAuthority].String(), + }, + Treasurer: &electoraltypes.Treasurer{ + Address: Accounts[KeyTreasurer].String(), + }, + } + + genesisState = CompileGenesis(t, config, genesisState, genAccounts, genBalances, genElectoral) + config.GenesisState = genesisState + return newKeyringService, baseDir +} + +// ShareLedgerChainConstructor returns a new shareLedger AppConstructor +func ShareLedgerChainConstructor() AppConstructor { + return func(val network.Validator) servertypes.Application { + return simapp.New(val.Ctx.Config.RootDir, TestAppOptions{}) + } +} + +type TestAppOptions struct{} + +// Get implements TestAppOptions +func (ao TestAppOptions) Get(o string) interface{} { + if o == app.FlagAppOptionSkipCheckVoter { + return true + } + return nil +} diff --git a/testutil/network/utils.go b/testutil/network/utils.go new file mode 100644 index 00000000..d48a560a --- /dev/null +++ b/testutil/network/utils.go @@ -0,0 +1,142 @@ +package network + +import ( + "encoding/json" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/sharering/shareledger/app" + denom "github.com/sharering/shareledger/x/utils/demo" + "github.com/stretchr/testify/require" + "github.com/tendermint/spm/cosmoscmd" + tmos "github.com/tendermint/tendermint/libs/os" + "path/filepath" + "testing" +) + +const ( + KeyAuthority string = "authority" + KeyTreasurer string = "treasurer" + KeyOperator string = "operator" + KeyLoader string = "loader" + KeyMillionaire string = "millionaire" + + KeyDocIssuer string = "doc_issuer" + KeyIDSigner string = "id_signer" + + KeyEmpty1 string = "empty1" + KeyEmpty2 string = "empty2" + KeyEmpty3 string = "empty3" + KeyEmpty4 string = "empty4" + KeyEmpty5 string = "empty5" + + KeyAccount1 string = "acc1" + KeyAccount2 string = "acc2" + KeyAccount3 string = "acc3" + KeyAccount4 string = "acc4" + + KeyAccount5 string = "acc5" + KeyAccount6 string = "acc6" + KeyAccount7 string = "acc7" + KeyAccount8 string = "acc8" + + ShareLedgerSuccessCode = uint32(0) +) + +var ( + oneThousandSHR = 10000 * denom.ShrExponent + oneHundredSHRP = 100 * denom.USDExponent + oneMillionSHR = 1000000 * denom.ShrExponent //1 million shr and shrp + oneMillionSHRP = 1000000 * denom.USDExponent //1 million shr and shrp + + OneThousandSHROneHundredSHRPCoins = sdk.NewCoins(sdk.NewCoin(denom.Base, sdk.NewInt(oneThousandSHR)), sdk.NewCoin(denom.BaseUSD, sdk.NewInt(oneHundredSHRP))) + OneMillionSHRSHRPCoins = sdk.NewCoins(sdk.NewCoin(denom.Base, sdk.NewInt(oneMillionSHR)), sdk.NewCoin(denom.BaseUSD, sdk.NewInt(oneMillionSHRP))) + ZeroSHRSHRP = sdk.NewCoins(sdk.NewCoin(denom.Base, sdk.NewInt(0)), sdk.NewCoin(denom.BaseUSD, sdk.NewInt(0))) +) + +type ( + CosmosLogs []CosmosLog + + CosmosLog struct { + MgsIndex int `json:"mgs_index"` + Events Events `json:"events"` + } + Event struct { + Type string `json:"type"` + Attributes []Attribute `json:"attributes"` + } + + Attribute struct { + Key string `json:"key"` + Value string `json:"value"` + } + Events []Event + Attributes []Attribute +) + +func (e Events) GetEventByType(t *testing.T, eType string) Attributes { + for _, ev := range e { + if ev.Type == eType { + return ev.Attributes + } + } + t.Log("event type not found") + t.Fail() + + return nil +} + +func (as Attributes) Get(t *testing.T, key string) Attribute { + for _, a := range as { + if a.Key == key { + return a + } + } + t.Log("attribute key not found") + t.Fail() + return Attribute{} +} + +//Use later +func writeFile(name string, dir string, contents []byte) error { + writePath := filepath.Join(dir) + file := filepath.Join(writePath, name) + + err := tmos.EnsureDir(writePath, 0755) + if err != nil { + return err + } + + err = tmos.WriteFile(file, contents, 0644) + if err != nil { + return err + } + + return nil +} + +func ParseStdOut(t *testing.T, stdOut []byte) sdk.TxResponse { + txResponse := sdk.TxResponse{} + + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(stdOut, &txResponse) + require.NoError(t, err) + return txResponse +} + +func BalanceJsonUnmarshal(t *testing.T, data []byte) banktypes.QueryAllBalancesResponse { + var b banktypes.QueryAllBalancesResponse + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(data, &b) + require.NoError(t, err) + return b + +} + +func ParseRawLogGetEvent(t *testing.T, logString string) CosmosLogs { + var logs CosmosLogs + err := json.Unmarshal([]byte(logString), &logs) + require.NoError(t, err, "fail to get the log information form stdout") + l := len(logs) + require.Greater(t, l, 0, "empty logs") + return logs +} diff --git a/testutil/sample/sample.go b/testutil/sample/sample.go new file mode 100644 index 00000000..20afcaaf --- /dev/null +++ b/testutil/sample/sample.go @@ -0,0 +1,11 @@ +package sample + +import ( + "github.com/cosmos/cosmos-sdk/testutil/testdata" +) + +// AccAddress returns a sample account address +func AccAddress() string { + _, _, addr := testdata.KeyTestPubAddr() + return addr.String() +} diff --git a/testutil/simapp/simapp.go b/testutil/simapp/simapp.go new file mode 100644 index 00000000..4e7bce15 --- /dev/null +++ b/testutil/simapp/simapp.go @@ -0,0 +1,49 @@ +package simapp + +import ( + servertypes "github.com/cosmos/cosmos-sdk/server/types" + "time" + + "github.com/tendermint/spm/cosmoscmd" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmtypes "github.com/tendermint/tendermint/types" + tmdb "github.com/tendermint/tm-db" + + "github.com/sharering/shareledger/app" +) + +// New creates application instance with in-memory database and disabled logging. +func New(dir string, appOpts servertypes.AppOptions) cosmoscmd.App { + db := tmdb.NewMemDB() + logger := log.NewNopLogger() + + encoding := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + + a := app.New(logger, db, nil, true, map[int64]bool{}, dir, 0, encoding, + appOpts) + // InitChain updates deliverState which is required when app.NewContext is called + a.InitChain(abci.RequestInitChain{ + ConsensusParams: defaultConsensusParams, + AppStateBytes: []byte("{}"), + }) + return a +} + +var defaultConsensusParams = &abci.ConsensusParams{ + Block: &abci.BlockParams{ + MaxBytes: 200000, + MaxGas: 2000000, + }, + Evidence: &tmproto.EvidenceParams{ + MaxAgeNumBlocks: 302400, + MaxAgeDuration: 504 * time.Hour, // 3 weeks is the max duration + MaxBytes: 10000, + }, + Validator: &tmproto.ValidatorParams{ + PubKeyTypes: []string{ + tmtypes.ABCIPubKeyTypeEd25519, + }, + }, +} diff --git a/types/address.go b/types/address.go deleted file mode 100644 index c40c8eb2..00000000 --- a/types/address.go +++ /dev/null @@ -1,37 +0,0 @@ -package types - -import sdk "github.com/cosmos/cosmos-sdk/types" - -const ( - PrefixValidator = "val" - - PrefixConsensus = "cons" - - PrefixPublic = "pub" - - PrefixOperator = "oper" - - // Bech32 prefix - - Bech32MainPrefix = "shareledger" - - Bech32PrefixAccAddr = Bech32MainPrefix - - Bech32PrefixAccPub = Bech32MainPrefix + PrefixPublic - - Bech32PrefixValAddr = Bech32MainPrefix + PrefixValidator + PrefixOperator - - Bech32PrefixValPub = Bech32MainPrefix + PrefixValidator + PrefixOperator + PrefixPublic - - Bech32PrefixConsAddr = Bech32MainPrefix + PrefixValidator + PrefixConsensus - - Bech32PrefixConsPub = Bech32MainPrefix + PrefixValidator + PrefixConsensus + PrefixPublic -) - -func ConfigureSDK() { - config := sdk.GetConfig() - config.SetBech32PrefixForAccount(Bech32PrefixAccAddr, Bech32PrefixAccPub) - config.SetBech32PrefixForValidator(Bech32PrefixValAddr, Bech32PrefixValPub) - config.SetBech32PrefixForConsensusNode(Bech32PrefixConsAddr, Bech32PrefixConsPub) - config.Seal() -} diff --git a/vue/package-lock.json b/vue/package-lock.json new file mode 100644 index 00000000..ec7c2ee4 --- /dev/null +++ b/vue/package-lock.json @@ -0,0 +1,15864 @@ +{ + "name": "@starport/template", + "version": "0.1.53", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", + "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", + "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", + "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", + "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/node": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.16.0.tgz", + "integrity": "sha512-eFUU2RHkgMW0X1lHVVOWJYlaDTwCX2LduQQLfehAfID5VhAjNnBhGZ/r0zk3FSQfFn6enJ2aXyRCiZ829bYVeA==", + "dev": true, + "requires": { + "@babel/register": "^7.16.0", + "commander": "^4.0.1", + "core-js": "^3.19.0", + "node-environment-flags": "^1.0.5", + "regenerator-runtime": "^0.13.4", + "v8flags": "^3.1.1" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", + "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", + "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.4.tgz", + "integrity": "sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-decorators": "^7.16.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", + "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", + "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", + "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", + "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", + "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", + "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", + "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", + "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", + "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", + "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", + "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", + "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz", + "integrity": "sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", + "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", + "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", + "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", + "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", + "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", + "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", + "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", + "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", + "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", + "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", + "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", + "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", + "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", + "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", + "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", + "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", + "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", + "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", + "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", + "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", + "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", + "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", + "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", + "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", + "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", + "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", + "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", + "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", + "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", + "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", + "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", + "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/register": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.16.0.tgz", + "integrity": "sha512-lzl4yfs0zVXnooeLE0AAfYaT7F3SPA8yB2Bj4W1BiZwLbMS3MZH35ZvCWSRHvneUugwuM+Wsnrj7h0F7UmU3NQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + } + }, + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@confio/ics23": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.5.tgz", + "integrity": "sha512-1GdPMsaP/l8JSF4P4HWFLBhdcxHcJT8lS0nknBYNSZ1XrJOsJKUy6EkOwd9Pa1qJkXzY2gyNv7MdHR+AIwSTAg==", + "requires": { + "js-sha512": "^0.8.0", + "protobufjs": "^6.8.8", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11" + } + }, + "@confio/relayer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@confio/relayer/-/relayer-0.3.0.tgz", + "integrity": "sha512-U0DFJxACa5qgLo4OHQJNb8XrE1qHI3wpZwuWM6nwo4jnrwKNb8S/zp3AsGwK6TGcAPUQEfkiPmssY8oEM5GF5w==", + "requires": { + "@cosmjs/cosmwasm-stargate": "^0.26.0", + "@cosmjs/crypto": "^0.26.0", + "@cosmjs/encoding": "^0.26.0", + "@cosmjs/faucet-client": "^0.26.0", + "@cosmjs/math": "^0.26.0", + "@cosmjs/proto-signing": "^0.26.0", + "@cosmjs/stargate": "^0.26.0", + "@cosmjs/stream": "^0.26.0", + "@cosmjs/tendermint-rpc": "^0.26.0", + "@cosmjs/utils": "^0.26.0", + "ajv": "7.1.1", + "axios": "0.21.1", + "commander": "7.1.0", + "fast-safe-stringify": "2.0.4", + "js-yaml": "4.0.0", + "lodash": "4.17.21", + "prom-client": "13.1.0", + "protobufjs": "6.10.2", + "table": "^6.7.1", + "triple-beam": "1.3.0", + "winston": "3.3.3" + }, + "dependencies": { + "@cosmjs/amino": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.26.4.tgz", + "integrity": "sha512-ELqiTVNYqLp+ar6HlPydO3XaxrC5Lc7EIlWNrCos//f6ViVrN4aKUGOP7wWbwjpoq+0D/1NkTIWs40IBmVmP2g==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4" + } + }, + "@cosmjs/crypto": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.26.4.tgz", + "integrity": "sha512-m2mb9cAxaHLFRXRjHVRI6p1IlMwioagCCDZg42EYe3EJgNCs8J8ONcpOAKNGm1cA6MmE8zg1PCPJDN5QtjRA8w==", + "requires": { + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4", + "bip39": "^3.0.2", + "bn.js": "^4.11.8", + "elliptic": "^6.5.3", + "js-sha3": "^0.8.0", + "libsodium-wrappers": "^0.7.6", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11" + } + }, + "@cosmjs/encoding": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.26.4.tgz", + "integrity": "sha512-mA1yAJUA23RPUQ39352bpljfHUwmqGCruLQt/SgvSVBHCcUPEWOLZaV9Sohy5vcbSFlIRLIqdVHjKePZQWoVQw==", + "requires": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "@cosmjs/json-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.26.4.tgz", + "integrity": "sha512-aK2bavVIR6Ty+d2k0vzJDYbhPE8ITAkUlD3hMAkEAZNCYFAdGlQKqnY03sr0QMYT5FPKQ5orp6hetFVse1vX0Q==", + "requires": { + "@cosmjs/stream": "0.26.4", + "xstream": "^11.14.0" + } + }, + "@cosmjs/math": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.26.4.tgz", + "integrity": "sha512-7w1AMwdPx4RZKp6Pcw4dPUmvWekZO9+inHrtvfBFfRSIowuV9TZBr1mOy+CfUGmL1Yiny1KM9+PS2UGHuXJTIQ==", + "requires": { + "bn.js": "^4.11.8" + } + }, + "@cosmjs/proto-signing": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.26.4.tgz", + "integrity": "sha512-gLC1nZeP9xA1arsWsW1OePmDJiKe9BAybEsRk3b+gjy2fets++/nU/hF0PKuT+jOfTglJenbRqPM4UOl8tiI2A==", + "requires": { + "@cosmjs/amino": "0.26.4", + "@cosmjs/crypto": "0.26.4", + "@cosmjs/math": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2" + } + }, + "@cosmjs/socket": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.26.4.tgz", + "integrity": "sha512-CCoa55qUjk0HC+kZX1iae0rl5iS1iR9PvXrn2HfiLx17e9gLFejvF50M8iuC2qoyAEh0haR0Pq1h8+fhX0OasQ==", + "requires": { + "@cosmjs/stream": "0.26.4", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stargate": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.26.4.tgz", + "integrity": "sha512-K8cpKti05DD5hDMpZ3ucmjQiKRcDYAT/HBN6pE382ajQt7R4aVYl2Q78ujc7euhCtZACuk45MFCi8gm1I6ozuA==", + "requires": { + "@confio/ics23": "^0.6.3", + "@cosmjs/amino": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/proto-signing": "0.26.4", + "@cosmjs/stream": "0.26.4", + "@cosmjs/tendermint-rpc": "0.26.4", + "@cosmjs/utils": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stream": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.26.4.tgz", + "integrity": "sha512-mZHyck+jgejwhTgZq+y8sF2CrceW5R4yG0rr7QGnIM7fT8G5kogF2i1Oz9nIGWJiH2GfZzN+q+hdCqTjDcM0wQ==", + "requires": { + "xstream": "^11.14.0" + } + }, + "@cosmjs/tendermint-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.26.4.tgz", + "integrity": "sha512-ubV+27JSvPGtRVSoqUCn9O02hZwoMG31fCYccZwBnvhDFnFFkDXgRlWvToai6DEQcaSuOdEcikXU7NwLsalelQ==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/json-rpc": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/socket": "0.26.4", + "@cosmjs/stream": "0.26.4", + "axios": "^0.21.2", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + } + } + }, + "@cosmjs/utils": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.26.4.tgz", + "integrity": "sha512-2QScX/4sgXN9X5u7hON0i21t4YnGETTpT0btIrQMEQsFJbFKA2M9HT1y8UKfeeiPBZcLG+PixXSpHQ1xonMQcw==" + }, + "@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + } + } + } + }, + "@cosmjs/amino": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.25.6.tgz", + "integrity": "sha512-9dXN2W7LHjDtJUGNsQ9ok0DfxeN3ca/TXnxCR3Ikh/5YqBqxI8Gel1J9PQO9L6EheYyh045Wff4bsMaLjyEeqQ==", + "requires": { + "@cosmjs/crypto": "^0.25.6", + "@cosmjs/encoding": "^0.25.6", + "@cosmjs/math": "^0.25.6", + "@cosmjs/utils": "^0.25.6" + } + }, + "@cosmjs/cosmwasm-stargate": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.26.4.tgz", + "integrity": "sha512-CXVDVU0ABm7A/G7GrqU6CRyt0+vJR4zUUoDvwjLSldomP1EusEujYagQvhnQla2XKSH93nNlw8MSw457I4XD9A==", + "requires": { + "@cosmjs/amino": "0.26.4", + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/proto-signing": "0.26.4", + "@cosmjs/stargate": "0.26.4", + "@cosmjs/tendermint-rpc": "0.26.4", + "@cosmjs/utils": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "pako": "^2.0.2", + "protobufjs": "~6.10.2" + }, + "dependencies": { + "@cosmjs/amino": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.26.4.tgz", + "integrity": "sha512-ELqiTVNYqLp+ar6HlPydO3XaxrC5Lc7EIlWNrCos//f6ViVrN4aKUGOP7wWbwjpoq+0D/1NkTIWs40IBmVmP2g==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4" + } + }, + "@cosmjs/crypto": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.26.4.tgz", + "integrity": "sha512-m2mb9cAxaHLFRXRjHVRI6p1IlMwioagCCDZg42EYe3EJgNCs8J8ONcpOAKNGm1cA6MmE8zg1PCPJDN5QtjRA8w==", + "requires": { + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4", + "bip39": "^3.0.2", + "bn.js": "^4.11.8", + "elliptic": "^6.5.3", + "js-sha3": "^0.8.0", + "libsodium-wrappers": "^0.7.6", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11" + } + }, + "@cosmjs/encoding": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.26.4.tgz", + "integrity": "sha512-mA1yAJUA23RPUQ39352bpljfHUwmqGCruLQt/SgvSVBHCcUPEWOLZaV9Sohy5vcbSFlIRLIqdVHjKePZQWoVQw==", + "requires": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "@cosmjs/json-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.26.4.tgz", + "integrity": "sha512-aK2bavVIR6Ty+d2k0vzJDYbhPE8ITAkUlD3hMAkEAZNCYFAdGlQKqnY03sr0QMYT5FPKQ5orp6hetFVse1vX0Q==", + "requires": { + "@cosmjs/stream": "0.26.4", + "xstream": "^11.14.0" + } + }, + "@cosmjs/math": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.26.4.tgz", + "integrity": "sha512-7w1AMwdPx4RZKp6Pcw4dPUmvWekZO9+inHrtvfBFfRSIowuV9TZBr1mOy+CfUGmL1Yiny1KM9+PS2UGHuXJTIQ==", + "requires": { + "bn.js": "^4.11.8" + } + }, + "@cosmjs/proto-signing": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.26.4.tgz", + "integrity": "sha512-gLC1nZeP9xA1arsWsW1OePmDJiKe9BAybEsRk3b+gjy2fets++/nU/hF0PKuT+jOfTglJenbRqPM4UOl8tiI2A==", + "requires": { + "@cosmjs/amino": "0.26.4", + "@cosmjs/crypto": "0.26.4", + "@cosmjs/math": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2" + } + }, + "@cosmjs/socket": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.26.4.tgz", + "integrity": "sha512-CCoa55qUjk0HC+kZX1iae0rl5iS1iR9PvXrn2HfiLx17e9gLFejvF50M8iuC2qoyAEh0haR0Pq1h8+fhX0OasQ==", + "requires": { + "@cosmjs/stream": "0.26.4", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stargate": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.26.4.tgz", + "integrity": "sha512-K8cpKti05DD5hDMpZ3ucmjQiKRcDYAT/HBN6pE382ajQt7R4aVYl2Q78ujc7euhCtZACuk45MFCi8gm1I6ozuA==", + "requires": { + "@confio/ics23": "^0.6.3", + "@cosmjs/amino": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/proto-signing": "0.26.4", + "@cosmjs/stream": "0.26.4", + "@cosmjs/tendermint-rpc": "0.26.4", + "@cosmjs/utils": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stream": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.26.4.tgz", + "integrity": "sha512-mZHyck+jgejwhTgZq+y8sF2CrceW5R4yG0rr7QGnIM7fT8G5kogF2i1Oz9nIGWJiH2GfZzN+q+hdCqTjDcM0wQ==", + "requires": { + "xstream": "^11.14.0" + } + }, + "@cosmjs/tendermint-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.26.4.tgz", + "integrity": "sha512-ubV+27JSvPGtRVSoqUCn9O02hZwoMG31fCYccZwBnvhDFnFFkDXgRlWvToai6DEQcaSuOdEcikXU7NwLsalelQ==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/json-rpc": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/socket": "0.26.4", + "@cosmjs/stream": "0.26.4", + "axios": "^0.21.2", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "@cosmjs/utils": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.26.4.tgz", + "integrity": "sha512-2QScX/4sgXN9X5u7hON0i21t4YnGETTpT0btIrQMEQsFJbFKA2M9HT1y8UKfeeiPBZcLG+PixXSpHQ1xonMQcw==" + }, + "@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" + }, + "protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + } + } + } + }, + "@cosmjs/crypto": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.6.tgz", + "integrity": "sha512-ec+YcQLrg2ibcxtNrh4FqQnG9kG9IE/Aik2NH6+OXQdFU/qFuBTxSFcKDgzzBOChwlkXwydllM9Jjbp+dgIzRw==", + "requires": { + "@cosmjs/encoding": "^0.25.6", + "@cosmjs/math": "^0.25.6", + "@cosmjs/utils": "^0.25.6", + "bip39": "^3.0.2", + "bn.js": "^4.11.8", + "elliptic": "^6.5.3", + "js-sha3": "^0.8.0", + "libsodium-wrappers": "^0.7.6", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11" + } + }, + "@cosmjs/encoding": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.25.6.tgz", + "integrity": "sha512-0imUOB8XkUstI216uznPaX1hqgvLQ2Xso3zJj5IV5oJuNlsfDj9nt/iQxXWbJuettc6gvrFfpf+Vw2vBZSZ75g==", + "requires": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "@cosmjs/faucet-client": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/faucet-client/-/faucet-client-0.26.4.tgz", + "integrity": "sha512-tBX+MAzk5JU9FvaTCxyY+8epUrNDbaLX9FdCGBnLwmZmN2j5RlGWzQaRuAgtORCzaevFaopl9lIG4baUrhb4JA==", + "requires": { + "axios": "^0.21.2" + } + }, + "@cosmjs/json-rpc": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.25.6.tgz", + "integrity": "sha512-Mn9og3/IEzC6jWoYXs0ONqFJc8HxVjXzrZPLgaRRdMZEUBvctxdhynau1wbE4LdkYQHbu4aiRu1q1jMYGFAj4A==", + "requires": { + "@cosmjs/stream": "^0.25.6", + "xstream": "^11.14.0" + } + }, + "@cosmjs/launchpad": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.25.0.tgz", + "integrity": "sha512-+ByFM9ZiplO4NpelxS0XulZb1BvWhAesZgkfafg346lPhvbcKEKXKph9ElbDsfJxifXcFEywwGrdIW7pdAxjtQ==", + "requires": { + "@cosmjs/amino": "^0.25.0", + "@cosmjs/crypto": "^0.25.0", + "@cosmjs/encoding": "^0.25.0", + "@cosmjs/math": "^0.25.0", + "@cosmjs/utils": "^0.25.0", + "axios": "^0.21.1", + "fast-deep-equal": "^3.1.3" + } + }, + "@cosmjs/math": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.25.6.tgz", + "integrity": "sha512-Fmyc9FJ8KMU34n7rdapMJrT/8rx5WhMw2F7WLBu7AVLcBh0yWsXIcMSJCoPHTOnMIiABjXsnrrwEaLrOOBfu6A==", + "requires": { + "bn.js": "^4.11.8" + } + }, + "@cosmjs/proto-signing": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.0.tgz", + "integrity": "sha512-5nEYuY4VmzY7ul7WwIL9WI5ZshOXmp/uZrj+L0IppbTvBK0ZRCxfZwJQWfHv7kjJoNfprFapKiZZfKz8LnsCIA==", + "requires": { + "@cosmjs/amino": "^0.25.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2" + }, + "dependencies": { + "@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" + }, + "protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + } + } + } + }, + "@cosmjs/socket": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.25.6.tgz", + "integrity": "sha512-hu+pW3Fy0IuhstXgxnZ2Iq0RUnGYoTWfqrxbTsgXBJge4MpEQs2YwGXgJZPMJXedBQivG0tU3r/Wvam0EWuRkQ==", + "requires": { + "@cosmjs/stream": "^0.25.6", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stargate": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.0.tgz", + "integrity": "sha512-XKnh8QDKoYCGGviMSs+JteY1gVVkkBad+mMGcoGrBbvzDFc4Xm7alQDb/JVNWCLmALyIrqmdQ4Nfn1Znpfi9CA==", + "requires": { + "@confio/ics23": "^0.6.3", + "@cosmjs/amino": "^0.25.0", + "@cosmjs/encoding": "^0.25.0", + "@cosmjs/math": "^0.25.0", + "@cosmjs/proto-signing": "^0.25.0", + "@cosmjs/stream": "^0.25.0", + "@cosmjs/tendermint-rpc": "^0.25.0", + "@cosmjs/utils": "^0.25.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2" + }, + "dependencies": { + "@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" + }, + "protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + } + } + } + }, + "@cosmjs/stream": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.25.6.tgz", + "integrity": "sha512-2mXIzf+WaFd+GSrRaJJETVXeZoC5sosuKChFERxSY8zXQ/f3OaG9J6m+quHpPbU3nAIEtnF1jgBVqJiD+NKwGQ==", + "requires": { + "xstream": "^11.14.0" + } + }, + "@cosmjs/tendermint-rpc": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.6.tgz", + "integrity": "sha512-wsvxTI7DReWJu+SVlXLblzh5NJppnh1mljuaTHodMf7HBxrXdbcCcBAO8oMbMgEqOASEY5G+z51wktxhrn9RtA==", + "requires": { + "@cosmjs/crypto": "^0.25.6", + "@cosmjs/encoding": "^0.25.6", + "@cosmjs/json-rpc": "^0.25.6", + "@cosmjs/math": "^0.25.6", + "@cosmjs/socket": "^0.25.6", + "@cosmjs/stream": "^0.25.6", + "axios": "^0.21.1", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "@cosmjs/utils": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.25.6.tgz", + "integrity": "sha512-ofOYiuxVKNo238vCPPlaDzqPXy2AQ/5/nashBo5rvPZJkxt9LciGfUEQWPCOb1BIJDNx2Dzu0z4XCf/dwzl0Dg==" + }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "@starport/client-js": { + "version": "0.1.54", + "resolved": "https://registry.npmjs.org/@starport/client-js/-/client-js-0.1.54.tgz", + "integrity": "sha512-xRzxhYTxTp2I0MC+A5RIo0I+SMhg30BwUEyi+VCHO+gPCIz3xn5WP2rfCJTdIDVAvgeB9N5bBjUQmYCpwGajmg==", + "requires": { + "@cosmjs/proto-signing": "^0.26.1", + "@cosmjs/stargate": "^0.26.1", + "@types/reconnectingwebsocket": "^1.0.7", + "axios": "^0.22.0", + "reconnecting-websocket": "^4.4.0" + }, + "dependencies": { + "@cosmjs/amino": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.26.4.tgz", + "integrity": "sha512-ELqiTVNYqLp+ar6HlPydO3XaxrC5Lc7EIlWNrCos//f6ViVrN4aKUGOP7wWbwjpoq+0D/1NkTIWs40IBmVmP2g==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4" + } + }, + "@cosmjs/crypto": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.26.4.tgz", + "integrity": "sha512-m2mb9cAxaHLFRXRjHVRI6p1IlMwioagCCDZg42EYe3EJgNCs8J8ONcpOAKNGm1cA6MmE8zg1PCPJDN5QtjRA8w==", + "requires": { + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4", + "bip39": "^3.0.2", + "bn.js": "^4.11.8", + "elliptic": "^6.5.3", + "js-sha3": "^0.8.0", + "libsodium-wrappers": "^0.7.6", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11" + } + }, + "@cosmjs/encoding": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.26.4.tgz", + "integrity": "sha512-mA1yAJUA23RPUQ39352bpljfHUwmqGCruLQt/SgvSVBHCcUPEWOLZaV9Sohy5vcbSFlIRLIqdVHjKePZQWoVQw==", + "requires": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "@cosmjs/json-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.26.4.tgz", + "integrity": "sha512-aK2bavVIR6Ty+d2k0vzJDYbhPE8ITAkUlD3hMAkEAZNCYFAdGlQKqnY03sr0QMYT5FPKQ5orp6hetFVse1vX0Q==", + "requires": { + "@cosmjs/stream": "0.26.4", + "xstream": "^11.14.0" + } + }, + "@cosmjs/math": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.26.4.tgz", + "integrity": "sha512-7w1AMwdPx4RZKp6Pcw4dPUmvWekZO9+inHrtvfBFfRSIowuV9TZBr1mOy+CfUGmL1Yiny1KM9+PS2UGHuXJTIQ==", + "requires": { + "bn.js": "^4.11.8" + } + }, + "@cosmjs/proto-signing": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.26.4.tgz", + "integrity": "sha512-gLC1nZeP9xA1arsWsW1OePmDJiKe9BAybEsRk3b+gjy2fets++/nU/hF0PKuT+jOfTglJenbRqPM4UOl8tiI2A==", + "requires": { + "@cosmjs/amino": "0.26.4", + "@cosmjs/crypto": "0.26.4", + "@cosmjs/math": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2" + } + }, + "@cosmjs/socket": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.26.4.tgz", + "integrity": "sha512-CCoa55qUjk0HC+kZX1iae0rl5iS1iR9PvXrn2HfiLx17e9gLFejvF50M8iuC2qoyAEh0haR0Pq1h8+fhX0OasQ==", + "requires": { + "@cosmjs/stream": "0.26.4", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stargate": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.26.4.tgz", + "integrity": "sha512-K8cpKti05DD5hDMpZ3ucmjQiKRcDYAT/HBN6pE382ajQt7R4aVYl2Q78ujc7euhCtZACuk45MFCi8gm1I6ozuA==", + "requires": { + "@confio/ics23": "^0.6.3", + "@cosmjs/amino": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/proto-signing": "0.26.4", + "@cosmjs/stream": "0.26.4", + "@cosmjs/tendermint-rpc": "0.26.4", + "@cosmjs/utils": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stream": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.26.4.tgz", + "integrity": "sha512-mZHyck+jgejwhTgZq+y8sF2CrceW5R4yG0rr7QGnIM7fT8G5kogF2i1Oz9nIGWJiH2GfZzN+q+hdCqTjDcM0wQ==", + "requires": { + "xstream": "^11.14.0" + } + }, + "@cosmjs/tendermint-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.26.4.tgz", + "integrity": "sha512-ubV+27JSvPGtRVSoqUCn9O02hZwoMG31fCYccZwBnvhDFnFFkDXgRlWvToai6DEQcaSuOdEcikXU7NwLsalelQ==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/json-rpc": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/socket": "0.26.4", + "@cosmjs/stream": "0.26.4", + "axios": "^0.21.2", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + } + } + }, + "@cosmjs/utils": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.26.4.tgz", + "integrity": "sha512-2QScX/4sgXN9X5u7hON0i21t4YnGETTpT0btIrQMEQsFJbFKA2M9HT1y8UKfeeiPBZcLG+PixXSpHQ1xonMQcw==" + }, + "@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" + }, + "axios": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", + "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", + "requires": { + "follow-redirects": "^1.14.4" + } + }, + "protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + } + } + } + }, + "@starport/vue": { + "version": "0.1.54", + "resolved": "https://registry.npmjs.org/@starport/vue/-/vue-0.1.54.tgz", + "integrity": "sha512-mJoiVzUqcmVqtzU+OTotLtIrYF84Vbqp7KSFkrhNXTavmCh2RRJkLBVzMcWuxLgeqOnt7EvzrtpZQp3KFG/aPQ==", + "requires": { + "bip39": "^3.0.4", + "crypto-js": "^4.1.1", + "dayjs": "^1.10.7", + "file-saver": "^2.0.5", + "gradient-avatar": "^1.0.2", + "js-base64": "^3.7.2", + "long": "^4.0.0" + } + }, + "@starport/vuex": { + "version": "0.1.54", + "resolved": "https://registry.npmjs.org/@starport/vuex/-/vuex-0.1.54.tgz", + "integrity": "sha512-0mq2GKvsM1NUDPkvcYbYIdH1s2b44tZ/qlFyN9hlQRwdnW2pQpZ+t+VQuCujmnF1Jbyy2ZVWQEkX9KNdN06Oow==", + "requires": { + "@confio/relayer": "^0.3.0", + "@cosmjs/crypto": "^0.26.1", + "@cosmjs/encoding": "^0.26.1", + "@cosmjs/launchpad": "^0.26.1", + "@cosmjs/proto-signing": "^0.26.1", + "@cosmjs/stargate": "^0.26.1", + "@cosmjs/tendermint-rpc": "^0.26.1", + "@cosmjs/utils": "^0.26.1", + "@starport/client-js": "^0.1.54", + "axios": "^0.22.0", + "bs58": "^4.0.1", + "crypto-js": "^4.1.1" + }, + "dependencies": { + "@cosmjs/amino": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.26.4.tgz", + "integrity": "sha512-ELqiTVNYqLp+ar6HlPydO3XaxrC5Lc7EIlWNrCos//f6ViVrN4aKUGOP7wWbwjpoq+0D/1NkTIWs40IBmVmP2g==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4" + } + }, + "@cosmjs/crypto": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.26.4.tgz", + "integrity": "sha512-m2mb9cAxaHLFRXRjHVRI6p1IlMwioagCCDZg42EYe3EJgNCs8J8ONcpOAKNGm1cA6MmE8zg1PCPJDN5QtjRA8w==", + "requires": { + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4", + "bip39": "^3.0.2", + "bn.js": "^4.11.8", + "elliptic": "^6.5.3", + "js-sha3": "^0.8.0", + "libsodium-wrappers": "^0.7.6", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11" + } + }, + "@cosmjs/encoding": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.26.4.tgz", + "integrity": "sha512-mA1yAJUA23RPUQ39352bpljfHUwmqGCruLQt/SgvSVBHCcUPEWOLZaV9Sohy5vcbSFlIRLIqdVHjKePZQWoVQw==", + "requires": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "@cosmjs/json-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.26.4.tgz", + "integrity": "sha512-aK2bavVIR6Ty+d2k0vzJDYbhPE8ITAkUlD3hMAkEAZNCYFAdGlQKqnY03sr0QMYT5FPKQ5orp6hetFVse1vX0Q==", + "requires": { + "@cosmjs/stream": "0.26.4", + "xstream": "^11.14.0" + } + }, + "@cosmjs/launchpad": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.26.4.tgz", + "integrity": "sha512-hey2J7rAdwfzIex7UyXfqthnzG83xURyxz3ioTFFZmyuClRRNWmryN25vbHRmPaBHoD+nnw4KTr4GUM+8I69Pw==", + "requires": { + "@cosmjs/amino": "0.26.4", + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/utils": "0.26.4", + "axios": "^0.21.2", + "fast-deep-equal": "^3.1.3" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + } + } + }, + "@cosmjs/math": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.26.4.tgz", + "integrity": "sha512-7w1AMwdPx4RZKp6Pcw4dPUmvWekZO9+inHrtvfBFfRSIowuV9TZBr1mOy+CfUGmL1Yiny1KM9+PS2UGHuXJTIQ==", + "requires": { + "bn.js": "^4.11.8" + } + }, + "@cosmjs/proto-signing": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.26.4.tgz", + "integrity": "sha512-gLC1nZeP9xA1arsWsW1OePmDJiKe9BAybEsRk3b+gjy2fets++/nU/hF0PKuT+jOfTglJenbRqPM4UOl8tiI2A==", + "requires": { + "@cosmjs/amino": "0.26.4", + "@cosmjs/crypto": "0.26.4", + "@cosmjs/math": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2" + } + }, + "@cosmjs/socket": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.26.4.tgz", + "integrity": "sha512-CCoa55qUjk0HC+kZX1iae0rl5iS1iR9PvXrn2HfiLx17e9gLFejvF50M8iuC2qoyAEh0haR0Pq1h8+fhX0OasQ==", + "requires": { + "@cosmjs/stream": "0.26.4", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stargate": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.26.4.tgz", + "integrity": "sha512-K8cpKti05DD5hDMpZ3ucmjQiKRcDYAT/HBN6pE382ajQt7R4aVYl2Q78ujc7euhCtZACuk45MFCi8gm1I6ozuA==", + "requires": { + "@confio/ics23": "^0.6.3", + "@cosmjs/amino": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/proto-signing": "0.26.4", + "@cosmjs/stream": "0.26.4", + "@cosmjs/tendermint-rpc": "0.26.4", + "@cosmjs/utils": "0.26.4", + "cosmjs-types": "^0.2.0", + "long": "^4.0.0", + "protobufjs": "~6.10.2", + "xstream": "^11.14.0" + } + }, + "@cosmjs/stream": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.26.4.tgz", + "integrity": "sha512-mZHyck+jgejwhTgZq+y8sF2CrceW5R4yG0rr7QGnIM7fT8G5kogF2i1Oz9nIGWJiH2GfZzN+q+hdCqTjDcM0wQ==", + "requires": { + "xstream": "^11.14.0" + } + }, + "@cosmjs/tendermint-rpc": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.26.4.tgz", + "integrity": "sha512-ubV+27JSvPGtRVSoqUCn9O02hZwoMG31fCYccZwBnvhDFnFFkDXgRlWvToai6DEQcaSuOdEcikXU7NwLsalelQ==", + "requires": { + "@cosmjs/crypto": "0.26.4", + "@cosmjs/encoding": "0.26.4", + "@cosmjs/json-rpc": "0.26.4", + "@cosmjs/math": "0.26.4", + "@cosmjs/socket": "0.26.4", + "@cosmjs/stream": "0.26.4", + "axios": "^0.21.2", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + } + } + }, + "@cosmjs/utils": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.26.4.tgz", + "integrity": "sha512-2QScX/4sgXN9X5u7hON0i21t4YnGETTpT0btIrQMEQsFJbFKA2M9HT1y8UKfeeiPBZcLG+PixXSpHQ1xonMQcw==" + }, + "@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" + }, + "axios": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", + "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", + "requires": { + "follow-redirects": "^1.14.4" + } + }, + "protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + } + } + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz", + "integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/reconnectingwebsocket": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/reconnectingwebsocket/-/reconnectingwebsocket-1.0.7.tgz", + "integrity": "sha512-17pnIZsGi9P8YNp7c0ueY2WEauSxDivuFeGuMuPPJMA3qk34CnFgBHGqkxgun3HUifEuwNr8cf+9rU7vSd8i5g==" + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/uuid": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.3.tgz", + "integrity": "sha512-0LbEEx1zxrYB3pgpd1M5lEhLcXjKJnYghvhTRgaBeUivLHMDM1TzF3IJ6hXU2+8uA4Xz+5BA63mtZo5DjVT8iA==" + }, + "@types/webpack": { + "version": "4.41.32", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", + "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "dev": true, + "requires": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-preset-app": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.15.tgz", + "integrity": "sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/cli-overlay": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.15.tgz", + "integrity": "sha512-0zI0kANAVmjFO2LWGUIzdGPMeE3+9k+KeRDXsUqB30YfRF7abjfiiRPq5BU9pOzlJbVdpRkisschBrvdJqDuDg==", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.15.tgz", + "integrity": "sha512-hBLrwYfFkHldEe34op/YNgPhpOWI5n5DB2Qt9I/1Epeif4M4iFaayrgjvOR9AVM6WbD3Yx7WCFszYpWrQZpBzQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@vue/babel-preset-app": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "babel-loader": "^8.1.0", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + } + }, + "@vue/cli-plugin-eslint": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.15.tgz", + "integrity": "sha512-/2Fl6wY/5bz3HD035oSnFRMsKNxDxU396KqBdpCQdwdvqk4mm6JAbXqihpcBRTNPeTO6w+LwGe6FE56PVbJdbg==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.15", + "eslint-loader": "^2.2.1", + "globby": "^9.2.0", + "inquirer": "^7.1.0", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + } + }, + "@vue/cli-plugin-router": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz", + "integrity": "sha512-q7Y6kP9b3k55Ca2j59xJ7XPA6x+iSRB+N4ac0ZbcL1TbInVQ4j5wCzyE+uqid40hLy4fUdlpl4X9fHJEwuVxPA==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.15" + } + }, + "@vue/cli-plugin-vuex": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.15.tgz", + "integrity": "sha512-fqap+4HN+w+InDxlA3hZTOGE0tzBTgXhKLoDydhywqgmhQ1D9JA6Feh94ze6tG8DsWX58/ujYUqA8jAz17FJtg==", + "dev": true + }, + "@vue/cli-service": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.15.tgz", + "integrity": "sha512-sFWnLYVCn4zRfu45IcsIE9eXM0YpDV3S11vlM2/DVbIPAGoYo5ySpSof6aHcIvkeGsIsrHFpPHzNvDZ/efs7jA==", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.15", + "@vue/cli-plugin-router": "^4.5.15", + "@vue/cli-plugin-vuex": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^1.4.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-loader-v16": "npm:vue-loader@^16.1.0", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz", + "integrity": "sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "@vue/compiler-core": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.22.tgz", + "integrity": "sha512-uAkovrVeTcjzpiM4ECmVaMrv/bjdgAaLzvjcGqQPBEyUrcqsCgccT9fHJ/+hWVGhyMahmBwLqcn4guULNx7sdw==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/shared": "3.2.22", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.22.tgz", + "integrity": "sha512-VZdsw/VuO1ODs8K7NQwnMQzKITDkIFlYYC03SVnunuf6eNRxBPEonSyqbWNoo6qNaHAEBTG6VVcZC5xC9bAx1g==", + "requires": { + "@vue/compiler-core": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.22.tgz", + "integrity": "sha512-tWRQ5ge1tsTDhUwHgueicKJ8rYm6WUVAPTaIpFW3GSwZKcOEJ2rXdfkHFShNVGupeRALz2ET2H84OL0GeRxY0A==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.22", + "@vue/compiler-dom": "3.2.22", + "@vue/compiler-ssr": "3.2.22", + "@vue/ref-transform": "3.2.22", + "@vue/shared": "3.2.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.22.tgz", + "integrity": "sha512-Cl6aoLJtXzzBkk1sKod8S0WBJLts3+ugVC91d22gGpbkw/64WnF12tOZi7Rg54PPLi1NovqyNWPsLH/SAFcu+w==", + "requires": { + "@vue/compiler-dom": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/devtools-api": { + "version": "6.0.0-beta.20.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.1.tgz", + "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" + }, + "@vue/eslint-config-prettier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz", + "integrity": "sha512-wFQmv45c3ige5EA+ngijq40YpVcIkAy0Lihupnsnd1Dao5CBbPyfCzqtejFLZX1EwH/kCJdpz3t6s+5wd3+KxQ==", + "dev": true, + "requires": { + "eslint-config-prettier": "^6.0.0" + } + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true + }, + "@vue/reactivity": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.22.tgz", + "integrity": "sha512-xNkLAItjI0xB+lFeDgKCrSItmrHTaAzSnt8LmdSCPQnDyarmzbi/u4ESQnckWvlL7lSRKiEaOvblaNyqAa7OnQ==", + "requires": { + "@vue/shared": "3.2.22" + } + }, + "@vue/ref-transform": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.22.tgz", + "integrity": "sha512-qalVWbq5xWWxLZ0L9OroBg/JZhzavQuCcDXblfErxyDEH6Xc5gIJ4feo1SVCICFzhAUgLgQTdSFLpgjBawbFpw==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.22", + "@vue/shared": "3.2.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.22.tgz", + "integrity": "sha512-e7WOC55wmHPvmoVUk9VBe/Z9k5bJfWJfVIlkUkiADJn0bOgQD29oh/GS14Kb3aEJXIHLI17Em6+HxNut1sIh7Q==", + "requires": { + "@vue/reactivity": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/runtime-dom": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.22.tgz", + "integrity": "sha512-w7VHYJoliLRTLc5beN77wxuOjla4v9wr2FF22xpZFYBmH4U1V7HkYhoHc1BTuNghI15CXT1tNIMhibI1nrQgdw==", + "requires": { + "@vue/runtime-core": "3.2.22", + "@vue/shared": "3.2.22", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.22.tgz", + "integrity": "sha512-jCwbQgKPXiXoH9VS9F7K+gyEvEMrjutannwEZD1R8fQ9szmOTqC+RRbIY3Uf2ibQjZtZ8DV9a4FjxICvd9zZlQ==", + "requires": { + "@vue/compiler-ssr": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/shared": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.22.tgz", + "integrity": "sha512-qWVav014mpjEtbWbEgl0q9pEyrrIySKum8UVYjwhC6njrKzknLZPvfuYdQyVbApsqr94tf/3dP4pCuZmmjdCWQ==" + }, + "@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, + "ajv": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.1.tgz", + "integrity": "sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.0", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bintrees": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", + "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" + }, + "bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + }, + "dependencies": { + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + } + } + }, + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001282", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz", + "integrity": "sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg==", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + } + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "core-js": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.1.tgz", + "integrity": "sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==" + }, + "core-js-compat": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", + "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "dev": true, + "requires": { + "browserslist": "^4.17.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "cosmjs-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.2.1.tgz", + "integrity": "sha512-EUG6TgdWkYHBzXjo5tZ82L+0QLijTu/rZGNIbJ/n07ST30GmptYkPmO+REX7qF4YUtli//Rfy0rrNzH9IMrMmw==", + "requires": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + } + } + }, + "csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "dev": true, + "requires": { + "execa": "^3.3.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.903", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.903.tgz", + "integrity": "sha512-+PnYAyniRRTkNq56cqYDLq9LyklZYk0hqoDy9GpcU11H5QjRmFZVDbxtgHUMK/YzdNTcn1XWP5gb+hFlSCr20g==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", + "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-vue": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", + "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", + "dev": true, + "requires": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.4.tgz", + "integrity": "sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ==" + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + } + }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globalthis": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "globule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "gradient-avatar": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gradient-avatar/-/gradient-avatar-1.0.2.tgz", + "integrity": "sha512-Od9KI2YImV60wnsvU/u6GEyBm2fiHUUHgiLySE243GYl/T/tiJMJ5QYey8o7tepugmlnUGQRaCItHv19UnUjUg==", + "requires": { + "hsl-rgb": "^1.0.0", + "hsl-triad": "^1.0.0", + "string-hash": "^1.1.3" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsl-rgb": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-rgb/-/hsl-rgb-1.0.0.tgz", + "integrity": "sha512-cNq+7sfwzSDoiG/jiu8wZpOmjScUZrMKiI33tH3aQ1MZsXWQd0yJjMpPwu2OZFYa4D/bOT1aCbB5gS1kOqFx1A==" + }, + "hsl-triad": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-triad/-/hsl-triad-1.0.0.tgz", + "integrity": "sha512-PKnjrMugS6sHC5dVh4VQZYOHEKG2QILjVwbpEtNjEV19RyswuIxrIiGhumVJjya/FjK/p9gX6+zRMXFGTvaQAA==" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" + }, + "js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true + }, + "js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "requires": { + "easy-stack": "^1.0.1" + } + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "libsodium": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz", + "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A==" + }, + "libsodium-wrappers": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz", + "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==", + "requires": { + "libsodium": "^0.7.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "logform": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", + "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", + "requires": { + "colors": "^1.2.1", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^1.1.0", + "triple-beam": "^1.3.0" + } + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-ipc": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", + "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.3.11", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", + "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==", + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^0.6.2" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prom-client": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-13.1.0.tgz", + "integrity": "sha512-jT9VccZCWrJWXdyEtQddCDszYsiuWj5T0ekrPszi/WEegj3IZy6Mm09iOOVM86A4IKMWq8hZkT2dD9MaSe+sng==", + "requires": { + "tdigest": "^0.1.1" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "16.11.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.8.tgz", + "integrity": "sha512-hmT5gfpRkkHr7DZZHMf3jBe/zNcVGN+jXSL2f8nAsYfBPxQFToKwQlS/zES4Sjp488Bi73i+p6bvrNRRGU0x9Q==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "readonly-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", + "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==" + }, + "reconnecting-websocket": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", + "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" + }, + "table": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", + "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.1.tgz", + "integrity": "sha512-6CiMNDrzv0ZR916u2T+iRunnD60uWmNn8SkdB44/6stVORUg0aAkWO7PkOhpCmjmW8f2I/G/xnowD66fxGyQJg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "tdigest": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz", + "integrity": "sha1-Ljyyw56kSeVdHmzZEReszKRYgCE=", + "requires": { + "bintrees": "1.0.1" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.22.tgz", + "integrity": "sha512-KD5nZpXVZquOC6926Xnp3zOvswrUyO9Rya7ZUoxWFQEjFDW4iACtwzubRB4Um2Om9kj6CaJOqAVRDSFlqLpdgw==", + "requires": { + "@vue/compiler-dom": "3.2.22", + "@vue/compiler-sfc": "3.2.22", + "@vue/runtime-dom": "3.2.22", + "@vue/server-renderer": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "vue-eslint-parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", + "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "vue-router": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.12.tgz", + "integrity": "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.18" + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vue-uuid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vue-uuid/-/vue-uuid-2.0.2.tgz", + "integrity": "sha512-PRf1CHg3uKi77bVRyAuW2u/T2PO9LxMr7cw9t9rNdpZTkNDyw1Fx6eJVL+8JOtM9VxxPkoZ/rwhXJ5l+X5AYzQ==", + "requires": { + "@types/uuid": "^8.0.0", + "uuid": "^8.1.0" + } + }, + "vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.11" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==" + }, + "xstream": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz", + "integrity": "sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==", + "requires": { + "globalthis": "^1.0.1", + "symbol-observable": "^2.0.3" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + } + } +} diff --git a/x/ante/ante.go b/x/ante/ante.go new file mode 100644 index 00000000..202dece0 --- /dev/null +++ b/x/ante/ante.go @@ -0,0 +1,42 @@ +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/ante" + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +func NewHandler( + gentlemintKeeper GentlemintKeeper, + accountKeeper ante.AccountKeeper, + bankKeeper authtypes.BankKeeper, + signModeHandler authsigning.SignModeHandler, + feegrantKeeper ante.FeegrantKeeper, + sigGasConsumer func(meter sdk.GasMeter, sig signing.SignatureV2, params authtypes.Params) error, + roleKeeper RoleKeeper, + idKeeper IDKeeper, +) sdk.AnteHandler { + return sdk.ChainAnteDecorators( + NewLoadFeeDecorator(gentlemintKeeper), + NewCheckFeeDecorator(gentlemintKeeper), + NewCosmosAuthAnteDecorator( + accountKeeper, + bankKeeper, + signModeHandler, + feegrantKeeper, + sigGasConsumer, + ), + NewAuthDecorator(roleKeeper, idKeeper), + sdk.Terminator{}, + ) +} + +type RoleKeeperWithoutVoter struct { + RoleKeeper +} + +func (r RoleKeeperWithoutVoter) IsVoter(ctx sdk.Context, address sdk.AccAddress) bool { + return true +} diff --git a/x/ante/auth.go b/x/ante/auth.go new file mode 100644 index 00000000..66fab026 --- /dev/null +++ b/x/ante/auth.go @@ -0,0 +1,114 @@ +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + documenttypes "github.com/sharering/shareledger/x/document/types" + electoraltypes "github.com/sharering/shareledger/x/electoral/types" + gentleminttypes "github.com/sharering/shareledger/x/gentlemint/types" + idtypes "github.com/sharering/shareledger/x/id/types" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +type Auth struct { + rk RoleKeeper + ik IDKeeper +} + +const ( + ErrMsgNotIdSigner = "Transaction's Signer is not ID signer" + ErrMsgNotSHRPLoader = "Transaction's Signer is not SHRP loader" + ErrMsgNotDocIssuer = "Transaction's Signer is not document issuer" + ErrMsgNotAuthority = "Transaction's Signer is not authority" + ErrMsgNotBackupAccount = "Transaction's Signer is not the backup account" + ErrMsgNotTreasureAccount = "Transaction's Signer is not treasure account" + ErrMsgNotOperatorAccount = "Transaction's Signer is not operator account" + ErrMsgNotVoterAccount = "Transaction's Signer is not voter account" +) + +func NewAuthDecorator(rk RoleKeeper, ik IDKeeper) Auth { + return Auth{ + rk: rk, + ik: ik, + } +} + +func (a Auth) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { + for _, msgI := range tx.GetMsgs() { + signer := msgI.GetSigners()[0] + switch msg := msgI.(type) { + case *gentleminttypes.MsgLoad: + coins := msg.Coins + for _, c := range coins { + switch c.Denom { + case denom.Base, denom.Shr: + if !a.rk.IsAuthority(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotAuthority) + } + default: //denom.BaseUSD denom.SHRP + if !a.rk.IsSHRPLoader(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotSHRPLoader) + } + } + } + case // Authority + *gentleminttypes.MsgSetActionLevelFee, + *gentleminttypes.MsgDeleteActionLevelFee, + *gentleminttypes.MsgSetLevelFee, + *gentleminttypes.MsgDeleteLevelFee, + *electoraltypes.MsgEnrollLoaders, + *electoraltypes.MsgRevokeLoaders, + *electoraltypes.MsgEnrollAccountOperators, + *electoraltypes.MsgRevokeAccountOperators, + *electoraltypes.MsgEnrollVoter, + *electoraltypes.MsgRevokeVoter: + if !a.rk.IsAuthority(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotAuthority) + } + case // Treasure account permission + *gentleminttypes.MsgBurn, + *gentleminttypes.MsgSetExchange: + if !a.rk.IsTreasurer(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotTreasureAccount) + } + case // ID Signer permission + *idtypes.MsgCreateId, + *idtypes.MsgCreateIds, + *idtypes.MsgUpdateId: + if !a.rk.IsIDSigner(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotIdSigner) + } + case // Backup account permission + *idtypes.MsgReplaceIdOwner: + id, _ := a.ik.GetFullIDByIDString(ctx, msg.Id) + if id == nil || id.Data == nil || id.Data.BackupAddress != msg.BackupAddress { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotBackupAccount) + } + case //Doc Issuer + *documenttypes.MsgCreateDocument, + *documenttypes.MsgCreateDocuments, + *documenttypes.MsgUpdateDocument, + *documenttypes.MsgRevokeDocument: + if !a.rk.IsDocIssuer(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotDocIssuer) + } + case // Account Operator + *electoraltypes.MsgEnrollDocIssuers, + *electoraltypes.MsgEnrollIdSigners, + *electoraltypes.MsgRevokeDocIssuers, + *electoraltypes.MsgRevokeIdSigners: + if !a.rk.IsAccountOperator(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotOperatorAccount) + } + case + *stakingtypes.MsgCreateValidator, + *stakingtypes.MsgEditValidator: + if !a.rk.IsVoter(ctx, signer) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, ErrMsgNotVoterAccount) + } + } + } + + return next(ctx, tx, simulate) +} diff --git a/x/ante/cosmos.go b/x/ante/cosmos.go new file mode 100644 index 00000000..b4f8a7f1 --- /dev/null +++ b/x/ante/cosmos.go @@ -0,0 +1,53 @@ +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/ante" + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +// AuthAnteDecorator map 1:1 with "github.com/cosmos/cosmos-sdk/x/auth/ante" +// In order to wrap in Shareledger ante chain +type AuthAnteDecorator struct { + accountKeeper ante.AccountKeeper + bankKeeper types.BankKeeper + signModeHandler authsigning.SignModeHandler + feegrantKeeper ante.FeegrantKeeper + sigGasConsumer func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error +} + +func NewCosmosAuthAnteDecorator( + accountKeeper ante.AccountKeeper, + bankKeeper types.BankKeeper, + signModeHandler authsigning.SignModeHandler, + feegrantKeeper ante.FeegrantKeeper, + sigGasConsumer func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error, +) AuthAnteDecorator { + return AuthAnteDecorator{ + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + signModeHandler: signModeHandler, + feegrantKeeper: feegrantKeeper, + sigGasConsumer: sigGasConsumer, + } +} + +func (a AuthAnteDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { + authAnteHandler, err := ante.NewAnteHandler(ante.HandlerOptions{ + AccountKeeper: a.accountKeeper, + BankKeeper: a.bankKeeper, + SignModeHandler: a.signModeHandler, + FeegrantKeeper: a.feegrantKeeper, + SigGasConsumer: a.sigGasConsumer, + }) + if err != nil { + return + } + newCtx, err = authAnteHandler(ctx, tx, simulate) + if err != nil { + return newCtx, err + } + return next(newCtx, tx, simulate) +} diff --git a/x/ante/dependences.go b/x/ante/dependences.go new file mode 100644 index 00000000..55892606 --- /dev/null +++ b/x/ante/dependences.go @@ -0,0 +1,30 @@ +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" + idtypes "github.com/sharering/shareledger/x/id/types" +) + +type GentlemintKeeper interface { + GetExchangeRateD(ctx sdk.Context) sdk.Dec + GetBaseFeeByMsg(ctx sdk.Context, msg sdk.Msg) (sdk.Coin, error) + LoadFeeFundFromShrp(ctx sdk.Context, msg *types.MsgLoadFee) error +} + +type BankKeeper interface { + SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error +} + +type RoleKeeper interface { + IsAuthority(ctx sdk.Context, address sdk.AccAddress) bool + IsSHRPLoader(ctx sdk.Context, address sdk.AccAddress) bool + IsTreasurer(ctx sdk.Context, address sdk.AccAddress) bool + IsIDSigner(ctx sdk.Context, address sdk.AccAddress) bool + IsDocIssuer(ctx sdk.Context, address sdk.AccAddress) bool + IsAccountOperator(ctx sdk.Context, address sdk.AccAddress) bool + IsVoter(ctx sdk.Context, address sdk.AccAddress) bool +} +type IDKeeper interface { + GetFullIDByIDString(ctx sdk.Context, id string) (*idtypes.Id, bool) +} diff --git a/x/ante/fee.go b/x/ante/fee.go new file mode 100644 index 00000000..c20542f6 --- /dev/null +++ b/x/ante/fee.go @@ -0,0 +1,40 @@ +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +type CheckFeeDecorator struct { + gk GentlemintKeeper +} + +func NewCheckFeeDecorator(gk GentlemintKeeper) CheckFeeDecorator { + return CheckFeeDecorator{ + gk: gk, + } +} + +func (cfd CheckFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { + feeTx, ok := tx.(sdk.FeeTx) + if !ok { + return ctx, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "Tx must be a FeeTx") + } + msgs := tx.GetMsgs() + requiredFees := sdk.NewCoins() + for _, msg := range msgs { + fee, err := cfd.gk.GetBaseFeeByMsg(ctx, msg) + if err != nil { + return ctx, err + } + requiredFees = requiredFees.Add(fee) + } + baseTXFee := feeTx.GetFee().AmountOf(denom.Base) + baseRequiredFee := requiredFees.AmountOf(denom.Base) + + if baseRequiredFee.GT(baseTXFee) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "got %v, required %v", baseTXFee, baseRequiredFee) + } + return next(ctx, tx, simulate) +} diff --git a/x/ante/load_fee.go b/x/ante/load_fee.go new file mode 100644 index 00000000..932d0700 --- /dev/null +++ b/x/ante/load_fee.go @@ -0,0 +1,30 @@ +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + gentleminttypes "github.com/sharering/shareledger/x/gentlemint/types" +) + +type LoadFeeDecorator struct { + gk GentlemintKeeper +} + +func NewLoadFeeDecorator(gk GentlemintKeeper) LoadFeeDecorator { + return LoadFeeDecorator{ + gk: gk, + } +} + +func (cfd LoadFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { + msgs := tx.GetMsgs() + for _, m := range msgs { + switch loadFeeMessage := m.(type) { + case *gentleminttypes.MsgLoadFee: + if err := cfd.gk.LoadFeeFundFromShrp(ctx, loadFeeMessage); err != nil { + return ctx, sdkerrors.Wrapf(err, "load fee from %v", loadFeeMessage.Shrp) + } + } + } + return next(ctx, tx, simulate) +} diff --git a/x/asset/alias.go b/x/asset/alias.go deleted file mode 100644 index ab81d594..00000000 --- a/x/asset/alias.go +++ /dev/null @@ -1,37 +0,0 @@ -package asset - -import ( - "github.com/sharering/shareledger/x/asset/keeper" - "github.com/sharering/shareledger/x/asset/types" -) - -const ( - ModuleName = types.ModuleName - RouterKey = types.RouterKey - StoreKey = types.StoreKey - QuerierRoute = types.QuerierRoute - TypeAssetDeleteMsg = types.TypeAssetDeleteMsg - TypeAssetCreateMsg = types.TypeAssetCreateMsg - TypeAssetUpdateMsg = types.TypeAssetUpdateMsg -) - -var ( - NewKeeper = keeper.NewKeeper - NewQuerier = keeper.NewQuerier - NewCreateAssetMsg = types.NewMsgCreate - NewUpdateAssetMsg = types.NewMsgUpdate - NewDeleteAssetMsg = types.NewMsgDelete - NewAsset = types.NewAsset - ModuleCdc = types.ModuleCdc - RegisterCodec = types.RegisterCodec -) - -type ( - Keeper = keeper.Keeper - MsgCreate = types.MsgCreate - MsgUpdate = types.MsgUpdate - MsgDelete = types.MsgDelete - QueryResResolve = types.QueryResResolve - QueryResNames = types.QueryResNames - Asset = types.Asset -) diff --git a/x/asset/client/cli/query.go b/x/asset/client/cli/query.go index fd50dbe9..67866104 100644 --- a/x/asset/client/cli/query.go +++ b/x/asset/client/cli/query.go @@ -2,48 +2,31 @@ package cli import ( "fmt" + // "strings" + + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" + // "github.com/cosmos/cosmos-sdk/client/flags" + // sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/asset/types" - "github.com/spf13/cobra" ) -func QueryCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - assetQueryCmd := &cobra.Command{ +// GetQueryCmd returns the cli query commands for this module +func GetQueryCmd(queryRoute string) *cobra.Command { + // Group asset queries under a subcommand + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "Querying commands for the identity module", + Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - assetQueryCmd.AddCommand(flags.GetCommands( - CmdGetAsset(storeKey, cdc), - )...) - return assetQueryCmd -} + cmd.AddCommand(CmdAssetByUUID()) -func CmdGetAsset(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "get [uuid]", - Short: "resolve name", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - uuid := args[0] - - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/asset/%s", queryRoute, uuid), nil) - if err != nil { - fmt.Printf("could not get asset - %s \n", uuid) - return nil - } - - var out types.Asset - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } + // this line is used by starport scaffolding # 1 + + return cmd } diff --git a/x/asset/client/cli/query_asset_by_uuid.go b/x/asset/client/cli/query_asset_by_uuid.go new file mode 100644 index 00000000..04e362c4 --- /dev/null +++ b/x/asset/client/cli/query_asset_by_uuid.go @@ -0,0 +1,49 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/asset/types" +) + +var _ = strconv.Itoa(0) + +func CmdAssetByUUID() *cobra.Command { + cmd := &cobra.Command{ + Use: "get [uuid]", + Short: "Query AssetByUUID", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqUUID := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryAssetByUUIDRequest{ + + Uuid: reqUUID, + } + + res, err := queryClient.AssetByUUID(cmd.Context(), params) + if err != nil { + fmt.Printf("could not get asset - %s, %v \n", reqUUID, err) + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/asset/client/cli/tx.go b/x/asset/client/cli/tx.go index d977c882..faad5dc2 100644 --- a/x/asset/client/cli/tx.go +++ b/x/asset/client/cli/tx.go @@ -1,172 +1,38 @@ package cli import ( - "bufio" - "strconv" + "fmt" + "time" "github.com/spf13/cobra" - "github.com/spf13/viper" - shareringUtils "github.com/ShareRing/modules/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" + // "github.com/cosmos/cosmos-sdk/client/flags" "github.com/sharering/shareledger/x/asset/types" ) var ( - creationFee = shareringUtils.HIGHFEE - updateFee = shareringUtils.MEDIUMFEE - deleteFee = shareringUtils.LOWFEE + DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) ) -func GetTxCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - assetCmd := &cobra.Command{ +const ( + flagPacketTimeoutTimestamp = "packet-timeout-timestamp" +) + +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "asset transaction subcommands", + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - assetCmd.AddCommand(flags.PostCommands( - GetCmdCreateAsset(cdc), - GetCmdUpdateAsset(cdc), - GetCmdDeleteAsset(cdc), - )...) - - return assetCmd -} - -func GetCmdCreateAsset(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "create [hash] [uuid] [status] [fee]", - Args: cobra.ExactArgs(4), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txFee, err := shareringUtils.GetFeeFromShrp(cdc, cliCtx, creationFee) - if err != nil { - return err - } - txBldr = txBldr.WithFees(txFee) - hash := []byte(args[0]) - uuid := args[1] - status, err := strconv.ParseBool(args[2]) - if err != nil { - return err - } - fee, err := strconv.Atoi(args[3]) - if err != nil { - return err - } - msg := types.NewMsgCreate(cliCtx.GetFromAddress(), hash, uuid, status, int64(fee)) - err = msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdUpdateAsset(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "update [hash] [uuid] [status] [fee]", - Args: cobra.ExactArgs(4), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) + cmd.AddCommand(CmdCreate()) + cmd.AddCommand(CmdUpdate()) + cmd.AddCommand(CmdDelete()) + // this line is used by starport scaffolding # 1 - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txFee, err := shareringUtils.GetFeeFromShrp(cdc, cliCtx, updateFee) - - if err != nil { - return err - } - - txBldr = txBldr.WithFees(txFee) - - hash := []byte(args[0]) - uuid := args[1] - status, err := strconv.ParseBool(args[2]) - if err != nil { - return err - } - fee, err := strconv.Atoi(args[3]) - if err != nil { - return err - } - msg := types.NewMsgUpdate(cliCtx.GetFromAddress(), hash, uuid, status, int64(fee)) - err = msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdDeleteAsset(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "delete [hash] [uuid] [status] [fee]", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txFee, err := shareringUtils.GetFeeFromShrp(cdc, cliCtx, deleteFee) - if err != nil { - return err - } - txBldr = txBldr.WithFees(txFee) - uuid := args[0] - msg := types.NewMsgDelete(cliCtx.GetFromAddress(), uuid) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") return cmd } diff --git a/x/asset/client/cli/tx_create.go b/x/asset/client/cli/tx_create.go new file mode 100644 index 00000000..41dd5589 --- /dev/null +++ b/x/asset/client/cli/tx_create.go @@ -0,0 +1,55 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/asset/types" +) + +var _ = strconv.Itoa(0) + +func CmdCreate() *cobra.Command { + cmd := &cobra.Command{ + Use: "create [hash] [uuid] [status] [rate]", + Short: "Broadcast message CreateAsset", + Args: cobra.ExactArgs(4), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argHash := []byte(args[0]) + argUUID := args[1] + argStatus, err := strconv.ParseBool(args[2]) + if err != nil { + return err + } + argRate, err := strconv.Atoi(args[3]) + if err != nil { + return err + } + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgCreateAsset( + clientCtx.GetFromAddress().String(), + argHash, + argUUID, + argStatus, + int64(argRate), + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/asset/client/cli/tx_delete.go b/x/asset/client/cli/tx_delete.go new file mode 100644 index 00000000..5101e721 --- /dev/null +++ b/x/asset/client/cli/tx_delete.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/asset/types" +) + +var _ = strconv.Itoa(0) + +func CmdDelete() *cobra.Command { + cmd := &cobra.Command{ + Use: "delete [uuid]", + Short: "Broadcast message DeleteAsset", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argUUID := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgDelete( + clientCtx.GetFromAddress().String(), + argUUID, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/asset/client/cli/tx_update.go b/x/asset/client/cli/tx_update.go new file mode 100644 index 00000000..79cab3d7 --- /dev/null +++ b/x/asset/client/cli/tx_update.go @@ -0,0 +1,55 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/asset/types" +) + +var _ = strconv.Itoa(0) + +func CmdUpdate() *cobra.Command { + cmd := &cobra.Command{ + Use: "update [hash] [uuid] [status] [rate]", + Short: "Broadcast message UpdateAsset", + Args: cobra.ExactArgs(4), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argHash := []byte(args[0]) + argUUID := args[1] + argStatus, err := strconv.ParseBool(args[2]) + if err != nil { + return err + } + argRate, err := strconv.Atoi(args[3]) + if err != nil { + return err + } + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgUpdate( + clientCtx.GetFromAddress().String(), + argHash, + argUUID, + argStatus, + int64(argRate), + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/asset/client/rest/rest.go b/x/asset/client/rest/rest.go deleted file mode 100644 index 1d686fd8..00000000 --- a/x/asset/client/rest/rest.go +++ /dev/null @@ -1,15 +0,0 @@ -package rest - -import ( - "github.com/cosmos/cosmos-sdk/client/context" - - "github.com/gorilla/mux" -) - -const ( - restName = "name" -) - -// RegisterRoutes - Central function to define routes that get registered by the main application -func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, storeName string) { -} diff --git a/x/asset/client/tests/cli_test.go b/x/asset/client/tests/cli_test.go new file mode 100644 index 00000000..df230e3d --- /dev/null +++ b/x/asset/client/tests/cli_test.go @@ -0,0 +1,25 @@ +package tests + +import ( + "github.com/sharering/shareledger/cmd/Shareledgerd/cli" + "sync" + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/sharering/shareledger/testutil/network" +) + +var runOnce = sync.Once{} + +func init() { + runOnce.Do(func() { + cli.InitMiddleWare() + }) +} + +func TestIntegrationTestSuite(t *testing.T) { + cfg := network.ShareLedgerTestingConfig() + cfg.NumValidators = 1 + suite.Run(t, NewAssetIntegrationTestSuite(&cfg)) +} diff --git a/x/asset/client/tests/suite.go b/x/asset/client/tests/suite.go new file mode 100644 index 00000000..42b6433a --- /dev/null +++ b/x/asset/client/tests/suite.go @@ -0,0 +1,348 @@ +package tests + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/testutil/network" + types2 "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/asset/types" + "os" + + netutilts "github.com/sharering/shareledger/testutil/network" + + "github.com/stretchr/testify/suite" +) + +type ( + AssetIntegrationTestSuite struct { + suite.Suite + + cfg *network.Config + network *network.Network + dir string + + existedAsset []GenesisAsset + } + + GenesisAsset struct { + AssetHash string + AssetID string + AssetRate string + AssetStatus string + AssetCreator string + } +) + +func NewAssetIntegrationTestSuite(cfg *network.Config) *AssetIntegrationTestSuite { + return &AssetIntegrationTestSuite{cfg: cfg} +} + +func (s *AssetIntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite") + + kb, dir := netutilts.GetTestingGenesis(s.T(), s.cfg) + s.dir = dir + + s.network = network.New(s.T(), *s.cfg) + _, err := s.network.WaitForHeight(1) + s.Require().NoError(err) + + //override the keyring by our keyring information + s.network.Validators[0].ClientCtx.Keyring = kb + + s.setupTestMaterial() + + s.T().Log("setting up integration test suite successfully") +} +func (s *AssetIntegrationTestSuite) TearDownSuite() { + s.NoError(os.RemoveAll(s.dir), "cleanup test case fails") + s.network.Cleanup() + s.T().Log("tearing down integration test suite") +} + +func (s *AssetIntegrationTestSuite) TestCreateAsset() { + + type testCase struct { + iAssetID string + iAssetHash string + iAssetStatus string + iShrPFee string + iTxFee int + iAcc string + oAsset *types.Asset + oResult *types2.TxResponse + oErr error + d string + } + //write your test suite here + testCases := []testCase{ + { + iAssetID: "id1", + iAssetHash: "cc6f58bd1ada876f0a4941ad579908eda726d6da", + iAssetStatus: "true", + iShrPFee: "2", + iTxFee: 6, + iAcc: netutilts.KeyAccount1, + oResult: &types2.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAsset: &types.Asset{ + Hash: []byte("cc6f58bd1ada876f0a4941ad579908eda726d6da"), + UUID: "id1", + Status: true, + Rate: 2, + }, + oErr: nil, + d: "create the asset successfully and getting new asset for recheck 1", + }, + { + iAssetID: "id2", + iAssetHash: "cc6f58bd1ada876f0a4941ad579908eda726d6sw", + iAssetStatus: "true", + iShrPFee: "2", + iTxFee: 6, + iAcc: netutilts.KeyAccount1, + oResult: &types2.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAsset: &types.Asset{ + Hash: []byte("cc6f58bd1ada876f0a4941ad579908eda726d6sw"), + UUID: "id2", + Status: true, + Rate: 2, + }, + oErr: nil, + d: "create the asset successfully and getting new asset for recheck 2", + }, + { + iAssetID: "e_id_1", + iAssetHash: "0b44517f76eab863c3c4ab13c9774fadd62080ee97af663ec76ffeb671e9e064", + iAssetStatus: "true", + iShrPFee: "2", + iTxFee: 6, + iAcc: netutilts.KeyAccount1, + oResult: &types2.TxResponse{Code: types.ErrAssetExist.ABCICode()}, + oErr: nil, + d: "create the duplicate asset", + }, + { + iAssetID: "e_id_4", + iAssetHash: "0b44517f76eab863c3c4ab13c9774fadd62080ee97af663ec76ffeb671e9ess4", + iAssetStatus: "true", + iShrPFee: "2", + iTxFee: 6, + iAcc: netutilts.KeyEmpty1, + oResult: &types2.TxResponse{Code: sdkerrors.ErrInsufficientFunds.ABCICode()}, + oErr: nil, + d: "create the asset but not enough shr to make txn", + }, + } + + for _, tc := range testCases { + s.Run(tc.d, func() { + out, err := ExCmdCreateAsset(s.network.Validators[0].ClientCtx, tc.iAssetID, tc.iAssetHash, tc.iAssetStatus, tc.iShrPFee, + netutilts.SHRFee(tc.iTxFee), + netutilts.JSONFlag, + netutilts.MakeByAccount(tc.iAcc), + ) + + if tc.oErr != nil { + s.NotNilf(err, tc.d) + } + if tc.oResult != nil { + txnResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(tc.oResult.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + if tc.oAsset != nil { + assetByte, err := ExCmdGetAsset(s.network.Validators[0].ClientCtx, tc.iAssetID) + s.NoError(err) + asset := AssetJsonUnmarshal(s.T(), assetByte.Bytes()) + s.Equal(string(tc.oAsset.Hash), string(asset.Hash)) + s.Equal(tc.oAsset.UUID, asset.UUID) + s.Equal(tc.oAsset.Status, asset.Status, tc.d) + s.Equal(tc.oAsset.Rate, asset.Rate, tc.d) + } + }) + + } + +} + +func (s *AssetIntegrationTestSuite) TestUpdateAsset() { + + type TestCase struct { + iAssetID string + iAssetHash string + iAssetStatus string + iShrPFee string + iTxFee int + iAcc string + oAsset *types.Asset + oResult *types2.TxResponse + oErr error + d string + } + //write your test suite here + testCase := []TestCase{ + { + iAssetID: "e_id_1", + iAssetHash: "0b44517f76eab863c3c4ab13c9774fadd62080ee97af663ec76ffeb671e9e064", + iAssetStatus: "false", + iShrPFee: "4", + iTxFee: 6, + iAcc: netutilts.KeyAccount1, + oAsset: &types.Asset{ + Hash: []byte("0b44517f76eab863c3c4ab13c9774fadd62080ee97af663ec76ffeb671e9e064"), + UUID: "e_id_1", + Status: false, + Rate: 4, + }, + oErr: nil, + oResult: &types2.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + d: "update exited asset by update shrp fee and status", + }, + { + iAssetID: "not_found", + iAssetHash: "not_found_0b44517f76eab863c3c4ab13c9774fadd62080ee97af663ec76ffeb671e9e064", + iAssetStatus: "false", + iShrPFee: "4", + iTxFee: 6, + iAcc: netutilts.KeyAccount1, + oErr: nil, + oResult: &types2.TxResponse{Code: types.ErrNameDoesNotExist.ABCICode()}, + d: "update the not found asset should return an error code", + }, + { + iAssetID: "e_id_2", + iAssetHash: "1a70dac5cb91142a8b5eda54dbeed46a42d1d7af83788c05fa43485acba09fa8", + iAssetStatus: "false", + iShrPFee: "4", + iTxFee: 6, + iAcc: netutilts.KeyAccount3, + oErr: nil, + oResult: &types2.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + d: "update exited asset but the who make transaction wasn't owner of this asset", + }, + } + for _, tc := range testCase { + s.Run(tc.d, func() { + out, err := ExCmdUpdateAsset(s.network.Validators[0].ClientCtx, + tc.iAssetID, tc.iAssetHash, tc.iAssetStatus, tc.iShrPFee, + netutilts.SHRFee(tc.iTxFee), + netutilts.JSONFlag, + netutilts.MakeByAccount(tc.iAcc), + ) + // expect test case co error + if tc.oErr != nil { + s.NotNilf(err, tc.d) + } + if tc.oResult != nil { + txnResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(tc.oResult.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + if tc.oAsset != nil { + assetByte, err := ExCmdGetAsset(s.network.Validators[0].ClientCtx, tc.iAssetID) + s.NoError(err) + asset := AssetJsonUnmarshal(s.T(), assetByte.Bytes()) + s.Equal(string(tc.oAsset.Hash), string(asset.Hash)) + s.Equal(tc.oAsset.UUID, asset.UUID) + s.Equal(tc.oAsset.Status, asset.Status, tc.d) + s.Equal(tc.oAsset.Rate, asset.Rate, tc.d) + } + }) + } + +} + +func (s *AssetIntegrationTestSuite) TestDeleteAsset() { + + type TestCase struct { + iAssetID string + iTxFee int + iAcc string + oResult *types2.TxResponse + oErr error + d string + } + //write your test suite here + testCases := []TestCase{ + { + iAssetID: "e_id_3", + iTxFee: 4, + iAcc: netutilts.KeyAccount1, + oErr: nil, + oResult: &types2.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + d: "delete asset successfully", + }, + { + iAssetID: "not_found", + iTxFee: 4, + iAcc: netutilts.KeyAccount1, + oErr: nil, + oResult: &types2.TxResponse{Code: sdkerrors.ErrNotFound.ABCICode()}, + d: "delete not found asset", + }, + { + iAssetID: "e_id_2", + iTxFee: 4, + iAcc: netutilts.KeyAccount3, + oErr: nil, + oResult: &types2.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + d: "delete asset but don't have the right to do this", + }, + } + + for _, tc := range testCases { + s.Run(tc.d, func() { + out, err := ExCmdDeleteAsset(s.network.Validators[0].ClientCtx, tc.iAssetID, + netutilts.SHRFee(tc.iTxFee), + netutilts.JSONFlag, + netutilts.MakeByAccount(tc.iAcc), + ) + // expect test case co error + if tc.oErr != nil { + s.NotNilf(err, tc.d) + } + if tc.oResult != nil { + txnResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(tc.oResult.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + }) + } +} + +//setupTestMaterial prepare the test data +func (s *AssetIntegrationTestSuite) setupTestMaterial() { + + var assetList = []GenesisAsset{ + { + AssetCreator: netutilts.KeyAccount1, + AssetHash: "0b44517f76eab863c3c4ab13c9774fadd62080ee97af663ec76ffeb671e9e064", + AssetID: "e_id_1", + AssetStatus: "true", + AssetRate: "3", + }, + { + AssetCreator: netutilts.KeyAccount1, + AssetHash: "1a70dac5cb91142a8b5eda54dbeed46a42d1d7af83788c05fa43485acba09fa8", + AssetID: "e_id_2", + AssetStatus: "true", + AssetRate: "3", + }, + { + AssetCreator: netutilts.KeyAccount1, + AssetHash: "70cd57b00247b2eb2dfdcf2b30fa73fd79447c23fa6aa512209fab5b6dca4fd2", + AssetID: "e_id_3", + AssetStatus: "true", + AssetRate: "3", + }, + } + for _, ex := range assetList { + out, err := ExCmdCreateAsset(s.network.Validators[0].ClientCtx, + ex.AssetID, ex.AssetHash, ex.AssetStatus, ex.AssetRate, + netutilts.SHRFee(6), + netutilts.JSONFlag, + netutilts.MakeByAccount(ex.AssetCreator), + ) + s.NoError(err, "starting create asset fail") + txOut := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(netutilts.ShareLedgerSuccessCode, txOut.Code) + } + s.existedAsset = assetList +} diff --git a/x/asset/client/tests/test_helpers.go b/x/asset/client/tests/test_helpers.go new file mode 100644 index 00000000..8e347be7 --- /dev/null +++ b/x/asset/client/tests/test_helpers.go @@ -0,0 +1,53 @@ +package tests + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/stretchr/testify/require" + "github.com/tendermint/spm/cosmoscmd" + + "github.com/sharering/shareledger/app" + "github.com/sharering/shareledger/testutil/network" + "github.com/sharering/shareledger/x/asset/client/cli" + "github.com/sharering/shareledger/x/asset/types" +) + +func ExCmdCreateAsset(clientCtx client.Context, assetUUID, assetHash, assetStatus, assetFee string, userFlags ...string) (testutil.BufferWriter, error) { + args := []string{assetHash, assetUUID, assetStatus, assetFee} + args = append(args, network.SkipConfirmation, network.BlockBroadcast) + args = append(args, userFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdCreate(), args) +} + +func ExCmdUpdateAsset(clientCtx client.Context, assetUUID, assetHash, assetStatus, assetFee string, userFlags ...string) (testutil.BufferWriter, error) { + args := []string{assetHash, assetUUID, assetStatus, assetFee} + args = append(args, network.SkipConfirmation, network.BlockBroadcast) + args = append(args, userFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdUpdate(), args) +} + +func ExCmdDeleteAsset(clientCtx client.Context, assetUUID string, userFlags ...string) (testutil.BufferWriter, error) { + args := []string{assetUUID} + args = append(args, network.SkipConfirmation, network.BlockBroadcast) + args = append(args, userFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdDelete(), args) +} + +func ExCmdGetAsset(clientCtx client.Context, assetUUID string, userFlags ...string) (testutil.BufferWriter, error) { + args := []string{assetUUID} + args = append(args, userFlags...) + args = append(args, network.JSONFlag) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdAssetByUUID(), args) +} + +func AssetJsonUnmarshal(t *testing.T, data []byte) types.Asset { + var a types.QueryAssetByUUIDResponse + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(data, &a) + require.NoError(t, err) + return *a.Asset + +} diff --git a/x/asset/genesis.go b/x/asset/genesis.go index caaf9529..5374ef23 100644 --- a/x/asset/genesis.go +++ b/x/asset/genesis.go @@ -2,39 +2,29 @@ package asset import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/asset/keeper" "github.com/sharering/shareledger/x/asset/types" ) -type GenesisState struct { - Assets []types.Asset -} - -func NewGenesisState() GenesisState { - return GenesisState{} -} - -func ValidateGenesis(data GenesisState) error { - return nil -} - -func DefaultGenesisState() GenesisState { - return GenesisState{} -} - -func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { - for _, a := range data.Assets { - keeper.SetAsset(ctx, a.UUID, a) +// InitGenesis initializes the capability module's state from a provided genesis +// state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + // this line is used by starport scaffolding # genesis/module/init + for _, a := range genState.Assets { + k.SetAsset(ctx, a.GetUUID(), *a) } } -func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState { - var assets []types.Asset +// ExportGenesis returns the capability module's exported genesis. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() + + // this line is used by starport saffolding # genesis/module/export cb := func(a types.Asset) bool { - assets = append(assets, a) + genesis.Assets = append(genesis.Assets, &a) return false } k.IterateAssets(ctx, cb) - return GenesisState{ - Assets: assets, - } + + return genesis } diff --git a/x/asset/genesis_test.go b/x/asset/genesis_test.go new file mode 100644 index 00000000..6d4030a3 --- /dev/null +++ b/x/asset/genesis_test.go @@ -0,0 +1,23 @@ +package asset_test + +import ( + "testing" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/asset" + "github.com/sharering/shareledger/x/asset/types" + "github.com/stretchr/testify/require" +) + +func TestGenesis(t *testing.T) { + genesisState := types.GenesisState{ + // this line is used by starport scaffolding # genesis/test/state + } + + k, ctx := keepertest.AssetKeeper(t) + asset.InitGenesis(ctx, *k, genesisState) + got := asset.ExportGenesis(ctx, *k) + require.NotNil(t, got) + + // this line is used by starport scaffolding # genesis/test/assert +} diff --git a/x/asset/handler.go b/x/asset/handler.go index 39065b67..6635dac1 100644 --- a/x/asset/handler.go +++ b/x/asset/handler.go @@ -2,104 +2,34 @@ package asset import ( "fmt" - "strconv" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/asset/keeper" "github.com/sharering/shareledger/x/asset/types" ) -func NewHandler(keeper Keeper) sdk.Handler { +// NewHandler ... +func NewHandler(k keeper.Keeper) sdk.Handler { + msgServer := keeper.NewMsgServerImpl(k) + return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + ctx = ctx.WithEventManager(sdk.NewEventManager()) + switch msg := msg.(type) { - case MsgCreate: - return handleCreateAsset(ctx, keeper, msg) - case MsgUpdate: - return handleUpdateAsset(ctx, keeper, msg) - case MsgDelete: - return handleDeleteAsset(ctx, keeper, msg) + case *types.MsgCreateAsset: + res, err := msgServer.CreateAsset(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgUpdateAsset: + res, err := msgServer.UpdateAsset(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgDeleteAsset: + res, err := msgServer.DeleteAsset(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + // this line is used by starport scaffolding # 1 default: - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, fmt.Sprintf("Unrecognized asset Msg type: %v", msg.Type())) + errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) + return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } } - -func handleCreateAsset(ctx sdk.Context, keeper Keeper, msg MsgCreate) (*sdk.Result, error) { - oldAsset := keeper.GetAsset(ctx, msg.UUID) - if !oldAsset.Creator.Empty() { - return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "Asset already exists") - } - asset := types.NewAssetFromMsgCreate(msg) - keeper.SetAsset(ctx, msg.UUID, asset) - log, err := asset.GetString() - if err != nil { - return nil, err - } - event := sdk.NewEvent( - EventTypeCreateAsset, - sdk.NewAttribute(AttributeMsgModule, "asset"), - sdk.NewAttribute(AttributeMsgAction, "create"), - sdk.NewAttribute(AttributeAssetCreator, msg.Creator.String()), - sdk.NewAttribute(AttributeAssetUUID, msg.UUID), - sdk.NewAttribute(AttributeAssetHash, fmt.Sprintf("%X", msg.Hash)), - sdk.NewAttribute(AttributeAssetStatus, strconv.FormatBool(msg.Status)), - sdk.NewAttribute(AttributeAssetFee, strconv.Itoa(int(msg.Rate))), - ) - ctx.EventManager().EmitEvent(event) - return &sdk.Result{ - Log: log, - Events: ctx.EventManager().Events(), - }, nil -} - -func handleUpdateAsset(ctx sdk.Context, keeper Keeper, msg MsgUpdate) (*sdk.Result, error) { - oldAsset := keeper.GetAsset(ctx, msg.UUID) - if !oldAsset.Creator.Equals(msg.Creator) { - return nil, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "Only creator can update asset") - } - asset := types.NewAssetFromMsgUpdate(msg) - keeper.SetAsset(ctx, msg.UUID, asset) - log, err := asset.GetString() - if err != nil { - return nil, err - } - event := sdk.NewEvent( - EventTypeUpdateAsset, - sdk.NewAttribute(AttributeMsgModule, "asset"), - sdk.NewAttribute(AttributeMsgAction, "update"), - sdk.NewAttribute(AttributeAssetCreator, msg.Creator.String()), - sdk.NewAttribute(AttributeAssetUUID, msg.UUID), - sdk.NewAttribute(AttributeAssetHash, fmt.Sprintf("%X", msg.Hash)), - sdk.NewAttribute(AttributeAssetStatus, strconv.FormatBool(msg.Status)), - sdk.NewAttribute(AttributeAssetFee, strconv.Itoa(int(msg.Rate))), - ) - - ctx.EventManager().EmitEvent(event) - return &sdk.Result{ - Log: log, - Events: ctx.EventManager().Events(), - }, nil -} - -func handleDeleteAsset(ctx sdk.Context, keeper Keeper, msg MsgDelete) (*sdk.Result, error) { - oldAsset := keeper.GetAsset(ctx, msg.UUID) - if !oldAsset.Creator.Equals(msg.Owner) { - return nil, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "Only Owner can update asset") - } - log, err := oldAsset.GetString() - if err != nil { - return nil, err - } - event := sdk.NewEvent( - EventTypeDeleteAsset, - sdk.NewAttribute(AttributeMsgModule, "asset"), - sdk.NewAttribute(AttributeMsgAction, "delete"), - sdk.NewAttribute(AttributeAssetUUID, msg.UUID), - ) - ctx.EventManager().EmitEvent(event) - keeper.DeleteAsset(ctx, msg.UUID) - return &sdk.Result{ - Log: log, - Events: ctx.EventManager().Events(), - }, nil -} diff --git a/x/asset/keeper/asset.go b/x/asset/keeper/asset.go new file mode 100644 index 00000000..2ba6f22b --- /dev/null +++ b/x/asset/keeper/asset.go @@ -0,0 +1,69 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/asset/types" +) + +func (k Keeper) GetAsset(ctx sdk.Context, uuid string) (types.Asset, bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.UUIDKeyPrefix)) + + if !k.IsAssetExist(ctx, uuid) { + return types.Asset{}, false + } + + bz := store.Get([]byte(uuid)) + + var asset types.Asset + + k.cdc.MustUnmarshalLengthPrefixed(bz, &asset) + + return asset, true +} + +func (k Keeper) SetAsset(ctx sdk.Context, uuid string, asset types.Asset) { + if len(asset.Creator) == 0 || len(asset.UUID) == 0 { + return + } + + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.UUIDKeyPrefix)) + + store.Set([]byte(uuid), k.cdc.MustMarshalLengthPrefixed(&asset)) +} + +func (k Keeper) SetAssetStatus(ctx sdk.Context, uuid string, status bool) { + asset, found := k.GetAsset(ctx, uuid) + if !found { + return + } + + asset.Status = status + k.SetAsset(ctx, uuid, asset) +} + +func (k Keeper) DeleteAsset(ctx sdk.Context, uuid string) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.UUIDKeyPrefix)) + store.Delete([]byte(uuid)) +} + +func (k Keeper) GetAssetsIterator(ctx sdk.Context) sdk.Iterator { + return sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), types.KeyPrefix(types.UUIDKeyPrefix)) +} + +func (k Keeper) IterateAssets(ctx sdk.Context, cb func(a types.Asset) bool) { + iterator := k.GetAssetsIterator(ctx) + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + var asset types.Asset + k.cdc.MustUnmarshalLengthPrefixed(iterator.Value(), &asset) + if cb(asset) { + break + } + } +} + +func (k Keeper) IsAssetExist(ctx sdk.Context, uuid string) bool { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.UUIDKeyPrefix)) + return store.Has([]byte(uuid)) +} diff --git a/x/asset/keeper/grpc_query.go b/x/asset/keeper/grpc_query.go new file mode 100644 index 00000000..78e9eb1a --- /dev/null +++ b/x/asset/keeper/grpc_query.go @@ -0,0 +1,7 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/asset/types" +) + +var _ types.QueryServer = Keeper{} diff --git a/x/asset/keeper/grpc_query_asset_by_uuid.go b/x/asset/keeper/grpc_query_asset_by_uuid.go new file mode 100644 index 00000000..214e28ba --- /dev/null +++ b/x/asset/keeper/grpc_query_asset_by_uuid.go @@ -0,0 +1,27 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/asset/types" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) AssetByUUID(goCtx context.Context, req *types.QueryAssetByUUIDRequest) (*types.QueryAssetByUUIDResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Process the query + asset, found := k.GetAsset(ctx, req.Uuid) + if !found { + return nil, status.Error(codes.NotFound, "Asset not found") + } + + return &types.QueryAssetByUUIDResponse{Asset: &asset}, nil +} diff --git a/x/asset/keeper/keeper.go b/x/asset/keeper/keeper.go index 17835df2..d2debb82 100644 --- a/x/asset/keeper/keeper.go +++ b/x/asset/keeper/keeper.go @@ -1,79 +1,36 @@ package keeper import ( + "fmt" + + "github.com/tendermint/tendermint/libs/log" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/sharering/shareledger/x/asset/types" ) -type Keeper struct { - storeKey sdk.StoreKey - cdc *codec.Codec -} - -func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey) Keeper { - return Keeper{ - cdc: cdc, - storeKey: storeKey, - } -} - -// Gets the entire Whois metadata struct for a name -func (k Keeper) GetAsset(ctx sdk.Context, uuid string) types.Asset { - store := ctx.KVStore(k.storeKey) - - if !k.IsAssetPresent(ctx, uuid) { - return types.NewAsset() - } - - bz := store.Get([]byte(uuid)) - - var asset types.Asset - - k.cdc.MustUnmarshalBinaryBare(bz, &asset) - - return asset -} - -func (k Keeper) SetAsset(ctx sdk.Context, uuid string, asset types.Asset) { - if asset.Creator.Empty() || len(asset.UUID) == 0 { - return +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey sdk.StoreKey + memKey sdk.StoreKey } +) - store := ctx.KVStore(k.storeKey) - - store.Set([]byte(uuid), k.cdc.MustMarshalBinaryBare(asset)) -} - -func (k Keeper) SetAssetStatus(ctx sdk.Context, uuid string, status bool) { - asset := k.GetAsset(ctx, uuid) - asset.Status = status - k.SetAsset(ctx, uuid, asset) -} - -func (k Keeper) DeleteAsset(ctx sdk.Context, uuid string) { - store := ctx.KVStore(k.storeKey) - store.Delete([]byte(uuid)) -} +func NewKeeper( + cdc codec.BinaryCodec, + storeKey, + memKey sdk.StoreKey, -func (k Keeper) GetAssetsIterator(ctx sdk.Context) sdk.Iterator { - store := ctx.KVStore(k.storeKey) - return sdk.KVStorePrefixIterator(store, nil) -} - -func (k Keeper) IterateAssets(ctx sdk.Context, cb func(a types.Asset) bool) { - iterator := k.GetAssetsIterator(ctx) - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - var asset types.Asset - k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &asset) - if cb(asset) { - break - } +) *Keeper { + return &Keeper{ + cdc: cdc, + storeKey: storeKey, + memKey: memKey, } } -func (k Keeper) IsAssetPresent(ctx sdk.Context, uuid string) bool { - store := ctx.KVStore(k.storeKey) - return store.Has([]byte(uuid)) +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } diff --git a/x/asset/keeper/msg_server.go b/x/asset/keeper/msg_server.go new file mode 100644 index 00000000..328ec0ff --- /dev/null +++ b/x/asset/keeper/msg_server.go @@ -0,0 +1,17 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/asset/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} diff --git a/x/asset/keeper/msg_server_create.go b/x/asset/keeper/msg_server_create.go new file mode 100644 index 00000000..f6fc3e50 --- /dev/null +++ b/x/asset/keeper/msg_server_create.go @@ -0,0 +1,38 @@ +package keeper + +import ( + "context" + "fmt" + "strconv" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/asset/types" +) + +func (k msgServer) CreateAsset(goCtx context.Context, msg *types.MsgCreateAsset) (*types.MsgCreateAssetResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + _, found := k.GetAsset(ctx, msg.GetUUID()) + if found { + return nil, sdkerrors.Wrap(types.ErrAssetExist, msg.GetUUID()) + } + + asset := types.NewAssetFromMsgCreate(*msg) + k.SetAsset(ctx, msg.GetUUID(), asset) + + event := sdk.NewEvent( + types.EventTypeCreateAsset, + sdk.NewAttribute(types.AttributeMsgModule, "asset"), + sdk.NewAttribute(types.AttributeMsgAction, "create"), + sdk.NewAttribute(types.AttributeAssetCreator, msg.GetCreator()), + sdk.NewAttribute(types.AttributeAssetUUID, msg.GetUUID()), + sdk.NewAttribute(types.AttributeAssetHash, fmt.Sprintf("%X", msg.GetHash())), + sdk.NewAttribute(types.AttributeAssetStatus, strconv.FormatBool(msg.GetStatus())), + sdk.NewAttribute(types.AttributeAssetFee, strconv.Itoa(int(msg.GetRate()))), + ) + ctx.EventManager().EmitEvent(event) + + return &types.MsgCreateAssetResponse{}, nil +} diff --git a/x/asset/keeper/msg_server_delete.go b/x/asset/keeper/msg_server_delete.go new file mode 100644 index 00000000..2fd0ac16 --- /dev/null +++ b/x/asset/keeper/msg_server_delete.go @@ -0,0 +1,36 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/asset/types" +) + +func (k msgServer) DeleteAsset(goCtx context.Context, msg *types.MsgDeleteAsset) (*types.MsgDeleteAssetResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + oldAsset, found := k.GetAsset(ctx, msg.GetUUID()) + + if !found { + return nil, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "Asset not found") + } + + if oldAsset.GetCreator() != msg.GetOwner() { + return nil, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "Only owner can update asset") + } + + k.Keeper.DeleteAsset(ctx, msg.GetUUID()) + + event := sdk.NewEvent( + types.EventTypeDeleteAsset, + sdk.NewAttribute(types.AttributeMsgModule, "asset"), + sdk.NewAttribute(types.AttributeMsgAction, "delete"), + sdk.NewAttribute(types.AttributeAssetUUID, msg.UUID), + ) + ctx.EventManager().EmitEvent(event) + + return &types.MsgDeleteAssetResponse{}, nil +} diff --git a/x/asset/keeper/msg_server_test.go b/x/asset/keeper/msg_server_test.go new file mode 100644 index 00000000..c8fa7676 --- /dev/null +++ b/x/asset/keeper/msg_server_test.go @@ -0,0 +1,16 @@ +package keeper_test + +import ( + "context" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/asset/keeper" + "github.com/sharering/shareledger/x/asset/types" +) + +func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) { + k, ctx := keepertest.AssetKeeper(t) + return keeper.NewMsgServerImpl(*k), sdk.WrapSDKContext(ctx) +} diff --git a/x/asset/keeper/msg_server_update.go b/x/asset/keeper/msg_server_update.go new file mode 100644 index 00000000..050b5460 --- /dev/null +++ b/x/asset/keeper/msg_server_update.go @@ -0,0 +1,43 @@ +package keeper + +import ( + "context" + "fmt" + "strconv" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/asset/types" +) + +func (k msgServer) UpdateAsset(goCtx context.Context, msg *types.MsgUpdateAsset) (*types.MsgUpdateAssetResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + oldAsset, found := k.GetAsset(ctx, msg.GetUUID()) + + if !found { + return nil, sdkerrors.Wrap(types.ErrNameDoesNotExist, msg.GetUUID()) + } + + if oldAsset.GetCreator() != msg.GetCreator() { + return nil, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "Only creator can update asset") + } + + asset := types.NewAssetFromMsgUpdate(*msg) + k.SetAsset(ctx, msg.GetUUID(), asset) + + event := sdk.NewEvent( + types.EventTypeUpdateAsset, + sdk.NewAttribute(types.AttributeMsgModule, "asset"), + sdk.NewAttribute(types.AttributeMsgAction, "update"), + sdk.NewAttribute(types.AttributeAssetCreator, msg.GetCreator()), + sdk.NewAttribute(types.AttributeAssetUUID, msg.GetUUID()), + sdk.NewAttribute(types.AttributeAssetHash, fmt.Sprintf("%X", msg.GetHash())), + sdk.NewAttribute(types.AttributeAssetStatus, strconv.FormatBool(msg.GetStatus())), + sdk.NewAttribute(types.AttributeAssetFee, strconv.Itoa(int(msg.GetRate()))), + ) + ctx.EventManager().EmitEvent(event) + + return &types.MsgUpdateAssetResponse{}, nil +} diff --git a/x/asset/keeper/querier.go b/x/asset/keeper/querier.go deleted file mode 100644 index 8bc313bc..00000000 --- a/x/asset/keeper/querier.go +++ /dev/null @@ -1,33 +0,0 @@ -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - abci "github.com/tendermint/tendermint/abci/types" -) - -const ( - QueryAsset = "asset" -) - -func NewQuerier(keeper Keeper) sdk.Querier { - return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err error) { - switch path[0] { - case QueryAsset: - return queryAsset(ctx, path[1:], req, keeper) - default: - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Unknown query to asset module") - } - } -} - -func queryAsset(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - Asset := keeper.GetAsset(ctx, path[0]) - res, err := codec.MarshalJSONIndent(keeper.cdc, Asset) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} diff --git a/x/asset/module.go b/x/asset/module.go index 64dd0490..a03c4ceb 100644 --- a/x/asset/module.go +++ b/x/asset/module.go @@ -1,116 +1,169 @@ package asset import ( + "context" "encoding/json" + "fmt" + + // this line is used by starport scaffolding # 1 "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/sharering/shareledger/x/asset/client/cli" - "github.com/sharering/shareledger/x/asset/client/rest" - - "github.com/cosmos/cosmos-sdk/client/context" - sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" + "github.com/sharering/shareledger/x/asset/keeper" + "github.com/sharering/shareledger/x/asset/types" ) -// type check to ensure the interface is properly implemented var ( _ module.AppModule = AppModule{} _ module.AppModuleBasic = AppModuleBasic{} ) -// app module Basics object -type AppModuleBasic struct{} +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- +// AppModuleBasic implements the AppModuleBasic interface for the capability module. +type AppModuleBasic struct { + cdc codec.BinaryCodec +} + +func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the capability module's name. func (AppModuleBasic) Name() string { - return ModuleName + return types.ModuleName +} + +func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) } -func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { - RegisterCodec(cdc) +// RegisterInterfaces registers the module's interface types +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) } -func (AppModuleBasic) DefaultGenesis() json.RawMessage { - return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) +// DefaultGenesis returns the capability module's default genesis state. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) } -// Validation check of the Genesis -func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { - var data GenesisState - err := ModuleCdc.UnmarshalJSON(bz, &data) - if err != nil { - return err +// ValidateGenesis performs genesis state validation for the capability module. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - // Once json successfully marshalled, passes along to genesis.go - return ValidateGenesis(data) + return genState.Validate() } -// Register rest routes -func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { - rest.RegisterRoutes(ctx, rtr, StoreKey) +// RegisterRESTRoutes registers the capability module's REST service handlers. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { } -// Get the root query command of this module -func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { - return cli.QueryCmd(StoreKey, cdc) +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + // this line is used by starport scaffolding # 2 + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) } -// Get the root tx command of this module -func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetTxCmd(StoreKey, cdc) +// GetTxCmd returns the capability module's root tx command. +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() } +// GetQueryCmd returns the capability module's root query command. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(types.StoreKey) +} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- + +// AppModule implements the AppModule interface for the capability module. type AppModule struct { AppModuleBasic - keeper Keeper + + keeper keeper.Keeper } -// NewAppModule creates a new AppModule Object -func NewAppModule(k Keeper) AppModule { +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, } } -func (AppModule) Name() string { - return ModuleName +// Name returns the capability module's name. +func (am AppModule) Name() string { + return am.AppModuleBasic.Name() } -func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} - -func (am AppModule) Route() string { - return RouterKey +// Route returns the capability module's message routing key. +func (am AppModule) Route() sdk.Route { + return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) } -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(am.keeper) -} -func (am AppModule) QuerierRoute() string { - return QuerierRoute +// QuerierRoute returns the capability module's query routing key. +func (AppModule) QuerierRoute() string { return types.QuerierRoute } + +// LegacyQuerierHandler returns the capability module's Querier. +func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { + return nil } -func (am AppModule) NewQuerierHandler() sdk.Querier { - return NewQuerier(am.keeper) +// RegisterServices registers a GRPC query service to respond to the +// module-specific GRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) } -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} +// RegisterInvariants registers the capability module's invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the capability module's genesis initialization It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, am.keeper, genState) -func (am AppModule) EndBlock(sdk.Context, abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } -func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState GenesisState - ModuleCdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} +// ExportGenesis returns the capability 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) + return cdc.MustMarshalJSON(genState) } -func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return ModuleCdc.MustMarshalJSON(gs) +// ConsensusVersion implements ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 2 } + +// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. +func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} + +// EndBlock executes all ABCI EndBlock logic respective to the capability module. It +// returns no validator updates. +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} } diff --git a/x/asset/types/asset.pb.go b/x/asset/types/asset.pb.go new file mode 100644 index 00000000..9be6207b --- /dev/null +++ b/x/asset/types/asset.pb.go @@ -0,0 +1,498 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: asset/asset.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Asset struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + UUID string `protobuf:"bytes,3,opt,name=UUID,proto3" json:"UUID,omitempty"` + Status bool `protobuf:"varint,4,opt,name=status,proto3" json:"status,omitempty"` + Rate int64 `protobuf:"varint,5,opt,name=rate,proto3" json:"rate,omitempty"` +} + +func (m *Asset) Reset() { *m = Asset{} } +func (m *Asset) String() string { return proto.CompactTextString(m) } +func (*Asset) ProtoMessage() {} +func (*Asset) Descriptor() ([]byte, []int) { + return fileDescriptor_06b463ba992d3361, []int{0} +} +func (m *Asset) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Asset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Asset.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Asset) XXX_Merge(src proto.Message) { + xxx_messageInfo_Asset.Merge(m, src) +} +func (m *Asset) XXX_Size() int { + return m.Size() +} +func (m *Asset) XXX_DiscardUnknown() { + xxx_messageInfo_Asset.DiscardUnknown(m) +} + +var xxx_messageInfo_Asset proto.InternalMessageInfo + +func (m *Asset) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *Asset) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + +func (m *Asset) GetUUID() string { + if m != nil { + return m.UUID + } + return "" +} + +func (m *Asset) GetStatus() bool { + if m != nil { + return m.Status + } + return false +} + +func (m *Asset) GetRate() int64 { + if m != nil { + return m.Rate + } + return 0 +} + +func init() { + proto.RegisterType((*Asset)(nil), "shareledger.asset.Asset") +} + +func init() { proto.RegisterFile("asset/asset.proto", fileDescriptor_06b463ba992d3361) } + +var fileDescriptor_06b463ba992d3361 = []byte{ + // 210 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4c, 0x2c, 0x2e, 0x4e, + 0x2d, 0xd1, 0x07, 0x93, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x82, 0xc5, 0x19, 0x89, 0x45, + 0xa9, 0x39, 0xa9, 0x29, 0xe9, 0xa9, 0x45, 0x7a, 0x60, 0x09, 0xa5, 0x52, 0x2e, 0x56, 0x47, 0x10, + 0x43, 0x48, 0x82, 0x8b, 0x3d, 0xb9, 0x28, 0x35, 0xb1, 0x24, 0xbf, 0x48, 0x82, 0x51, 0x81, 0x51, + 0x83, 0x33, 0x08, 0xc6, 0x15, 0x12, 0xe2, 0x62, 0xc9, 0x48, 0x2c, 0xce, 0x90, 0x60, 0x52, 0x60, + 0xd4, 0xe0, 0x09, 0x02, 0xb3, 0x41, 0x62, 0xa1, 0xa1, 0x9e, 0x2e, 0x12, 0xcc, 0x60, 0xa5, 0x60, + 0xb6, 0x90, 0x18, 0x17, 0x5b, 0x71, 0x49, 0x62, 0x49, 0x69, 0xb1, 0x04, 0x8b, 0x02, 0xa3, 0x06, + 0x47, 0x10, 0x94, 0x07, 0x52, 0x5b, 0x94, 0x58, 0x92, 0x2a, 0xc1, 0xaa, 0xc0, 0xa8, 0xc1, 0x1c, + 0x04, 0x66, 0x3b, 0x79, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, + 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x5e, + 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd8, 0xb9, 0x45, 0x99, 0x79, + 0xe9, 0xfa, 0x48, 0x0e, 0xd7, 0xaf, 0x80, 0xf8, 0x49, 0xbf, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, + 0x0d, 0xec, 0x35, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x43, 0x13, 0xb8, 0xbd, 0xef, 0x00, + 0x00, 0x00, +} + +func (m *Asset) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Asset) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Asset) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Rate != 0 { + i = encodeVarintAsset(dAtA, i, uint64(m.Rate)) + i-- + dAtA[i] = 0x28 + } + if m.Status { + i-- + if m.Status { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.UUID) > 0 { + i -= len(m.UUID) + copy(dAtA[i:], m.UUID) + i = encodeVarintAsset(dAtA, i, uint64(len(m.UUID))) + i-- + dAtA[i] = 0x1a + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintAsset(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintAsset(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintAsset(dAtA []byte, offset int, v uint64) int { + offset -= sovAsset(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Asset) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovAsset(uint64(l)) + } + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovAsset(uint64(l)) + } + l = len(m.UUID) + if l > 0 { + n += 1 + l + sovAsset(uint64(l)) + } + if m.Status { + n += 2 + } + if m.Rate != 0 { + n += 1 + sovAsset(uint64(m.Rate)) + } + return n +} + +func sovAsset(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozAsset(x uint64) (n int) { + return sovAsset(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Asset) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAsset + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: Asset: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Asset: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAsset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAsset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAsset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAsset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAsset + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAsset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAsset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAsset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAsset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UUID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAsset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Status = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) + } + m.Rate = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAsset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Rate |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipAsset(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAsset + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAsset(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAsset + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAsset + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAsset + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthAsset + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupAsset + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthAsset + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthAsset = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAsset = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupAsset = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/asset/types/codec.go b/x/asset/types/codec.go index 0e3c8f52..f5a35e05 100644 --- a/x/asset/types/codec.go +++ b/x/asset/types/codec.go @@ -2,18 +2,34 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" ) -// ModuleCdc is the codec for the module -var ModuleCdc = codec.New() - -func init() { - RegisterCodec(ModuleCdc) +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgCreateAsset{}, "asset/CreateAsset", nil) + cdc.RegisterConcrete(&MsgUpdateAsset{}, "asset/UpdateAsset", nil) + cdc.RegisterConcrete(&MsgDeleteAsset{}, "asset/DeleteAsset", nil) + // this line is used by starport scaffolding # 2 } -// RegisterCodec registers concrete types on the Amino codec -func RegisterCodec(cdc *codec.Codec) { - cdc.RegisterConcrete(MsgCreate{}, "asset/Create", nil) - cdc.RegisterConcrete(MsgUpdate{}, "asset/Update", nil) - cdc.RegisterConcrete(MsgDelete{}, "asset/Delete", nil) +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCreateAsset{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgUpdateAsset{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgDeleteAsset{}, + ) + // this line is used by starport scaffolding # 3 + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } + +var ( + amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) +) diff --git a/x/asset/types/errors.go b/x/asset/types/errors.go index ab5ea6ea..a14d5d26 100644 --- a/x/asset/types/errors.go +++ b/x/asset/types/errors.go @@ -1,9 +1,13 @@ package types +// DONTCOVER + import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) +// x/asset module sentinel errors var ( - ErrNameDoesNotExist = sdkerrors.Register(ModuleName, 1, "Asset does not exist") + ErrNameDoesNotExist = sdkerrors.Register(ModuleName, 41, "Asset does not exist") + ErrAssetExist = sdkerrors.Register(ModuleName, 42, "Asset already exist") ) diff --git a/x/asset/events.go b/x/asset/types/events.go similarity index 96% rename from x/asset/events.go rename to x/asset/types/events.go index c31e99d7..41dbb55a 100644 --- a/x/asset/events.go +++ b/x/asset/types/events.go @@ -1,4 +1,4 @@ -package asset +package types const ( EventTypeCreateAsset = "createAsset" diff --git a/x/asset/types/expected_keepers.go b/x/asset/types/expected_keepers.go new file mode 100644 index 00000000..ab1254f4 --- /dev/null +++ b/x/asset/types/expected_keepers.go @@ -0,0 +1 @@ +package types diff --git a/x/asset/types/genesis.go b/x/asset/types/genesis.go new file mode 100644 index 00000000..f13d0c2b --- /dev/null +++ b/x/asset/types/genesis.go @@ -0,0 +1,22 @@ +package types + +// this line is used by starport scaffolding # genesis/types/import + +// DefaultIndex is the default capability global index +const DefaultIndex uint64 = 1 + +// DefaultGenesis returns the default Capability genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{ + // this line is used by starport scaffolding # genesis/types/default + Assets: make([]*Asset, 0), + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + // this line is used by starport scaffolding # genesis/types/validate + + return nil +} diff --git a/x/asset/types/genesis.pb.go b/x/asset/types/genesis.pb.go new file mode 100644 index 00000000..fcaf3a14 --- /dev/null +++ b/x/asset/types/genesis.pb.go @@ -0,0 +1,330 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: asset/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the asset module's genesis state. +type GenesisState struct { + // this line is used by starport scaffolding # genesis/proto/state + Assets []*Asset `protobuf:"bytes,1,rep,name=assets,proto3" json:"assets,omitempty"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_1d0e0b3b2f81e222, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetAssets() []*Asset { + if m != nil { + return m.Assets + } + return nil +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "shareledger.asset.GenesisState") +} + +func init() { proto.RegisterFile("asset/genesis.proto", fileDescriptor_1d0e0b3b2f81e222) } + +var fileDescriptor_1d0e0b3b2f81e222 = []byte{ + // 190 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4e, 0x2c, 0x2e, 0x4e, + 0x2d, 0xd1, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, + 0x12, 0x2c, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x03, 0x2b, 0x90, + 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xcb, 0xea, 0x83, 0x58, 0x10, 0x85, 0x52, 0x82, 0x10, 0xdd, + 0x60, 0x12, 0x22, 0xa4, 0xe4, 0xc6, 0xc5, 0xe3, 0x0e, 0x31, 0x2c, 0xb8, 0x24, 0xb1, 0x24, 0x55, + 0xc8, 0x8c, 0x8b, 0x0d, 0x2c, 0x5d, 0x2c, 0xc1, 0xa8, 0xc0, 0xac, 0xc1, 0x6d, 0x24, 0xa1, 0x87, + 0x61, 0xb8, 0x9e, 0x23, 0x88, 0x74, 0x62, 0x39, 0x71, 0x4f, 0x9e, 0x31, 0x08, 0xaa, 0xda, 0xc9, + 0xe3, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, + 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xf4, 0xd2, 0x33, 0x4b, 0x32, + 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0xc1, 0x66, 0x15, 0x65, 0xe6, 0xa5, 0xeb, 0x23, 0x99, + 0xaa, 0x5f, 0x01, 0x71, 0x91, 0x7e, 0x49, 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x61, 0xc6, + 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc4, 0x72, 0xe9, 0x21, 0xeb, 0x00, 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Assets) > 0 { + for iNdEx := len(m.Assets) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Assets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Assets) > 0 { + for _, e := range m.Assets { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Assets", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Assets = append(m.Assets, &Asset{}) + if err := m.Assets[len(m.Assets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/asset/types/genesis_test.go b/x/asset/types/genesis_test.go new file mode 100644 index 00000000..5f175151 --- /dev/null +++ b/x/asset/types/genesis_test.go @@ -0,0 +1,39 @@ +package types_test + +import ( + "testing" + + "github.com/sharering/shareledger/x/asset/types" + "github.com/stretchr/testify/require" +) + +func TestGenesisState_Validate(t *testing.T) { + for _, tc := range []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + { + desc: "valid genesis state", + genState: &types.GenesisState{ + // this line is used by starport scaffolding # types/genesis/validField + }, + valid: true, + }, + // this line is used by starport scaffolding # types/genesis/testcase + } { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/x/asset/types/key.go b/x/asset/types/key.go deleted file mode 100644 index 17b74b7e..00000000 --- a/x/asset/types/key.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -const ( - // ModuleName is the name of the module - ModuleName = "asset" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey is the module name router key - RouterKey = ModuleName - - // QuerierRoute to be used for querierer msgs - QuerierRoute = ModuleName -) diff --git a/x/asset/types/keys.go b/x/asset/types/keys.go new file mode 100644 index 00000000..006daa8b --- /dev/null +++ b/x/asset/types/keys.go @@ -0,0 +1,28 @@ +package types + +const ( + // ModuleName defines the module name + ModuleName = "asset" + + // StoreKey defines the primary module store key + StoreKey = ModuleName + + // RouterKey is the message route for slashing + RouterKey = ModuleName + + // QuerierRoute defines the module's query routing key + QuerierRoute = ModuleName + + // MemStoreKey defines the in-memory store key + MemStoreKey = "mem_asset" + + TypeAssetCreateMsg = "asset_create" + TypeAssetUpdateMsg = "asset_update" + TypeAssetDeleteMsg = "asset_delete" + + UUIDKeyPrefix = "UUID/" +) + +func KeyPrefix(p string) []byte { + return []byte(p) +} diff --git a/x/asset/types/message_create.go b/x/asset/types/message_create.go new file mode 100644 index 00000000..f4b64137 --- /dev/null +++ b/x/asset/types/message_create.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCreateAsset{} + +func NewMsgCreateAsset(creator string, hash []byte, UUID string, status bool, rate int64) *MsgCreateAsset { + return &MsgCreateAsset{ + Creator: creator, + Hash: hash, + UUID: UUID, + Status: status, + Rate: rate, + } +} + +func (msg *MsgCreateAsset) Route() string { + return RouterKey +} + +func (msg *MsgCreateAsset) Type() string { + return TypeAssetCreateMsg +} + +func (msg *MsgCreateAsset) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgCreateAsset) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCreateAsset) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if len(msg.Creator) == 0 || err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + if len(msg.UUID) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "UUID must not be empty") + } + + return nil +} diff --git a/x/asset/types/message_create_test.go b/x/asset/types/message_create_test.go new file mode 100644 index 00000000..e23beaa4 --- /dev/null +++ b/x/asset/types/message_create_test.go @@ -0,0 +1,42 @@ +package types + +import ( + "github.com/google/uuid" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgCreate_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgCreateAsset + err error + }{ + { + name: "invalid address", + msg: MsgCreateAsset{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgCreateAsset{ + Creator: sample.AccAddress(), + UUID: uuid.New().String(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/asset/types/message_delete.go b/x/asset/types/message_delete.go new file mode 100644 index 00000000..1898df56 --- /dev/null +++ b/x/asset/types/message_delete.go @@ -0,0 +1,49 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgDeleteAsset{} + +func NewMsgDelete(owner, UUID string) *MsgDeleteAsset { + return &MsgDeleteAsset{ + Owner: owner, + UUID: UUID, + } +} + +func (msg *MsgDeleteAsset) Route() string { + return RouterKey +} + +func (msg *MsgDeleteAsset) Type() string { + return TypeAssetDeleteMsg +} + +func (msg *MsgDeleteAsset) GetSigners() []sdk.AccAddress { + owner, err := sdk.AccAddressFromBech32(msg.Owner) + if err != nil { + panic(err) + } + return []sdk.AccAddress{owner} +} + +func (msg *MsgDeleteAsset) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgDeleteAsset) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Owner) + if len(msg.Owner) == 0 || err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid owner address (%s)", err) + } + + if len(msg.UUID) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "UUID must not be empty") + } + + return nil +} diff --git a/x/asset/types/message_delete_test.go b/x/asset/types/message_delete_test.go new file mode 100644 index 00000000..0f906764 --- /dev/null +++ b/x/asset/types/message_delete_test.go @@ -0,0 +1,42 @@ +package types + +import ( + "github.com/google/uuid" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgDelete_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgDeleteAsset + err error + }{ + { + name: "invalid address", + msg: MsgDeleteAsset{ + Owner: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgDeleteAsset{ + Owner: sample.AccAddress(), + UUID: uuid.New().String(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/asset/types/message_update.go b/x/asset/types/message_update.go new file mode 100644 index 00000000..db6f6d56 --- /dev/null +++ b/x/asset/types/message_update.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgUpdateAsset{} + +func NewMsgUpdate(creator string, hash []byte, UUID string, status bool, rate int64) *MsgUpdateAsset { + return &MsgUpdateAsset{ + Creator: creator, + Hash: hash, + UUID: UUID, + Status: status, + Rate: rate, + } +} + +func (msg *MsgUpdateAsset) Route() string { + return RouterKey +} + +func (msg *MsgUpdateAsset) Type() string { + return TypeAssetUpdateMsg +} + +func (msg *MsgUpdateAsset) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgUpdateAsset) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgUpdateAsset) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if len(msg.Creator) == 0 || err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + if len(msg.UUID) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "UUID must not be empty") + } + + return nil +} diff --git a/x/asset/types/message_update_test.go b/x/asset/types/message_update_test.go new file mode 100644 index 00000000..81195343 --- /dev/null +++ b/x/asset/types/message_update_test.go @@ -0,0 +1,42 @@ +package types + +import ( + "github.com/google/uuid" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgUpdate_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgUpdateAsset + err error + }{ + { + name: "invalid address", + msg: MsgUpdateAsset{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgUpdateAsset{ + Creator: sample.AccAddress(), + UUID: uuid.New().String(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/asset/types/msgs.go b/x/asset/types/msgs.go deleted file mode 100644 index e01d4b57..00000000 --- a/x/asset/types/msgs.go +++ /dev/null @@ -1,146 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeAssetCreateMsg = "asset_create" - TypeAssetUpdateMsg = "asset_update" - TypeAssetDeleteMsg = "asset_delete" -) - -type MsgCreate struct { - Creator sdk.AccAddress `json:"creator"` - Hash []byte `json:"hash"` - UUID string `json:"uuid"` - Status bool `json:"status"` - Rate int64 `json:"rate"` -} - -func NewMsgCreate(creator sdk.AccAddress, hash []byte, uuid string, status bool, rate int64) MsgCreate { - return MsgCreate{ - Creator: creator, - Hash: hash, - UUID: uuid, - Rate: rate, - Status: status, - } -} - -func (msg MsgCreate) Route() string { - return RouterKey -} - -// Type Implements Msg -func (msg MsgCreate) Type() string { - return TypeAssetCreateMsg -} - -// ValidateBasic Implements Msg -func (msg MsgCreate) ValidateBasic() error { - if len(msg.Creator) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Address of creator must not be empty") - } - if len(msg.UUID) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "UUID must not be empty") - } - return nil -} - -func (msg MsgCreate) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgCreate) String() string { - return fmt.Sprintf("Asset/MsgCreation{%s}", msg.UUID) -} - -func (msg MsgCreate) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Creator} -} - -type MsgUpdate struct { - Creator sdk.AccAddress `json:"creator"` - Hash []byte `json:"hash"` - UUID string `json:"uuid"` - Status bool `json:"status"` - Rate int64 `json:"rate"` -} - -func NewMsgUpdate(creator sdk.AccAddress, hash []byte, uuid string, status bool, rate int64) MsgUpdate { - return MsgUpdate{ - Creator: creator, - Hash: hash, - UUID: uuid, - Rate: rate, - Status: status, - } -} - -func (msg MsgUpdate) Route() string { - return RouterKey -} - -func (msg MsgUpdate) Type() string { - return TypeAssetUpdateMsg -} - -func (msg MsgUpdate) ValidateBasic() error { - if len(msg.Creator) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Address of creator must not be empty") - } - if len(msg.UUID) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "UUID must not be empty") - } - return nil -} - -func (msg MsgUpdate) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgUpdate) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Creator} -} - -type MsgDelete struct { - Owner sdk.AccAddress `json:"owner"` - UUID string `json:"uuid"` -} - -func NewMsgDelete(owner sdk.AccAddress, uuid string) MsgDelete { - return MsgDelete{ - Owner: owner, - UUID: uuid, - } -} - -func (msg MsgDelete) Route() string { - return RouterKey -} - -func (msg MsgDelete) Type() string { - return TypeAssetDeleteMsg -} - -func (msg MsgDelete) ValidateBasic() error { - if len(msg.UUID) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "UUID must not be empty") - } - if len(msg.UUID) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "UUID must not be empty") - } - return nil -} - -func (msg MsgDelete) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgDelete) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Owner} -} diff --git a/x/asset/types/querier.go b/x/asset/types/querier.go deleted file mode 100644 index f7a63a33..00000000 --- a/x/asset/types/querier.go +++ /dev/null @@ -1,21 +0,0 @@ -package types - -import "strings" - -// QueryResResolve Queries Result Payload for a resolve query -type QueryResResolve struct { - Value string `json:"value"` -} - -// implement fmt.Stringer -func (r QueryResResolve) String() string { - return r.Value -} - -// QueryResNames Queries Result Payload for a names query -type QueryResNames []string - -// implement fmt.Stringer -func (n QueryResNames) String() string { - return strings.Join(n[:], "\n") -} diff --git a/x/asset/types/query.pb.go b/x/asset/types/query.pb.go new file mode 100644 index 00000000..1603815d --- /dev/null +++ b/x/asset/types/query.pb.go @@ -0,0 +1,587 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: asset/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryAssetByUUIDRequest struct { + Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` +} + +func (m *QueryAssetByUUIDRequest) Reset() { *m = QueryAssetByUUIDRequest{} } +func (m *QueryAssetByUUIDRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAssetByUUIDRequest) ProtoMessage() {} +func (*QueryAssetByUUIDRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4785ee6dd031b7c8, []int{0} +} +func (m *QueryAssetByUUIDRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAssetByUUIDRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAssetByUUIDRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAssetByUUIDRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAssetByUUIDRequest.Merge(m, src) +} +func (m *QueryAssetByUUIDRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAssetByUUIDRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAssetByUUIDRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAssetByUUIDRequest proto.InternalMessageInfo + +type QueryAssetByUUIDResponse struct { + Asset *Asset `protobuf:"bytes,1,opt,name=asset,proto3" json:"asset,omitempty"` +} + +func (m *QueryAssetByUUIDResponse) Reset() { *m = QueryAssetByUUIDResponse{} } +func (m *QueryAssetByUUIDResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAssetByUUIDResponse) ProtoMessage() {} +func (*QueryAssetByUUIDResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4785ee6dd031b7c8, []int{1} +} +func (m *QueryAssetByUUIDResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAssetByUUIDResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAssetByUUIDResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAssetByUUIDResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAssetByUUIDResponse.Merge(m, src) +} +func (m *QueryAssetByUUIDResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAssetByUUIDResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAssetByUUIDResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAssetByUUIDResponse proto.InternalMessageInfo + +func (m *QueryAssetByUUIDResponse) GetAsset() *Asset { + if m != nil { + return m.Asset + } + return nil +} + +func init() { + proto.RegisterType((*QueryAssetByUUIDRequest)(nil), "shareledger.asset.QueryAssetByUUIDRequest") + proto.RegisterType((*QueryAssetByUUIDResponse)(nil), "shareledger.asset.QueryAssetByUUIDResponse") +} + +func init() { proto.RegisterFile("asset/query.proto", fileDescriptor_4785ee6dd031b7c8) } + +var fileDescriptor_4785ee6dd031b7c8 = []byte{ + // 328 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4c, 0x2c, 0x2e, 0x4e, + 0x2d, 0xd1, 0x2f, 0x2c, 0x4d, 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2c, + 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x03, 0x4b, 0x4b, 0x89, 0xa4, + 0xe7, 0xa7, 0xe7, 0x83, 0x65, 0xf5, 0x41, 0x2c, 0x88, 0x42, 0x29, 0x99, 0xf4, 0xfc, 0xfc, 0xf4, + 0x9c, 0x54, 0xfd, 0xc4, 0x82, 0x4c, 0xfd, 0xc4, 0xbc, 0xbc, 0xfc, 0x92, 0xc4, 0x92, 0xcc, 0xfc, + 0xbc, 0x62, 0xa8, 0xac, 0x56, 0x72, 0x7e, 0x71, 0x6e, 0x7e, 0xb1, 0x7e, 0x52, 0x62, 0x71, 0x2a, + 0xc4, 0x7c, 0xfd, 0x32, 0xc3, 0xa4, 0xd4, 0x92, 0x44, 0x43, 0xfd, 0x82, 0xc4, 0xf4, 0xcc, 0x3c, + 0xb0, 0x62, 0xa8, 0x5a, 0xa8, 0x2b, 0xc0, 0x24, 0x44, 0x48, 0xc9, 0x9c, 0x4b, 0x3c, 0x10, 0xa4, + 0xc9, 0x11, 0x24, 0xe6, 0x54, 0x19, 0x1a, 0xea, 0xe9, 0x12, 0x94, 0x5a, 0x58, 0x9a, 0x5a, 0x5c, + 0x22, 0x24, 0xc4, 0xc5, 0x52, 0x5a, 0x9a, 0x99, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04, + 0x66, 0x5b, 0x71, 0x74, 0x2c, 0x90, 0x67, 0x78, 0xb1, 0x40, 0x9e, 0x41, 0xc9, 0x8b, 0x4b, 0x02, + 0x53, 0x63, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x90, 0x1e, 0x17, 0x2b, 0xd8, 0x0e, 0xb0, 0x56, + 0x6e, 0x23, 0x09, 0x3d, 0x0c, 0xaf, 0xea, 0x81, 0xb5, 0x05, 0x41, 0x94, 0x19, 0x4d, 0x66, 0xe4, + 0x62, 0x05, 0x1b, 0x26, 0xd4, 0xc9, 0xc8, 0xc5, 0x8d, 0x64, 0xa2, 0x90, 0x16, 0x16, 0xad, 0x38, + 0xdc, 0x2b, 0xa5, 0x4d, 0x94, 0x5a, 0x88, 0x13, 0x95, 0x14, 0x9b, 0x2e, 0x3f, 0x99, 0xcc, 0x24, + 0x2d, 0x24, 0xa9, 0x8f, 0xa4, 0x09, 0x12, 0x32, 0xfa, 0xd5, 0x20, 0xaf, 0xd6, 0x3a, 0x79, 0x9c, + 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, + 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x5e, 0x7a, 0x66, 0x49, 0x46, 0x69, + 0x92, 0x5e, 0x72, 0x7e, 0x2e, 0x44, 0x7b, 0x51, 0x66, 0x5e, 0x3a, 0x8a, 0x41, 0x15, 0x50, 0xa3, + 0x4a, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x61, 0x6d, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, + 0x98, 0x63, 0xfa, 0x73, 0x06, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Queries a list of assetByUUID items. + AssetByUUID(ctx context.Context, in *QueryAssetByUUIDRequest, opts ...grpc.CallOption) (*QueryAssetByUUIDResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) AssetByUUID(ctx context.Context, in *QueryAssetByUUIDRequest, opts ...grpc.CallOption) (*QueryAssetByUUIDResponse, error) { + out := new(QueryAssetByUUIDResponse) + err := c.cc.Invoke(ctx, "/shareledger.asset.Query/AssetByUUID", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Queries a list of assetByUUID items. + AssetByUUID(context.Context, *QueryAssetByUUIDRequest) (*QueryAssetByUUIDResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) AssetByUUID(ctx context.Context, req *QueryAssetByUUIDRequest) (*QueryAssetByUUIDResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AssetByUUID not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_AssetByUUID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAssetByUUIDRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AssetByUUID(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.asset.Query/AssetByUUID", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AssetByUUID(ctx, req.(*QueryAssetByUUIDRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.asset.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "AssetByUUID", + Handler: _Query_AssetByUUID_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "asset/query.proto", +} + +func (m *QueryAssetByUUIDRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAssetByUUIDRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAssetByUUIDRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Uuid) > 0 { + i -= len(m.Uuid) + copy(dAtA[i:], m.Uuid) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Uuid))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryAssetByUUIDResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAssetByUUIDResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAssetByUUIDResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Asset != nil { + { + size, err := m.Asset.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryAssetByUUIDRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Uuid) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryAssetByUUIDResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Asset != nil { + l = m.Asset.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryAssetByUUIDRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAssetByUUIDRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAssetByUUIDRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Uuid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Uuid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAssetByUUIDResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAssetByUUIDResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAssetByUUIDResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Asset", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Asset == nil { + m.Asset = &Asset{} + } + if err := m.Asset.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/asset/types/query.pb.gw.go b/x/asset/types/query.pb.gw.go new file mode 100644 index 00000000..e3f78e9f --- /dev/null +++ b/x/asset/types/query.pb.gw.go @@ -0,0 +1,189 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: asset/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_AssetByUUID_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAssetByUUIDRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["uuid"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uuid") + } + + protoReq.Uuid, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uuid", err) + } + + msg, err := client.AssetByUUID(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_AssetByUUID_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAssetByUUIDRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["uuid"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uuid") + } + + protoReq.Uuid, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uuid", err) + } + + msg, err := server.AssetByUUID(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_AssetByUUID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AssetByUUID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AssetByUUID_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_AssetByUUID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_AssetByUUID_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AssetByUUID_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_AssetByUUID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"shareledger", "asset", "uuid"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Query_AssetByUUID_0 = runtime.ForwardResponseMessage +) diff --git a/x/asset/types/tx.pb.go b/x/asset/types/tx.pb.go new file mode 100644 index 00000000..68aab036 --- /dev/null +++ b/x/asset/types/tx.pb.go @@ -0,0 +1,1590 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: asset/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgCreateAsset struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + UUID string `protobuf:"bytes,3,opt,name=UUID,proto3" json:"UUID,omitempty"` + Status bool `protobuf:"varint,4,opt,name=status,proto3" json:"status,omitempty"` + Rate int64 `protobuf:"varint,5,opt,name=rate,proto3" json:"rate,omitempty"` +} + +func (m *MsgCreateAsset) Reset() { *m = MsgCreateAsset{} } +func (m *MsgCreateAsset) String() string { return proto.CompactTextString(m) } +func (*MsgCreateAsset) ProtoMessage() {} +func (*MsgCreateAsset) Descriptor() ([]byte, []int) { + return fileDescriptor_d916a3b302eb5de7, []int{0} +} +func (m *MsgCreateAsset) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateAsset.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateAsset) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateAsset.Merge(m, src) +} +func (m *MsgCreateAsset) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateAsset) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateAsset.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateAsset proto.InternalMessageInfo + +func (m *MsgCreateAsset) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgCreateAsset) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + +func (m *MsgCreateAsset) GetUUID() string { + if m != nil { + return m.UUID + } + return "" +} + +func (m *MsgCreateAsset) GetStatus() bool { + if m != nil { + return m.Status + } + return false +} + +func (m *MsgCreateAsset) GetRate() int64 { + if m != nil { + return m.Rate + } + return 0 +} + +type MsgCreateAssetResponse struct { +} + +func (m *MsgCreateAssetResponse) Reset() { *m = MsgCreateAssetResponse{} } +func (m *MsgCreateAssetResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateAssetResponse) ProtoMessage() {} +func (*MsgCreateAssetResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d916a3b302eb5de7, []int{1} +} +func (m *MsgCreateAssetResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateAssetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateAssetResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateAssetResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateAssetResponse.Merge(m, src) +} +func (m *MsgCreateAssetResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateAssetResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateAssetResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateAssetResponse proto.InternalMessageInfo + +type MsgUpdateAsset struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + UUID string `protobuf:"bytes,3,opt,name=UUID,proto3" json:"UUID,omitempty"` + Status bool `protobuf:"varint,4,opt,name=status,proto3" json:"status,omitempty"` + Rate int64 `protobuf:"varint,5,opt,name=rate,proto3" json:"rate,omitempty"` +} + +func (m *MsgUpdateAsset) Reset() { *m = MsgUpdateAsset{} } +func (m *MsgUpdateAsset) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateAsset) ProtoMessage() {} +func (*MsgUpdateAsset) Descriptor() ([]byte, []int) { + return fileDescriptor_d916a3b302eb5de7, []int{2} +} +func (m *MsgUpdateAsset) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateAsset.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateAsset) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateAsset.Merge(m, src) +} +func (m *MsgUpdateAsset) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateAsset) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateAsset.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateAsset proto.InternalMessageInfo + +func (m *MsgUpdateAsset) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgUpdateAsset) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + +func (m *MsgUpdateAsset) GetUUID() string { + if m != nil { + return m.UUID + } + return "" +} + +func (m *MsgUpdateAsset) GetStatus() bool { + if m != nil { + return m.Status + } + return false +} + +func (m *MsgUpdateAsset) GetRate() int64 { + if m != nil { + return m.Rate + } + return 0 +} + +type MsgUpdateAssetResponse struct { +} + +func (m *MsgUpdateAssetResponse) Reset() { *m = MsgUpdateAssetResponse{} } +func (m *MsgUpdateAssetResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateAssetResponse) ProtoMessage() {} +func (*MsgUpdateAssetResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d916a3b302eb5de7, []int{3} +} +func (m *MsgUpdateAssetResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateAssetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateAssetResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateAssetResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateAssetResponse.Merge(m, src) +} +func (m *MsgUpdateAssetResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateAssetResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateAssetResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateAssetResponse proto.InternalMessageInfo + +type MsgDeleteAsset struct { + Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"` + UUID string `protobuf:"bytes,2,opt,name=UUID,proto3" json:"UUID,omitempty"` +} + +func (m *MsgDeleteAsset) Reset() { *m = MsgDeleteAsset{} } +func (m *MsgDeleteAsset) String() string { return proto.CompactTextString(m) } +func (*MsgDeleteAsset) ProtoMessage() {} +func (*MsgDeleteAsset) Descriptor() ([]byte, []int) { + return fileDescriptor_d916a3b302eb5de7, []int{4} +} +func (m *MsgDeleteAsset) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgDeleteAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgDeleteAsset.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgDeleteAsset) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgDeleteAsset.Merge(m, src) +} +func (m *MsgDeleteAsset) XXX_Size() int { + return m.Size() +} +func (m *MsgDeleteAsset) XXX_DiscardUnknown() { + xxx_messageInfo_MsgDeleteAsset.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgDeleteAsset proto.InternalMessageInfo + +func (m *MsgDeleteAsset) GetOwner() string { + if m != nil { + return m.Owner + } + return "" +} + +func (m *MsgDeleteAsset) GetUUID() string { + if m != nil { + return m.UUID + } + return "" +} + +type MsgDeleteAssetResponse struct { +} + +func (m *MsgDeleteAssetResponse) Reset() { *m = MsgDeleteAssetResponse{} } +func (m *MsgDeleteAssetResponse) String() string { return proto.CompactTextString(m) } +func (*MsgDeleteAssetResponse) ProtoMessage() {} +func (*MsgDeleteAssetResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d916a3b302eb5de7, []int{5} +} +func (m *MsgDeleteAssetResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgDeleteAssetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgDeleteAssetResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgDeleteAssetResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgDeleteAssetResponse.Merge(m, src) +} +func (m *MsgDeleteAssetResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgDeleteAssetResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgDeleteAssetResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgDeleteAssetResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCreateAsset)(nil), "shareledger.asset.MsgCreateAsset") + proto.RegisterType((*MsgCreateAssetResponse)(nil), "shareledger.asset.MsgCreateAssetResponse") + proto.RegisterType((*MsgUpdateAsset)(nil), "shareledger.asset.MsgUpdateAsset") + proto.RegisterType((*MsgUpdateAssetResponse)(nil), "shareledger.asset.MsgUpdateAssetResponse") + proto.RegisterType((*MsgDeleteAsset)(nil), "shareledger.asset.MsgDeleteAsset") + proto.RegisterType((*MsgDeleteAssetResponse)(nil), "shareledger.asset.MsgDeleteAssetResponse") +} + +func init() { proto.RegisterFile("asset/tx.proto", fileDescriptor_d916a3b302eb5de7) } + +var fileDescriptor_d916a3b302eb5de7 = []byte{ + // 333 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4b, 0x2c, 0x2e, 0x4e, + 0x2d, 0xd1, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2c, 0xce, 0x48, 0x2c, + 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x03, 0xcb, 0x29, 0xd5, 0x71, 0xf1, 0xf9, 0x16, + 0xa7, 0x3b, 0x17, 0xa5, 0x26, 0x96, 0xa4, 0x3a, 0x82, 0x44, 0x84, 0x24, 0xb8, 0xd8, 0x93, 0x41, + 0xdc, 0xfc, 0x22, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20, 0x18, 0x57, 0x48, 0x88, 0x8b, 0x25, + 0x23, 0xb1, 0x38, 0x43, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xcc, 0x06, 0x89, 0x85, 0x86, + 0x7a, 0xba, 0x48, 0x30, 0x83, 0x95, 0x82, 0xd9, 0x42, 0x62, 0x5c, 0x6c, 0xc5, 0x25, 0x89, 0x25, + 0xa5, 0xc5, 0x12, 0x2c, 0x0a, 0x8c, 0x1a, 0x1c, 0x41, 0x50, 0x1e, 0x48, 0x6d, 0x51, 0x62, 0x49, + 0xaa, 0x04, 0xab, 0x02, 0xa3, 0x06, 0x73, 0x10, 0x98, 0xad, 0x24, 0xc1, 0x25, 0x86, 0x6a, 0x7f, + 0x50, 0x6a, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0x2a, 0xd4, 0x65, 0xa1, 0x05, 0x29, 0x03, 0xea, 0x32, + 0x24, 0xfb, 0xe1, 0x2e, 0xb3, 0x02, 0xbb, 0xcc, 0x25, 0x35, 0x27, 0x15, 0xe6, 0x32, 0x11, 0x2e, + 0xd6, 0xfc, 0xf2, 0xbc, 0x54, 0x98, 0xbb, 0x20, 0x1c, 0xb8, 0x0b, 0x98, 0x10, 0x2e, 0x80, 0x9a, + 0x8a, 0xa4, 0x17, 0x66, 0xaa, 0xd1, 0x1c, 0x26, 0x2e, 0x66, 0xdf, 0xe2, 0x74, 0xa1, 0x68, 0x2e, + 0x6e, 0xe4, 0xe8, 0x50, 0xd4, 0xc3, 0x88, 0x34, 0x3d, 0xd4, 0x10, 0x93, 0xd2, 0x24, 0xa8, 0x04, + 0x66, 0x09, 0xc8, 0x70, 0xe4, 0x10, 0xc5, 0x61, 0x38, 0x92, 0x12, 0x5c, 0x86, 0x63, 0x09, 0x17, + 0x90, 0xe1, 0xc8, 0x81, 0x82, 0xc3, 0x70, 0x24, 0x25, 0xb8, 0x0c, 0xc7, 0x12, 0x3c, 0x4e, 0x1e, + 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, + 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x97, 0x9e, 0x59, 0x92, 0x51, + 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x36, 0xae, 0x28, 0x33, 0x2f, 0x5d, 0x1f, 0xc9, 0x60, + 0xfd, 0x0a, 0x7d, 0x68, 0x46, 0xa8, 0x2c, 0x48, 0x2d, 0x4e, 0x62, 0x03, 0x67, 0x06, 0x63, 0x40, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x26, 0x87, 0xdc, 0x58, 0x1e, 0x03, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + CreateAsset(ctx context.Context, in *MsgCreateAsset, opts ...grpc.CallOption) (*MsgCreateAssetResponse, error) + UpdateAsset(ctx context.Context, in *MsgUpdateAsset, opts ...grpc.CallOption) (*MsgUpdateAssetResponse, error) + DeleteAsset(ctx context.Context, in *MsgDeleteAsset, opts ...grpc.CallOption) (*MsgDeleteAssetResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) CreateAsset(ctx context.Context, in *MsgCreateAsset, opts ...grpc.CallOption) (*MsgCreateAssetResponse, error) { + out := new(MsgCreateAssetResponse) + err := c.cc.Invoke(ctx, "/shareledger.asset.Msg/CreateAsset", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) UpdateAsset(ctx context.Context, in *MsgUpdateAsset, opts ...grpc.CallOption) (*MsgUpdateAssetResponse, error) { + out := new(MsgUpdateAssetResponse) + err := c.cc.Invoke(ctx, "/shareledger.asset.Msg/UpdateAsset", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) DeleteAsset(ctx context.Context, in *MsgDeleteAsset, opts ...grpc.CallOption) (*MsgDeleteAssetResponse, error) { + out := new(MsgDeleteAssetResponse) + err := c.cc.Invoke(ctx, "/shareledger.asset.Msg/DeleteAsset", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + CreateAsset(context.Context, *MsgCreateAsset) (*MsgCreateAssetResponse, error) + UpdateAsset(context.Context, *MsgUpdateAsset) (*MsgUpdateAssetResponse, error) + DeleteAsset(context.Context, *MsgDeleteAsset) (*MsgDeleteAssetResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) CreateAsset(ctx context.Context, req *MsgCreateAsset) (*MsgCreateAssetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAsset not implemented") +} +func (*UnimplementedMsgServer) UpdateAsset(ctx context.Context, req *MsgUpdateAsset) (*MsgUpdateAssetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateAsset not implemented") +} +func (*UnimplementedMsgServer) DeleteAsset(ctx context.Context, req *MsgDeleteAsset) (*MsgDeleteAssetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAsset not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_CreateAsset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateAsset) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateAsset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.asset.Msg/CreateAsset", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateAsset(ctx, req.(*MsgCreateAsset)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_UpdateAsset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateAsset) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateAsset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.asset.Msg/UpdateAsset", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateAsset(ctx, req.(*MsgUpdateAsset)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_DeleteAsset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgDeleteAsset) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).DeleteAsset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.asset.Msg/DeleteAsset", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).DeleteAsset(ctx, req.(*MsgDeleteAsset)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.asset.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateAsset", + Handler: _Msg_CreateAsset_Handler, + }, + { + MethodName: "UpdateAsset", + Handler: _Msg_UpdateAsset_Handler, + }, + { + MethodName: "DeleteAsset", + Handler: _Msg_DeleteAsset_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "asset/tx.proto", +} + +func (m *MsgCreateAsset) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateAsset) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateAsset) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Rate != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Rate)) + i-- + dAtA[i] = 0x28 + } + if m.Status { + i-- + if m.Status { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.UUID) > 0 { + i -= len(m.UUID) + copy(dAtA[i:], m.UUID) + i = encodeVarintTx(dAtA, i, uint64(len(m.UUID))) + i-- + dAtA[i] = 0x1a + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateAssetResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateAssetResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateAssetResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgUpdateAsset) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateAsset) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateAsset) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Rate != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Rate)) + i-- + dAtA[i] = 0x28 + } + if m.Status { + i-- + if m.Status { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.UUID) > 0 { + i -= len(m.UUID) + copy(dAtA[i:], m.UUID) + i = encodeVarintTx(dAtA, i, uint64(len(m.UUID))) + i-- + dAtA[i] = 0x1a + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateAssetResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateAssetResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateAssetResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgDeleteAsset) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgDeleteAsset) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgDeleteAsset) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.UUID) > 0 { + i -= len(m.UUID) + copy(dAtA[i:], m.UUID) + i = encodeVarintTx(dAtA, i, uint64(len(m.UUID))) + i-- + dAtA[i] = 0x12 + } + if len(m.Owner) > 0 { + i -= len(m.Owner) + copy(dAtA[i:], m.Owner) + i = encodeVarintTx(dAtA, i, uint64(len(m.Owner))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgDeleteAssetResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgDeleteAssetResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgDeleteAssetResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateAsset) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.UUID) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Status { + n += 2 + } + if m.Rate != 0 { + n += 1 + sovTx(uint64(m.Rate)) + } + return n +} + +func (m *MsgCreateAssetResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgUpdateAsset) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.UUID) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Status { + n += 2 + } + if m.Rate != 0 { + n += 1 + sovTx(uint64(m.Rate)) + } + return n +} + +func (m *MsgUpdateAssetResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgDeleteAsset) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Owner) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.UUID) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgDeleteAssetResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateAsset) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateAsset: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateAsset: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UUID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Status = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) + } + m.Rate = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Rate |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateAssetResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateAssetResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateAssetResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateAsset) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgUpdateAsset: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateAsset: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UUID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Status = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) + } + m.Rate = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Rate |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateAssetResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgUpdateAssetResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateAssetResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDeleteAsset) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgDeleteAsset: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDeleteAsset: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Owner = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UUID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDeleteAssetResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgDeleteAssetResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDeleteAssetResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/asset/types/types.go b/x/asset/types/types.go index 23e155d1..13e2292f 100644 --- a/x/asset/types/types.go +++ b/x/asset/types/types.go @@ -1,25 +1,9 @@ package types -import ( - "encoding/json" +import "encoding/json" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -type Asset struct { - UUID string `json:"uuid"` - Hash []byte `json:"hash"` - Creator sdk.AccAddress `json:"creator"` - Status bool `json:"status"` - Rate int64 `json:""` -} - -func NewAsset() Asset { - return Asset{} -} - -func NewAssetFromMsgCreate(msg MsgCreate) Asset { - asset := NewAsset() +func NewAssetFromMsgCreate(msg MsgCreateAsset) Asset { + asset := Asset{} asset.Creator = msg.Creator asset.Rate = msg.Rate asset.Hash = msg.Hash @@ -28,8 +12,8 @@ func NewAssetFromMsgCreate(msg MsgCreate) Asset { return asset } -func NewAssetFromMsgUpdate(msg MsgUpdate) Asset { - asset := NewAsset() +func NewAssetFromMsgUpdate(msg MsgUpdateAsset) Asset { + asset := Asset{} asset.Creator = msg.Creator asset.Rate = msg.Rate asset.Hash = msg.Hash diff --git a/x/booking/GenID_test.go b/x/booking/GenID_test.go deleted file mode 100644 index 8b956e79..00000000 --- a/x/booking/GenID_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package booking - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func TestSum(t *testing.T) { - booker, err := sdk.AccAddressFromHex("23AE01BEE3B45C85AD85BF88AEADFC04B7C633CD") - if err != nil { - t.Fatal(err) - } - duration := int64(10) - uuid := "1111" - // msg := types.NewMsgBook(booker, uuid, duration) - msg := MsgBook{} - msg.Duration = duration - msg.Booker = booker - msg.UUID = uuid - - bookId, err := GenBookID(msg) - - if err != nil { - t.Fatal(err) - } - t.Log(bookId) - t.Fail() - // fmt.Println(bookId) -} diff --git a/x/booking/alias.go b/x/booking/alias.go deleted file mode 100644 index 368d923d..00000000 --- a/x/booking/alias.go +++ /dev/null @@ -1,34 +0,0 @@ -package booking - -import ( - "github.com/sharering/shareledger/x/booking/keeper" - "github.com/sharering/shareledger/x/booking/types" -) - -const ( - ModuleName = types.ModuleName - RouterKey = types.RouterKey - StoreKey = types.StoreKey - QuerierRoute = types.QuerierRoute - TypeBookMsg = types.TypeBookMsg - TypeBookCompleteMsg = types.TypeBookCompleteMsg -) - -var ( - NewKeeper = keeper.NewKeeper - NewQuerier = keeper.NewQuerier - NewBookMsg = types.NewMsgBook - NewBookCompleteMsg = types.NewMsgComplete - NewBooking = types.NewBooking - ModuleCdc = types.ModuleCdc - RegisterCodec = types.RegisterCodec -) - -type ( - Keeper = keeper.Keeper - MsgBook = types.MsgBook - MsgBookComplete = types.MsgComplete - QueryResResolve = types.QueryResResolve - QueryResNames = types.QueryResNames - Booking = types.Booking -) diff --git a/x/booking/client/cli/query.go b/x/booking/client/cli/query.go index 83749f00..8f941a31 100644 --- a/x/booking/client/cli/query.go +++ b/x/booking/client/cli/query.go @@ -2,48 +2,31 @@ package cli import ( "fmt" + // "strings" + + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" + // "github.com/cosmos/cosmos-sdk/client/flags" + // sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/booking/types" - "github.com/spf13/cobra" ) -func QueryCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - bookingQueryCmd := &cobra.Command{ +// GetQueryCmd returns the cli query commands for this module +func GetQueryCmd(queryRoute string) *cobra.Command { + // Group booking queries under a subcommand + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "Querying commands for the booking module", + Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - bookingQueryCmd.AddCommand(flags.GetCommands( - CmdGetBooking(storeKey, cdc), - )...) - return bookingQueryCmd -} + cmd.AddCommand(CmdBooking()) -func CmdGetBooking(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "get [bookID]", - Short: "get booking info from bookID", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - bookID := args[0] - - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/booking/%s", queryRoute, bookID), nil) - if err != nil { - fmt.Printf("could not get asset - %s \n", bookID) - return nil - } - - var out types.Booking - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } + // this line is used by starport scaffolding # 1 + + return cmd } diff --git a/x/booking/client/cli/query_booking.go b/x/booking/client/cli/query_booking.go new file mode 100644 index 00000000..0dc32ecc --- /dev/null +++ b/x/booking/client/cli/query_booking.go @@ -0,0 +1,47 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/booking/types" +) + +var _ = strconv.Itoa(0) + +func CmdBooking() *cobra.Command { + cmd := &cobra.Command{ + Use: "get [bookID]", + Short: "Query booking", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqBookID := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryBookingRequest{ + + BookID: reqBookID, + } + + res, err := queryClient.Booking(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/booking/client/cli/tx.go b/x/booking/client/cli/tx.go index 7bc39c3f..641cb2bf 100644 --- a/x/booking/client/cli/tx.go +++ b/x/booking/client/cli/tx.go @@ -1,117 +1,37 @@ package cli import ( - "bufio" - "strconv" + "fmt" + "time" "github.com/spf13/cobra" - "github.com/spf13/viper" - shareringUtils "github.com/ShareRing/modules/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" + // "github.com/cosmos/cosmos-sdk/client/flags" "github.com/sharering/shareledger/x/booking/types" ) var ( - bookFee = shareringUtils.HIGHFEE - completeFee = shareringUtils.MEDIUMFEE + DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) ) -func GetTxCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - bookCmd := &cobra.Command{ +const ( + flagPacketTimeoutTimestamp = "packet-timeout-timestamp" +) + +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "booking transaction subcommands", + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - bookCmd.AddCommand(flags.PostCommands( - GetCmdBook(cdc), - GetCmdComplete(cdc), - )...) - - return bookCmd -} - -func GetCmdBook(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "book [uuid] [duration]", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txFee, err := shareringUtils.GetFeeFromShrp(cdc, cliCtx, bookFee) - if err != nil { - return err - } - txBldr = txBldr.WithFees(txFee) - uuid := args[0] - duration, err := strconv.Atoi(args[1]) - if err != nil { - return err - } - msg := types.NewMsgBook(cliCtx.GetFromAddress(), uuid, int64(duration)) - err = msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdComplete(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "complete [bookID]", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } + cmd.AddCommand(CmdBook()) + cmd.AddCommand(CmdComplete()) + // this line is used by starport scaffolding # 1 - txFee, err := shareringUtils.GetFeeFromShrp(cdc, cliCtx, completeFee) - if err != nil { - return err - } - txBldr = txBldr.WithFees(txFee) - bookID := args[0] - msg := types.NewMsgComplete(cliCtx.GetFromAddress(), bookID) - err = msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") return cmd } diff --git a/x/booking/client/cli/tx_book.go b/x/booking/client/cli/tx_book.go new file mode 100644 index 00000000..279af66a --- /dev/null +++ b/x/booking/client/cli/tx_book.go @@ -0,0 +1,48 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/booking/types" +) + +var _ = strconv.Itoa(0) + +func CmdBook() *cobra.Command { + cmd := &cobra.Command{ + Use: "book [uuid] [duration]", + Short: "Broadcast message CreateBooking", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argUUID := args[0] + argDuration, err := strconv.Atoi(args[1]) + if err != nil { + return err + } + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgBook( + clientCtx.GetFromAddress().String(), + argUUID, + int64(argDuration), + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/booking/client/cli/tx_complete.go b/x/booking/client/cli/tx_complete.go new file mode 100644 index 00000000..402e2499 --- /dev/null +++ b/x/booking/client/cli/tx_complete.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/booking/types" +) + +var _ = strconv.Itoa(0) + +func CmdComplete() *cobra.Command { + cmd := &cobra.Command{ + Use: "complete [bookID]", + Short: "Broadcast message CompleteBooking", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argBookID := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgComplete( + clientCtx.GetFromAddress().String(), + argBookID, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/booking/client/rest/rest.go b/x/booking/client/rest/rest.go deleted file mode 100644 index 1d686fd8..00000000 --- a/x/booking/client/rest/rest.go +++ /dev/null @@ -1,15 +0,0 @@ -package rest - -import ( - "github.com/cosmos/cosmos-sdk/client/context" - - "github.com/gorilla/mux" -) - -const ( - restName = "name" -) - -// RegisterRoutes - Central function to define routes that get registered by the main application -func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, storeName string) { -} diff --git a/x/booking/client/tests/cli_test.go b/x/booking/client/tests/cli_test.go new file mode 100644 index 00000000..cd230150 --- /dev/null +++ b/x/booking/client/tests/cli_test.go @@ -0,0 +1,24 @@ +package tests + +import ( + "github.com/sharering/shareledger/cmd/Shareledgerd/cli" + "sync" + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/sharering/shareledger/testutil/network" +) + +var runOnce = sync.Once{} + +func init() { + runOnce.Do(func() { + cli.InitMiddleWare() + }) +} +func TestIntegrationBookingTestSuite(t *testing.T) { + cfg := network.ShareLedgerTestingConfig() + cfg.NumValidators = 2 + suite.Run(t, NewBookingIntegrationTestSuite(cfg)) +} diff --git a/x/booking/client/tests/suite.go b/x/booking/client/tests/suite.go new file mode 100644 index 00000000..fa8bfaad --- /dev/null +++ b/x/booking/client/tests/suite.go @@ -0,0 +1,338 @@ +package tests + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + netutilts "github.com/sharering/shareledger/testutil/network" + "github.com/sharering/shareledger/x/asset/types" + bookingtypes "github.com/sharering/shareledger/x/booking/types" + denom "github.com/sharering/shareledger/x/utils/demo" + "os" + + testutil2 "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" + "github.com/stretchr/testify/suite" + + "github.com/sharering/shareledger/x/asset/client/tests" +) + +type BookingIntegrationTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network + dir string + + bookingIDOfAccount3 string + bookingID2 string + + //a map with key is booking name and the value is booking ID + eBooking map[string]string +} + +func NewBookingIntegrationTestSuite(cf network.Config) *BookingIntegrationTestSuite { + return &BookingIntegrationTestSuite{ + cfg: cf, + } +} + +func (s *BookingIntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite for booking module") + + kb, dir := netutilts.GetTestingGenesis(s.T(), &s.cfg) + s.dir = dir + + s.network = network.New(s.T(), s.cfg) + _, err := s.network.WaitForHeight(1) + s.Require().NoError(err) + + //override the keyring by our keyring information + s.network.Validators[0].ClientCtx.Keyring = kb + + s.T().Log("setting up asset data..") + s.setupTestMaterial() + s.T().Log("setting up integration test suite successfully") + s.Require().NoError(s.network.WaitForNextBlock()) + +} +func (s *BookingIntegrationTestSuite) TearDownSuite() { + s.NoError(os.RemoveAll(s.dir), "fail to cleanup") + s.network.Cleanup() + s.T().Log("tearing down integration test suite") +} + +func (s *BookingIntegrationTestSuite) TestCreateBooking() { + validatorCtx := s.network.Validators[0].ClientCtx + type TestCase struct { + description string + iAssetID string + iDuration string + iTxnFee int + iTxnCreator string + oErr error + oAsset *types.Asset + oRes *sdk.TxResponse + oBooking *bookingtypes.Booking + oAccBalance sdk.Coins + } + //each test case should be use difference account to avoid conflict the balance + testSuite := []TestCase{ + { + //This test case wil run with account 1 has 100shrp + description: "create the booking with total free asset", + iAssetID: "free_asset", + iDuration: "2", + iTxnFee: 10, + iTxnCreator: netutilts.KeyAccount1, + oErr: nil, + oAsset: &types.Asset{ + UUID: "free_asset", + Status: false, + }, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oBooking: &bookingtypes.Booking{ + Booker: netutilts.Accounts[netutilts.KeyAccount1].String(), + UUID: "free_asset", + Duration: 2, + IsCompleted: false, + }, + oAccBalance: sdk.NewCoins(sdk.NewCoin(denom.BaseUSD, sdk.NewInt(94*denom.USDExponent))), + }, + { + //This test case wil run with account 1 has 100shrp + description: "create the booking with not free asset", + iAssetID: "not_free_asset", + iDuration: "2", + iTxnFee: 10, + iTxnCreator: netutilts.KeyAccount2, + oErr: nil, + oAsset: &types.Asset{ + UUID: "not_free_asset", + Status: false, + }, + oRes: &sdk.TxResponse{Code: bookingtypes.ErrAssetAlreadyBooked.ABCICode()}, + oBooking: nil, + oAccBalance: sdk.Coins{}, + }, + } + + for _, tc := range testSuite { + s.Run(tc.description, func() { + stdOut, err := ExCmdCreateBooking(validatorCtx, tc.iAssetID, tc.iDuration, + netutilts.SHRFee(tc.iTxnFee), + netutilts.JSONFlag, + netutilts.MakeByAccount(tc.iTxnCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.description) + } + + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + + if tc.oRes != nil { + s.Equal(tc.oRes.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.description, txnResponse.String())) + } + if tc.oBooking != nil { + logs := netutilts.ParseRawLogGetEvent(s.T(), txnResponse.RawLog) + l := logs[0] + attr := l.Events.GetEventByType(s.T(), "BookingStart") + bookingID := attr.Get(s.T(), "BookingId") + + stdOut, err = ExCmdCGetBooking(validatorCtx, bookingID.Value) + s.NoErrorf(err, "fail to get the booking err %+v", err) + booking := BookingJsonUnmarshal(s.T(), stdOut.Bytes()) + s.Equal(tc.oBooking.Booker, booking.Booker, "booker address isn't equal") + s.Equal(tc.oBooking.Duration, booking.Duration) + s.Equal(tc.oBooking.IsCompleted, booking.IsCompleted) + } + + if tc.oAsset != nil { + stdOut, err = tests.ExCmdGetAsset(validatorCtx, tc.iAssetID) + s.NoError(err, "fail to get the asset data") + asset := tests.AssetJsonUnmarshal(s.T(), stdOut.Bytes()) + s.Equal(tc.oAsset.Status, asset.Status) + + } + if !tc.oAccBalance.IsZero() { + //validate the owner of booking + accByte, err := testutil2.QueryBalancesExec(validatorCtx, netutilts.Accounts[tc.iTxnCreator]) + s.NoError(err) + accBalance := netutilts.BalanceJsonUnmarshal(s.T(), accByte.Bytes()) + //default shrp 100 + s.Equal(tc.oAccBalance.AmountOf(denom.BaseUSD), accBalance.Balances.AmountOf(denom.BaseUSD), accBalance.Balances) + } + + }) + } + +} + +func (s *BookingIntegrationTestSuite) TestCompleteBooking() { + + validatorCtx := s.network.Validators[0].ClientCtx + + type TestCase struct { + description string + iAssetID string + iBookingID string + iTxnFee int + iTxnCreator string + oErr error + oAsset *types.Asset + oRes *sdk.TxResponse + oBooking *bookingtypes.Booking + } + + testSuite := []TestCase{ + { + description: "complete the booking success", + iBookingID: s.eBooking["pre_booking_1"], + iTxnFee: 6, + iAssetID: "asset_pre_booking_1", + iTxnCreator: netutilts.KeyAccount3, + oErr: nil, + oAsset: &types.Asset{ + UUID: "asset_pre_booking_1", + Status: true, + }, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oBooking: &bookingtypes.Booking{IsCompleted: true}, + }, + { + description: "complete the booking without permission", + iBookingID: s.eBooking["pre_booking_2"], + iTxnFee: 6, + iAssetID: "asset_pre_booking_2", + iTxnCreator: netutilts.KeyAccount4, + oErr: nil, + oAsset: &types.Asset{ + UUID: "asset_pre_booking_2", + Status: false, + }, + oRes: &sdk.TxResponse{Code: bookingtypes.ErrNotBookerOfAsset.ABCICode()}, + oBooking: &bookingtypes.Booking{IsCompleted: false}, + }, + } + + for _, tc := range testSuite { + stdOut, err := ExCmdCCompleteBooking(validatorCtx, tc.iBookingID, + netutilts.SHRFee(tc.iTxnFee), + netutilts.JSONFlag, + netutilts.MakeByAccount(tc.iTxnCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.description) + } + + if tc.oRes != nil { + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "the txn create booking response %s ", stdOut.String()) + } + if tc.oBooking != nil { + stdOut, err = ExCmdCGetBooking(validatorCtx, tc.iBookingID) + s.NoErrorf(err, "fail to get the booking err %+v", err) + booking := BookingJsonUnmarshal(s.T(), stdOut.Bytes()) + s.Equal(tc.oBooking.IsCompleted, booking.IsCompleted) + } + if tc.oAsset != nil { + stdOut, err = tests.ExCmdGetAsset(validatorCtx, tc.iAssetID) + s.NoError(err, "fail to get the asset data") + asset := tests.AssetJsonUnmarshal(s.T(), stdOut.Bytes()) + s.Equal(tc.oAsset.Status, asset.Status) + } + } +} + +func (s *BookingIntegrationTestSuite) setupTestMaterial() { + + s.eBooking = make(map[string]string) + type ( + ExistedAsset struct { + AssetID string + AssetHash string + AssetStatus string + SHRPFee string + MakeBy string + } + ExistedBooking struct { + BookingName string + AssetID string + Duration string + MakeBy string + } + ) + + listAsset := []ExistedAsset{ + { + AssetID: "free_asset", + AssetHash: "cc6f58bd1ada876f0a4941ad579908eda726d6da", + SHRPFee: "3", + AssetStatus: "true", + MakeBy: netutilts.KeyTreasurer, + }, + { + AssetID: "not_free_asset", + AssetHash: "e787c3c3-54e3-4ef0-9be9-d10b2d0616ae", + SHRPFee: "3", + AssetStatus: "false", + MakeBy: netutilts.KeyTreasurer, + }, + { + AssetID: "asset_pre_booking_1", + AssetHash: "07c31f4e-76ef-46d6-9900-74b6e5c864e4", + SHRPFee: "3", + AssetStatus: "true", + MakeBy: netutilts.KeyTreasurer, + }, + { + AssetID: "asset_pre_booking_2", + AssetHash: "44e116e9-df07-4bac-9bfa-a470a8dd4cdc", + SHRPFee: "3", + AssetStatus: "true", + MakeBy: netutilts.KeyTreasurer, + }, + } + + listBooking := []ExistedBooking{ + { + BookingName: "pre_booking_1", + AssetID: "asset_pre_booking_1", + Duration: "2", + MakeBy: netutilts.KeyAccount3, + }, + + { + BookingName: "pre_booking_2", + AssetID: "asset_pre_booking_2", + Duration: "2", + MakeBy: netutilts.KeyAccount3, + }, + } + + for _, la := range listAsset { + _, err := tests.ExCmdCreateAsset(s.network.Validators[0].ClientCtx, la.AssetID, la.AssetHash, la.AssetStatus, la.SHRPFee, + netutilts.SHRFee10, + netutilts.JSONFlag, + netutilts.MakeByAccount(la.MakeBy), + ) + s.NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) + } + for _, lb := range listBooking { + stdOut, err := ExCmdCreateBooking(s.network.Validators[0].ClientCtx, lb.AssetID, lb.Duration, + netutilts.SHRFee(10), + netutilts.JSONFlag, + netutilts.MakeByAccount(lb.MakeBy)) + + s.NoError(err) + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + //s.T().Log(stdOut.String()) + logs := netutilts.ParseRawLogGetEvent(s.T(), txnResponse.RawLog) + l := logs[0] + attr := l.Events.GetEventByType(s.T(), "BookingStart") + bookingID := attr.Get(s.T(), "BookingId") + + s.eBooking[lb.BookingName] = bookingID.Value + s.Require().NoError(s.network.WaitForNextBlock()) + + } + +} diff --git a/x/booking/client/tests/test_helpers.go b/x/booking/client/tests/test_helpers.go new file mode 100644 index 00000000..33333fd5 --- /dev/null +++ b/x/booking/client/tests/test_helpers.go @@ -0,0 +1,46 @@ +package tests + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/stretchr/testify/require" + "github.com/tendermint/spm/cosmoscmd" + + "github.com/sharering/shareledger/app" + "github.com/sharering/shareledger/testutil/network" + "github.com/sharering/shareledger/x/booking/client/cli" + "github.com/sharering/shareledger/x/booking/types" +) + +func ExCmdCreateBooking(clientCtx client.Context, assetUUID, duration string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{assetUUID, duration} + args = append(args, network.SkipConfirmation, network.BlockBroadcast) + args = append(args, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdBook(), args) +} + +func ExCmdCGetBooking(clientCtx client.Context, bookingID string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{bookingID} + args = append(args, network.GetFlagsQuery()...) + args = append(args, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdBooking(), args) +} + +func ExCmdCCompleteBooking(clientCtx client.Context, bookingID string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{bookingID} + args = append(args, network.SkipConfirmation, network.BlockBroadcast) + args = append(args, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdComplete(), args) +} + +func BookingJsonUnmarshal(t *testing.T, data []byte) types.Booking { + var a types.QueryBookingResponse + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(data, &a) + require.NoError(t, err) + return *a.Booking + +} diff --git a/x/booking/genesis.go b/x/booking/genesis.go index c06e788b..a96252f0 100644 --- a/x/booking/genesis.go +++ b/x/booking/genesis.go @@ -2,39 +2,30 @@ package booking import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/booking/keeper" "github.com/sharering/shareledger/x/booking/types" ) -type GenesisState struct { - Bookings []types.Booking -} - -func NewGenesisState() GenesisState { - return GenesisState{} -} - -func ValidateGenesis(data GenesisState) error { - return nil -} - -func DefaultGenesisState() GenesisState { - return GenesisState{} -} - -func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { - for _, b := range data.Bookings { - keeper.SetBooking(ctx, b.BookID, b) +// InitGenesis initializes the capability module's state from a provided genesis +// state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + // this line is used by starport scaffolding # genesis/module/init + for _, b := range genState.Bookings { + k.SetBooking(ctx, b.GetBookID(), *b) } } -func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState { - var bookings []types.Booking +// ExportGenesis returns the capability module's exported genesis. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() + + // this line is used by starport scaffolding # genesis/module/export cb := func(b types.Booking) bool { - bookings = append(bookings, b) + genesis.Bookings = append(genesis.Bookings, &b) return false } + k.IterateBookings(ctx, cb) - return GenesisState{ - Bookings: bookings, - } + + return genesis } diff --git a/x/booking/genesis_test.go b/x/booking/genesis_test.go new file mode 100644 index 00000000..76097ad8 --- /dev/null +++ b/x/booking/genesis_test.go @@ -0,0 +1,23 @@ +package booking_test + +import ( + "testing" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/booking" + "github.com/sharering/shareledger/x/booking/types" + "github.com/stretchr/testify/require" +) + +func TestGenesis(t *testing.T) { + genesisState := types.GenesisState{ + // this line is used by starport scaffolding # genesis/test/state + } + + k, ctx := keepertest.BookingKeeper(t) + booking.InitGenesis(ctx, *k, genesisState) + got := booking.ExportGenesis(ctx, *k) + require.NotNil(t, got) + + // this line is used by starport scaffolding # genesis/test/assert +} diff --git a/x/booking/handler.go b/x/booking/handler.go index 1e0eb623..c91a8e62 100644 --- a/x/booking/handler.go +++ b/x/booking/handler.go @@ -5,118 +5,28 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/asset" + "github.com/sharering/shareledger/x/booking/keeper" "github.com/sharering/shareledger/x/booking/types" ) -func NewHandler(keeper Keeper) sdk.Handler { +// NewHandler ... +func NewHandler(k keeper.Keeper) sdk.Handler { + msgServer := keeper.NewMsgServerImpl(k) + return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + ctx = ctx.WithEventManager(sdk.NewEventManager()) + switch msg := msg.(type) { - case MsgBook: - return handleMsgBook(ctx, keeper, msg) - case MsgBookComplete: - return handleMsgComplete(ctx, keeper, msg) + case *types.MsgCreateBooking: + res, err := msgServer.CreateBooking(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgCompleteBooking: + res, err := msgServer.CompleteBooking(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + // this line is used by starport scaffolding # 1 default: - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, fmt.Sprintf("Unrecognized booking Msg type: %v", msg.Type())) + errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) + return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } } - -func handleMsgBook(ctx sdk.Context, keeper Keeper, msg MsgBook) (*sdk.Result, error) { - oldAsset := keeper.GetAsset(ctx, msg.UUID) - if err := checkAsset(oldAsset); err != nil { - return nil, err - } - newBooking := types.NewBookingFromMsgBook(msg) - bookID, err := GenBookID(msg) - if err != nil { - return nil, types.ErrUnableToGenerateBookID - } - newBooking.BookID = bookID - newBooking.IsCompleted = false - price := oldAsset.Rate * msg.Duration - priceCoin := sdk.NewCoin("shrp", sdk.NewInt(price)) - if err := keeper.SendCoinsFromAccountToModule(ctx, msg.Booker, ModuleName, sdk.NewCoins(priceCoin)); err != nil { - return nil, err - } - keeper.SetAssetStatus(ctx, msg.UUID, false) - keeper.SetBooking(ctx, bookID, newBooking) - log, err := newBooking.GetString() - if err != nil { - return nil, err - } - event := sdk.NewEvent( - EventTypeBookingStart, - sdk.NewAttribute(AttributeUUID, string(msg.UUID)), - sdk.NewAttribute(AttributeBookingID, string(bookID)), - ) - ctx.EventManager().EmitEvent((event)) - return &sdk.Result{ - Log: log, - Events: ctx.EventManager().Events(), - }, nil -} - -func handleMsgComplete(ctx sdk.Context, keeper Keeper, msg MsgBookComplete) (*sdk.Result, error) { - oldBooking := keeper.GetBooking(ctx, msg.BookID) - if err := checkBooking(oldBooking); err != nil { - return nil, err - } - if !oldBooking.Booker.Equals(msg.Booker) { - return nil, types.ErrNotBookerOfAsset - } - oldAsset := keeper.GetAsset(ctx, oldBooking.UUID) - if oldAsset.Creator.Empty() { - return nil, types.ErrAssetDoesNotExist - } - if oldAsset.Status { - return nil, types.ErrAssetNotBooked - } - if oldAsset.UUID != oldBooking.UUID { - return nil, types.ErrUUIDMismatch - } - price := oldAsset.Rate * oldBooking.Duration - priceCoin := sdk.NewCoin("shrp", sdk.NewInt(price)) - if err := keeper.SendCoinsFromModuleToAccount(ctx, ModuleName, oldAsset.Creator, sdk.NewCoins(priceCoin)); err != nil { - return nil, err - } - keeper.SetAssetStatus(ctx, oldAsset.UUID, true) - keeper.SetBookingCompleted(ctx, oldBooking.BookID) - newBooking := keeper.GetBooking(ctx, msg.BookID) - log, err := newBooking.GetString() - if err != nil { - return nil, err - } - event := sdk.NewEvent( - EventTypeBookingComplete, - sdk.NewAttribute(AttributeBookingID, string(msg.BookID)), - ) - ctx.EventManager().EmitEvent(event) - return &sdk.Result{ - Log: log, - Events: ctx.EventManager().Events(), - }, nil -} - -func checkAsset(a asset.Asset) error { - if a.Creator.Empty() { - return types.ErrAssetDoesNotExist - } - if a.Rate <= 0 { - return types.ErrIllegalAssetRate - } - if !a.Status { - return types.ErrAssetAlreadyBooked - } - return nil -} - -func checkBooking(b types.Booking) error { - if len(b.BookID) == 0 || b.Booker.Empty() || b.Duration <= 0 { - return types.ErrInvalidBooking - } - if b.IsCompleted { - return types.ErrBookingIsCompleted - } - return nil -} diff --git a/x/booking/keeper/asset_keeper.go b/x/booking/keeper/asset_keeper.go new file mode 100644 index 00000000..1b4b9b9e --- /dev/null +++ b/x/booking/keeper/asset_keeper.go @@ -0,0 +1,19 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + assetTypes "github.com/sharering/shareledger/x/asset/types" +) + +func (k Keeper) SetAssetStatus(ctx sdk.Context, uuid string, status bool) { + k.assetKeeper.SetAssetStatus(ctx, uuid, status) +} + +func (k Keeper) GetAsset(ctx sdk.Context, uuid string) (assetTypes.Asset, bool) { + asset, found := k.assetKeeper.GetAsset(ctx, uuid) + if !found { + return assetTypes.Asset{}, false + } + + return asset, true +} diff --git a/x/booking/keeper/bank_keeper.go b/x/booking/keeper/bank_keeper.go new file mode 100644 index 00000000..28dfc30c --- /dev/null +++ b/x/booking/keeper/bank_keeper.go @@ -0,0 +1,23 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func (k Keeper) SendCoinsFromModuleToAccount( + ctx sdk.Context, + senderModule string, + recipientAddr sdk.AccAddress, + amt sdk.Coins, +) error { + return k.bankKeeper.SendCoinsFromModuleToAccount(ctx, senderModule, recipientAddr, amt) +} + +func (k Keeper) SendCoinsFromAccountToModule( + ctx sdk.Context, + senderAddr sdk.AccAddress, + recipientModule string, + amt sdk.Coins, +) error { + return k.bankKeeper.SendCoinsFromAccountToModule(ctx, senderAddr, recipientModule, amt) +} diff --git a/x/booking/keeper/booking.go b/x/booking/keeper/booking.go new file mode 100644 index 00000000..f7577fb1 --- /dev/null +++ b/x/booking/keeper/booking.go @@ -0,0 +1,70 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/booking/types" +) + +func (k Keeper) GetBooking(ctx sdk.Context, bookID string) (types.Booking, bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.BookIDPrefix)) + + if !k.IsBookingExist(ctx, bookID) { + return types.Booking{}, false + } + + bz := store.Get([]byte(bookID)) + + var result types.Booking + + k.cdc.MustUnmarshalLengthPrefixed(bz, &result) + + return result, true +} + +func (k Keeper) SetBooking(ctx sdk.Context, bookID string, booking types.Booking) { + // TODO: should return error + if len(booking.GetBooker()) == 0 || len(booking.GetUUID()) == 0 || len(booking.GetBookID()) == 0 { + return + } + + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.BookIDPrefix)) + + store.Set([]byte(bookID), k.cdc.MustMarshalLengthPrefixed(&booking)) +} + +func (k Keeper) SetBookingCompleted(ctx sdk.Context, bookID string) { + b, found := k.GetBooking(ctx, bookID) + if !found { + return + } + + b.IsCompleted = true + k.SetBooking(ctx, bookID, b) +} + +func (k Keeper) DeleteBooking(ctx sdk.Context, bookID string) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.BookIDPrefix)) + store.Delete([]byte(bookID)) +} + +func (k Keeper) GetBookingsIterator(ctx sdk.Context) sdk.Iterator { + return sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), types.KeyPrefix(types.BookIDPrefix)) +} + +func (k Keeper) IterateBookings(ctx sdk.Context, cb func(b types.Booking) bool) { + iterator := k.GetBookingsIterator(ctx) + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + var booking types.Booking + k.cdc.MustUnmarshalLengthPrefixed(iterator.Value(), &booking) + if cb(booking) { + break + } + } +} + +func (k Keeper) IsBookingExist(ctx sdk.Context, bookID string) bool { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.BookIDPrefix)) + return store.Has([]byte(bookID)) +} diff --git a/x/booking/keeper/grpc_query.go b/x/booking/keeper/grpc_query.go new file mode 100644 index 00000000..82c4c5aa --- /dev/null +++ b/x/booking/keeper/grpc_query.go @@ -0,0 +1,7 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/booking/types" +) + +var _ types.QueryServer = Keeper{} diff --git a/x/booking/keeper/grpc_query_booking.go b/x/booking/keeper/grpc_query_booking.go new file mode 100644 index 00000000..643a70b6 --- /dev/null +++ b/x/booking/keeper/grpc_query_booking.go @@ -0,0 +1,26 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/booking/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) Booking(goCtx context.Context, req *types.QueryBookingRequest) (*types.QueryBookingResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Process the query + booking, found := k.GetBooking(ctx, req.BookID) + if !found { + return nil, status.Error(codes.NotFound, "Booking not found") + } + + return &types.QueryBookingResponse{Booking: &booking}, nil +} diff --git a/x/booking/keeper/keeper.go b/x/booking/keeper/keeper.go index 7fed67e9..b0454cd6 100644 --- a/x/booking/keeper/keeper.go +++ b/x/booking/keeper/keeper.go @@ -1,104 +1,43 @@ package keeper import ( + "fmt" + + "github.com/tendermint/tendermint/libs/log" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/supply" - "github.com/sharering/shareledger/x/asset" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + assetkeeper "github.com/sharering/shareledger/x/asset/keeper" "github.com/sharering/shareledger/x/booking/types" ) -type Keeper struct { - storeKey sdk.StoreKey - cdc *codec.Codec - assetKeeper asset.Keeper - supplyKeeper supply.Keeper -} - -func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey, ask asset.Keeper, supplyKeeper supply.Keeper) Keeper { - return Keeper{ - cdc: cdc, - storeKey: storeKey, - assetKeeper: ask, - supplyKeeper: supplyKeeper, +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey sdk.StoreKey + memKey sdk.StoreKey + assetKeeper assetkeeper.Keeper + bankKeeper bankkeeper.Keeper } -} - -func (k Keeper) GetBooking(ctx sdk.Context, bookID string) types.Booking { - store := ctx.KVStore(k.storeKey) - - if !k.IsBookingPresent(ctx, bookID) { - return types.NewBooking() - } - - bz := store.Get([]byte(bookID)) - - var result types.Booking - - k.cdc.MustUnmarshalBinaryBare(bz, &result) - - return result -} - -func (k Keeper) SetBooking(ctx sdk.Context, bookID string, b types.Booking) { - if b.Booker.Empty() || len(b.UUID) == 0 || len(b.BookID) == 0 { - return - } - - store := ctx.KVStore(k.storeKey) - - store.Set([]byte(bookID), k.cdc.MustMarshalBinaryBare(b)) -} - -func (k Keeper) SetBookingCompleted(ctx sdk.Context, bookID string) { - b := k.GetBooking(ctx, bookID) - b.IsCompleted = true - k.SetBooking(ctx, bookID, b) -} - -func (k Keeper) DeleteBooking(ctx sdk.Context, bookID string) { - store := ctx.KVStore(k.storeKey) - store.Delete([]byte(bookID)) -} - -func (k Keeper) GetBookingsIterator(ctx sdk.Context) sdk.Iterator { - store := ctx.KVStore(k.storeKey) - return sdk.KVStorePrefixIterator(store, nil) -} +) -func (k Keeper) IterateBookings(ctx sdk.Context, cb func(b types.Booking) bool) { - iterator := k.GetBookingsIterator(ctx) - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - var booking types.Booking - k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &booking) - if cb(booking) { - break - } +func NewKeeper( + cdc codec.BinaryCodec, + storeKey, + memKey sdk.StoreKey, + ask assetkeeper.Keeper, + bankKeeper bankkeeper.Keeper, +) *Keeper { + return &Keeper{ + cdc: cdc, + storeKey: storeKey, + memKey: memKey, + assetKeeper: ask, + bankKeeper: bankKeeper, } } -func (k Keeper) IsBookingPresent(ctx sdk.Context, bookID string) bool { - store := ctx.KVStore(k.storeKey) - return store.Has([]byte(bookID)) -} - -func (k Keeper) SetAssetStatus(ctx sdk.Context, uuid string, status bool) { - k.assetKeeper.SetAssetStatus(ctx, uuid, status) -} - -func (k Keeper) GetAsset(ctx sdk.Context, uuid string) asset.Asset { - return k.assetKeeper.GetAsset(ctx, uuid) -} - -func (k Keeper) SendCoinsFromModuleToAccount( - ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins, -) error { - return k.supplyKeeper.SendCoinsFromModuleToAccount(ctx, senderModule, recipientAddr, amt) -} - -func (k Keeper) SendCoinsFromAccountToModule( - ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins, -) error { - return k.supplyKeeper.SendCoinsFromAccountToModule(ctx, senderAddr, recipientModule, amt) +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } diff --git a/x/booking/keeper/msg_server.go b/x/booking/keeper/msg_server.go new file mode 100644 index 00000000..34c01153 --- /dev/null +++ b/x/booking/keeper/msg_server.go @@ -0,0 +1,17 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/booking/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} diff --git a/x/booking/keeper/msg_server_book.go b/x/booking/keeper/msg_server_book.go new file mode 100644 index 00000000..b81297e4 --- /dev/null +++ b/x/booking/keeper/msg_server_book.go @@ -0,0 +1,83 @@ +package keeper + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + denom "github.com/sharering/shareledger/x/utils/demo" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + assetTypes "github.com/sharering/shareledger/x/asset/types" + "github.com/sharering/shareledger/x/booking/types" +) + +func (k msgServer) CreateBooking(goCtx context.Context, msg *types.MsgCreateBooking) (*types.MsgCreateBookingResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + oldAsset, found := k.GetAsset(ctx, msg.GetUUID()) + if !found { + return nil, sdkerrors.Wrap(types.ErrAssetDoesNotExist, msg.GetUUID()) + } + if err := checkAsset(oldAsset); err != nil { + return nil, sdkerrors.Wrap(err, msg.GetUUID()) + } + + newBooking := types.NewBookingFromMsgBook(*msg) + bookID, err := GenBookID(msg) + if err != nil { + return nil, sdkerrors.Wrap(types.ErrUnableToGenerateBookID, bookID) + } + + newBooking.BookID = bookID + newBooking.IsCompleted = false + price := oldAsset.GetRate() * msg.GetDuration() + priceCoin, err := denom.NormalizeToBaseCoins(sdk.NewDecCoinsFromCoins(sdk.NewCoin(denom.ShrP, sdk.NewInt(price))), false) + if err != nil { + return nil, err + } + booker, _ := sdk.AccAddressFromBech32(msg.GetBooker()) + + if err := k.SendCoinsFromAccountToModule(ctx, booker, types.ModuleName, priceCoin); err != nil { + return nil, sdkerrors.Wrapf(err, "cant send coin from %s to %s", msg.GetBooker(), types.ModuleName) + } + + k.SetAssetStatus(ctx, msg.GetUUID(), false) + k.SetBooking(ctx, bookID, newBooking) + + event := sdk.NewEvent( + types.EventTypeBookingStart, + sdk.NewAttribute(types.AttributeUUID, string(msg.GetUUID())), + sdk.NewAttribute(types.AttributeBookingID, string(bookID)), + ) + ctx.EventManager().EmitEvent((event)) + + return &types.MsgCreateBookingResponse{}, nil +} + +func checkAsset(a assetTypes.Asset) error { + if a.GetRate() <= 0 { + return types.ErrIllegalAssetRate + } + if !a.GetStatus() { + return types.ErrAssetAlreadyBooked + } + return nil +} + +// TODO: deterministic problem ? +func GenBookID(inp interface{}) (string, error) { + h := sha256.New() + + enc, err := json.Marshal(inp) + if err != nil { + return "", err + } + + h.Write(enc) + hash := h.Sum(nil) + + return hex.EncodeToString(hash)[:20], nil +} diff --git a/x/booking/keeper/msg_server_complete.go b/x/booking/keeper/msg_server_complete.go new file mode 100644 index 00000000..59cb58c3 --- /dev/null +++ b/x/booking/keeper/msg_server_complete.go @@ -0,0 +1,71 @@ +package keeper + +import ( + "context" + denom "github.com/sharering/shareledger/x/utils/demo" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/booking/types" +) + +func (k msgServer) CompleteBooking(goCtx context.Context, msg *types.MsgCompleteBooking) (*types.MsgCompleteBookingResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + oldBooking, found := k.GetBooking(ctx, msg.GetBookID()) + if !found { + return nil, sdkerrors.Wrap(types.ErrBookingDoesNotExist, msg.GetBookID()) + } + if err := checkBooking(oldBooking); err != nil { + return nil, sdkerrors.Wrap(err, msg.GetBookID()) + } + + if oldBooking.GetBooker() != msg.GetBooker() { + return nil, sdkerrors.Wrap(types.ErrNotBookerOfAsset, msg.GetBooker()) + } + + oldAsset, found := k.GetAsset(ctx, oldBooking.GetUUID()) + if !found { + return nil, sdkerrors.Wrap(types.ErrAssetDoesNotExist, oldBooking.GetUUID()) + } + + if oldAsset.GetStatus() { + return nil, sdkerrors.Wrap(types.ErrAssetNotBooked, oldAsset.GetUUID()) + } + + price := oldAsset.GetRate() * oldBooking.GetDuration() + priceCoin, err := denom.NormalizeToBaseCoins(sdk.NewDecCoinsFromCoins(sdk.NewCoin(denom.ShrP, sdk.NewInt(price))), false) + if err != nil { + return nil, err + } + creator, err := sdk.AccAddressFromBech32(oldAsset.GetCreator()) + if err != nil { + return nil, sdkerrors.Wrap(err, oldAsset.GetCreator()) + } + + if err := k.SendCoinsFromModuleToAccount(ctx, types.ModuleName, creator, priceCoin); err != nil { + return nil, sdkerrors.Wrapf(err, "cant send coins from %s to %s", types.ModuleName, oldAsset.GetCreator()) + } + + k.SetAssetStatus(ctx, oldAsset.GetUUID(), true) + k.SetBookingCompleted(ctx, oldBooking.GetBookID()) + + event := sdk.NewEvent( + types.EventTypeBookingComplete, + sdk.NewAttribute(types.AttributeBookingID, msg.BookID), + ) + ctx.EventManager().EmitEvent(event) + + return &types.MsgCompleteBookingResponse{}, nil +} + +func checkBooking(b types.Booking) error { + if len(b.GetBooker()) == 0 || b.GetDuration() <= 0 { + return types.ErrInvalidBooking + } + if b.IsCompleted { + return types.ErrBookingIsCompleted + } + return nil +} diff --git a/x/booking/keeper/msg_server_test.go b/x/booking/keeper/msg_server_test.go new file mode 100644 index 00000000..1fa869dc --- /dev/null +++ b/x/booking/keeper/msg_server_test.go @@ -0,0 +1,16 @@ +package keeper_test + +import ( + "context" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/booking/keeper" + "github.com/sharering/shareledger/x/booking/types" +) + +func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) { + k, ctx := keepertest.BookingKeeper(t) + return keeper.NewMsgServerImpl(*k), sdk.WrapSDKContext(ctx) +} diff --git a/x/booking/keeper/querier.go b/x/booking/keeper/querier.go deleted file mode 100644 index 39a0bc1b..00000000 --- a/x/booking/keeper/querier.go +++ /dev/null @@ -1,31 +0,0 @@ -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - abci "github.com/tendermint/tendermint/abci/types" -) - -const QueryBooking = "booking" - -func NewQuerier(keeper Keeper) sdk.Querier { - return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err error) { - switch path[0] { - case QueryBooking: - return queryBooking(ctx, path[1:], req, keeper) - default: - return nil, sdkerrors.ErrInvalidRequest - } - } -} - -func queryBooking(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - Booking := keeper.GetBooking(ctx, path[0]) - res, err := codec.MarshalJSONIndent(keeper.cdc, Booking) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} diff --git a/x/booking/module.go b/x/booking/module.go index cf1348e7..f7929497 100644 --- a/x/booking/module.go +++ b/x/booking/module.go @@ -1,116 +1,169 @@ package booking import ( + "context" "encoding/json" + "fmt" + + // this line is used by starport scaffolding # 1 "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/sharering/shareledger/x/booking/client/cli" - "github.com/sharering/shareledger/x/booking/client/rest" - - "github.com/cosmos/cosmos-sdk/client/context" - sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" + "github.com/sharering/shareledger/x/booking/keeper" + "github.com/sharering/shareledger/x/booking/types" ) -// type check to ensure the interface is properly implemented var ( _ module.AppModule = AppModule{} _ module.AppModuleBasic = AppModuleBasic{} ) -// app module Basics object -type AppModuleBasic struct{} +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- +// AppModuleBasic implements the AppModuleBasic interface for the capability module. +type AppModuleBasic struct { + cdc codec.BinaryCodec +} + +func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the capability module's name. func (AppModuleBasic) Name() string { - return ModuleName + return types.ModuleName +} + +func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) } -func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { - RegisterCodec(cdc) +// RegisterInterfaces registers the module's interface types +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) } -func (AppModuleBasic) DefaultGenesis() json.RawMessage { - return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) +// DefaultGenesis returns the capability module's default genesis state. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) } -// Validation check of the Genesis -func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { - var data GenesisState - err := ModuleCdc.UnmarshalJSON(bz, &data) - if err != nil { - return err +// ValidateGenesis performs genesis state validation for the capability module. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - // Once json successfully marshalled, passes along to genesis.go - return ValidateGenesis(data) + return genState.Validate() } -// Register rest routes -func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { - rest.RegisterRoutes(ctx, rtr, StoreKey) +// RegisterRESTRoutes registers the capability module's REST service handlers. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { } -// Get the root query command of this module -func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { - return cli.QueryCmd(StoreKey, cdc) +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + // this line is used by starport scaffolding # 2 + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) } -// Get the root tx command of this module -func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetTxCmd(StoreKey, cdc) +// GetTxCmd returns the capability module's root tx command. +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() } +// GetQueryCmd returns the capability module's root query command. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(types.StoreKey) +} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- + +// AppModule implements the AppModule interface for the capability module. type AppModule struct { AppModuleBasic - keeper Keeper + + keeper keeper.Keeper } -// NewAppModule creates a new AppModule Object -func NewAppModule(k Keeper) AppModule { +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, } } -func (AppModule) Name() string { - return ModuleName +// Name returns the capability module's name. +func (am AppModule) Name() string { + return am.AppModuleBasic.Name() } -func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} - -func (am AppModule) Route() string { - return RouterKey +// Route returns the capability module's message routing key. +func (am AppModule) Route() sdk.Route { + return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) } -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(am.keeper) -} -func (am AppModule) QuerierRoute() string { - return QuerierRoute +// QuerierRoute returns the capability module's query routing key. +func (AppModule) QuerierRoute() string { return types.QuerierRoute } + +// LegacyQuerierHandler returns the capability module's Querier. +func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { + return nil } -func (am AppModule) NewQuerierHandler() sdk.Querier { - return NewQuerier(am.keeper) +// RegisterServices registers a GRPC query service to respond to the +// module-specific GRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) } -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} +// RegisterInvariants registers the capability module's invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the capability module's genesis initialization It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, am.keeper, genState) -func (am AppModule) EndBlock(sdk.Context, abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } -func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState GenesisState - ModuleCdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} +// ExportGenesis returns the capability 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) + return cdc.MustMarshalJSON(genState) } -func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return ModuleCdc.MustMarshalJSON(gs) +// ConsensusVersion implements ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 2 } + +// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. +func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} + +// EndBlock executes all ABCI EndBlock logic respective to the capability module. It +// returns no validator updates. +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} } diff --git a/x/booking/types/booking.pb.go b/x/booking/types/booking.pb.go new file mode 100644 index 00000000..3dfe7070 --- /dev/null +++ b/x/booking/types/booking.pb.go @@ -0,0 +1,496 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: booking/booking.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Booking struct { + BookID string `protobuf:"bytes,1,opt,name=bookID,proto3" json:"bookID,omitempty"` + Booker string `protobuf:"bytes,2,opt,name=booker,proto3" json:"booker,omitempty"` + UUID string `protobuf:"bytes,3,opt,name=UUID,proto3" json:"UUID,omitempty"` + Duration int64 `protobuf:"varint,4,opt,name=duration,proto3" json:"duration,omitempty"` + IsCompleted bool `protobuf:"varint,5,opt,name=isCompleted,proto3" json:"isCompleted,omitempty"` +} + +func (m *Booking) Reset() { *m = Booking{} } +func (m *Booking) String() string { return proto.CompactTextString(m) } +func (*Booking) ProtoMessage() {} +func (*Booking) Descriptor() ([]byte, []int) { + return fileDescriptor_00ffdf80b5823d65, []int{0} +} +func (m *Booking) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Booking) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Booking.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Booking) XXX_Merge(src proto.Message) { + xxx_messageInfo_Booking.Merge(m, src) +} +func (m *Booking) XXX_Size() int { + return m.Size() +} +func (m *Booking) XXX_DiscardUnknown() { + xxx_messageInfo_Booking.DiscardUnknown(m) +} + +var xxx_messageInfo_Booking proto.InternalMessageInfo + +func (m *Booking) GetBookID() string { + if m != nil { + return m.BookID + } + return "" +} + +func (m *Booking) GetBooker() string { + if m != nil { + return m.Booker + } + return "" +} + +func (m *Booking) GetUUID() string { + if m != nil { + return m.UUID + } + return "" +} + +func (m *Booking) GetDuration() int64 { + if m != nil { + return m.Duration + } + return 0 +} + +func (m *Booking) GetIsCompleted() bool { + if m != nil { + return m.IsCompleted + } + return false +} + +func init() { + proto.RegisterType((*Booking)(nil), "shareledger.booking.Booking") +} + +func init() { proto.RegisterFile("booking/booking.proto", fileDescriptor_00ffdf80b5823d65) } + +var fileDescriptor_00ffdf80b5823d65 = []byte{ + // 214 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0xca, 0xcf, 0xcf, + 0xce, 0xcc, 0x4b, 0xd7, 0x87, 0xd2, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xc2, 0xc5, 0x19, + 0x89, 0x45, 0xa9, 0x39, 0xa9, 0x29, 0xe9, 0xa9, 0x45, 0x7a, 0x50, 0x29, 0xa5, 0x6e, 0x46, 0x2e, + 0x76, 0x27, 0x08, 0x5b, 0x48, 0x8c, 0x8b, 0x0d, 0x24, 0xec, 0xe9, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, + 0xc1, 0x19, 0x04, 0xe5, 0xc1, 0xc4, 0x53, 0x8b, 0x24, 0x98, 0x10, 0xe2, 0xa9, 0x45, 0x42, 0x42, + 0x5c, 0x2c, 0xa1, 0xa1, 0x9e, 0x2e, 0x12, 0xcc, 0x60, 0x51, 0x30, 0x5b, 0x48, 0x8a, 0x8b, 0x23, + 0xa5, 0xb4, 0x28, 0xb1, 0x24, 0x33, 0x3f, 0x4f, 0x82, 0x45, 0x81, 0x51, 0x83, 0x39, 0x08, 0xce, + 0x17, 0x52, 0xe0, 0xe2, 0xce, 0x2c, 0x76, 0xce, 0xcf, 0x2d, 0xc8, 0x49, 0x2d, 0x49, 0x4d, 0x91, + 0x60, 0x55, 0x60, 0xd4, 0xe0, 0x08, 0x42, 0x16, 0x72, 0xf2, 0x3a, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, + 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, + 0xc6, 0x63, 0x39, 0x86, 0x28, 0x83, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, + 0x7d, 0xb0, 0x3f, 0x8a, 0x40, 0x1e, 0x44, 0xf2, 0x91, 0x7e, 0x05, 0xcc, 0xbb, 0xfa, 0x25, 0x95, + 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0x5f, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x88, 0x14, + 0x5d, 0xb2, 0x0e, 0x01, 0x00, 0x00, +} + +func (m *Booking) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Booking) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Booking) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.IsCompleted { + i-- + if m.IsCompleted { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.Duration != 0 { + i = encodeVarintBooking(dAtA, i, uint64(m.Duration)) + i-- + dAtA[i] = 0x20 + } + if len(m.UUID) > 0 { + i -= len(m.UUID) + copy(dAtA[i:], m.UUID) + i = encodeVarintBooking(dAtA, i, uint64(len(m.UUID))) + i-- + dAtA[i] = 0x1a + } + if len(m.Booker) > 0 { + i -= len(m.Booker) + copy(dAtA[i:], m.Booker) + i = encodeVarintBooking(dAtA, i, uint64(len(m.Booker))) + i-- + dAtA[i] = 0x12 + } + if len(m.BookID) > 0 { + i -= len(m.BookID) + copy(dAtA[i:], m.BookID) + i = encodeVarintBooking(dAtA, i, uint64(len(m.BookID))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintBooking(dAtA []byte, offset int, v uint64) int { + offset -= sovBooking(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Booking) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BookID) + if l > 0 { + n += 1 + l + sovBooking(uint64(l)) + } + l = len(m.Booker) + if l > 0 { + n += 1 + l + sovBooking(uint64(l)) + } + l = len(m.UUID) + if l > 0 { + n += 1 + l + sovBooking(uint64(l)) + } + if m.Duration != 0 { + n += 1 + sovBooking(uint64(m.Duration)) + } + if m.IsCompleted { + n += 2 + } + return n +} + +func sovBooking(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozBooking(x uint64) (n int) { + return sovBooking(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Booking) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBooking + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: Booking: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Booking: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BookID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBooking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBooking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBooking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BookID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Booker", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBooking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBooking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBooking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Booker = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBooking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBooking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBooking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UUID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + m.Duration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBooking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Duration |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsCompleted", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBooking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsCompleted = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipBooking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthBooking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipBooking(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBooking + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBooking + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBooking + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthBooking + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupBooking + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthBooking + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthBooking = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowBooking = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupBooking = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/booking/types/codec.go b/x/booking/types/codec.go index 18b49cf5..93d91eff 100644 --- a/x/booking/types/codec.go +++ b/x/booking/types/codec.go @@ -2,17 +2,30 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" ) -// ModuleCdc is the codec for the module -var ModuleCdc = codec.New() - -func init() { - RegisterCodec(ModuleCdc) +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgCreateBooking{}, "booking/CreateBooking", nil) + cdc.RegisterConcrete(&MsgCompleteBooking{}, "booking/CompleteBooking", nil) + // this line is used by starport scaffolding # 2 } -// RegisterCodec registers concrete types on the Amino codec -func RegisterCodec(cdc *codec.Codec) { - cdc.RegisterConcrete(MsgBook{}, "book/Book", nil) - cdc.RegisterConcrete(MsgComplete{}, "book/Complete", nil) +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCreateBooking{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCompleteBooking{}, + ) + // this line is used by starport scaffolding # 3 + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } + +var ( + amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) +) diff --git a/x/booking/types/errors.go b/x/booking/types/errors.go index 83c02e44..b69915fe 100644 --- a/x/booking/types/errors.go +++ b/x/booking/types/errors.go @@ -1,17 +1,21 @@ package types +// DONTCOVER + import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) +// x/booking module sentinel errors var ( - ErrAssetDoesNotExist = sdkerrors.New(ModuleName, 1, "asset does not exist") - ErrIllegalAssetRate = sdkerrors.New(ModuleName, 2, "asset is negative") - ErrAssetAlreadyBooked = sdkerrors.New(ModuleName, 3, "asset is already booked") - ErrUnableToGenerateBookID = sdkerrors.New(ModuleName, 4, "unable to generate bookID") - ErrInvalidBooking = sdkerrors.New(ModuleName, 5, "booking field values are invalid") - ErrNotBookerOfAsset = sdkerrors.New(ModuleName, 6, "Signer didn't booking this booking") - ErrAssetNotBooked = sdkerrors.New(ModuleName, 7, "Asset is not booked") - ErrBookingIsCompleted = sdkerrors.New(ModuleName, 8, "Booking is completed") - ErrUUIDMismatch = sdkerrors.New(ModuleName, 9, "uuid of booking and asset not matched") + ErrAssetDoesNotExist = sdkerrors.Register(ModuleName, 41, "asset does not exist") + ErrIllegalAssetRate = sdkerrors.Register(ModuleName, 42, "asset is negative") + ErrAssetAlreadyBooked = sdkerrors.Register(ModuleName, 43, "asset is already booked") + ErrUnableToGenerateBookID = sdkerrors.Register(ModuleName, 44, "unable to generate bookID") + ErrInvalidBooking = sdkerrors.Register(ModuleName, 45, "booking field values are invalid") + ErrNotBookerOfAsset = sdkerrors.Register(ModuleName, 46, "Signer didn't booking this booking") + ErrAssetNotBooked = sdkerrors.Register(ModuleName, 47, "Asset is not booked") + ErrBookingIsCompleted = sdkerrors.Register(ModuleName, 48, "Booking is completed") + ErrUUIDMismatch = sdkerrors.Register(ModuleName, 49, "uuid of booking and asset not matched") + ErrBookingDoesNotExist = sdkerrors.Register(ModuleName, 50, "Booking does not exist") ) diff --git a/x/booking/events.go b/x/booking/types/events.go similarity index 92% rename from x/booking/events.go rename to x/booking/types/events.go index 2c35a00c..c2eaa4b3 100644 --- a/x/booking/events.go +++ b/x/booking/types/events.go @@ -1,4 +1,4 @@ -package booking +package types const ( EventTypeBookingStart = "BookingStart" diff --git a/x/booking/types/expected_keepers.go b/x/booking/types/expected_keepers.go new file mode 100644 index 00000000..ab1254f4 --- /dev/null +++ b/x/booking/types/expected_keepers.go @@ -0,0 +1 @@ +package types diff --git a/x/booking/types/genesis.go b/x/booking/types/genesis.go new file mode 100644 index 00000000..b8d4c61e --- /dev/null +++ b/x/booking/types/genesis.go @@ -0,0 +1,22 @@ +package types + +// this line is used by starport scaffolding # genesis/types/import + +// DefaultIndex is the default capability global index +const DefaultIndex uint64 = 1 + +// DefaultGenesis returns the default Capability genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{ + // this line is used by starport scaffolding # genesis/types/default + Bookings: make([]*Booking, 0), + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + // this line is used by starport scaffolding # genesis/types/validate + + return nil +} diff --git a/x/booking/types/genesis.pb.go b/x/booking/types/genesis.pb.go new file mode 100644 index 00000000..23d676e4 --- /dev/null +++ b/x/booking/types/genesis.pb.go @@ -0,0 +1,330 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: booking/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the booking module's genesis state. +type GenesisState struct { + // this line is used by starport scaffolding # genesis/proto/state + Bookings []*Booking `protobuf:"bytes,1,rep,name=bookings,proto3" json:"bookings,omitempty"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_e9cff64bfb7a8060, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetBookings() []*Booking { + if m != nil { + return m.Bookings + } + return nil +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "shareledger.booking.GenesisState") +} + +func init() { proto.RegisterFile("booking/genesis.proto", fileDescriptor_e9cff64bfb7a8060) } + +var fileDescriptor_e9cff64bfb7a8060 = []byte{ + // 189 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0xca, 0xcf, 0xcf, + 0xce, 0xcc, 0x4b, 0xd7, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x12, 0x2e, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x83, + 0x2a, 0x91, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xcb, 0xeb, 0x83, 0x58, 0x10, 0xa5, 0x52, 0x70, + 0x13, 0xa0, 0x34, 0x44, 0x58, 0xc9, 0x8f, 0x8b, 0xc7, 0x1d, 0x62, 0x64, 0x70, 0x49, 0x62, 0x49, + 0xaa, 0x90, 0x1d, 0x17, 0x07, 0x54, 0x41, 0xb1, 0x04, 0xa3, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x8c, + 0x1e, 0x16, 0x4b, 0xf4, 0x9c, 0x20, 0xb4, 0x13, 0xcb, 0x89, 0x7b, 0xf2, 0x8c, 0x41, 0x70, 0x3d, + 0x4e, 0x5e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, + 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0x65, 0x90, 0x9e, 0x59, + 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x36, 0xb1, 0x08, 0xe4, 0x1a, 0x24, 0xb3, + 0xf5, 0x2b, 0x60, 0x6e, 0xd3, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0x4e, 0x62, 0x03, 0x3b, 0xd1, 0x18, + 0x10, 0x00, 0x00, 0xff, 0xff, 0x81, 0x5e, 0x86, 0xb3, 0xfd, 0x00, 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Bookings) > 0 { + for iNdEx := len(m.Bookings) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Bookings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Bookings) > 0 { + for _, e := range m.Bookings { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bookings", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Bookings = append(m.Bookings, &Booking{}) + if err := m.Bookings[len(m.Bookings)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/booking/types/genesis_test.go b/x/booking/types/genesis_test.go new file mode 100644 index 00000000..d30a6ce8 --- /dev/null +++ b/x/booking/types/genesis_test.go @@ -0,0 +1,39 @@ +package types_test + +import ( + "testing" + + "github.com/sharering/shareledger/x/booking/types" + "github.com/stretchr/testify/require" +) + +func TestGenesisState_Validate(t *testing.T) { + for _, tc := range []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + { + desc: "valid genesis state", + genState: &types.GenesisState{ + // this line is used by starport scaffolding # types/genesis/validField + }, + valid: true, + }, + // this line is used by starport scaffolding # types/genesis/testcase + } { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/x/booking/types/key.go b/x/booking/types/key.go deleted file mode 100644 index 4818a9d2..00000000 --- a/x/booking/types/key.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -const ( - // ModuleName is the name of the module - ModuleName = "booking" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey is the module name router key - RouterKey = ModuleName - - // QuerierRoute to be used for querierer msgs - QuerierRoute = ModuleName -) diff --git a/x/booking/types/keys.go b/x/booking/types/keys.go new file mode 100644 index 00000000..a009daa3 --- /dev/null +++ b/x/booking/types/keys.go @@ -0,0 +1,27 @@ +package types + +const ( + // ModuleName defines the module name + ModuleName = "booking" + + // StoreKey defines the primary module store key + StoreKey = ModuleName + + // RouterKey is the message route for slashing + RouterKey = ModuleName + + // QuerierRoute defines the module's query routing key + QuerierRoute = ModuleName + + // MemStoreKey defines the in-memory store key + MemStoreKey = "mem_booking" + + BookIDPrefix = "BookID/" + + TypeBookMsg = "booking" + TypeBookCompleteMsg = "book_complete" +) + +func KeyPrefix(p string) []byte { + return []byte(p) +} diff --git a/x/booking/types/message_book.go b/x/booking/types/message_book.go new file mode 100644 index 00000000..5c192cf9 --- /dev/null +++ b/x/booking/types/message_book.go @@ -0,0 +1,53 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCreateBooking{} + +func NewMsgBook(booker string, UUID string, duration int64) *MsgCreateBooking { + return &MsgCreateBooking{ + Booker: booker, + UUID: UUID, + Duration: duration, + } +} + +func (msg *MsgCreateBooking) Route() string { + return RouterKey +} + +func (msg *MsgCreateBooking) Type() string { + return TypeBookMsg +} + +func (msg *MsgCreateBooking) GetSigners() []sdk.AccAddress { + booker, err := sdk.AccAddressFromBech32(msg.Booker) + if err != nil { + panic(err) + } + return []sdk.AccAddress{booker} +} + +func (msg *MsgCreateBooking) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCreateBooking) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Booker) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid booker address (%s)", err) + } + + if len(msg.UUID) == 0 { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "UUID must not be empty") + } + if msg.Duration <= 0 { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "duration must be positive") + } + + return nil +} diff --git a/x/booking/types/message_book_test.go b/x/booking/types/message_book_test.go new file mode 100644 index 00000000..34a43ec0 --- /dev/null +++ b/x/booking/types/message_book_test.go @@ -0,0 +1,43 @@ +package types + +import ( + "github.com/google/uuid" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgBook_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgCreateBooking + err error + }{ + { + name: "invalid address", + msg: MsgCreateBooking{ + Booker: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgCreateBooking{ + Booker: sample.AccAddress(), + UUID: uuid.New().String(), + Duration: 1, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/booking/types/message_complete.go b/x/booking/types/message_complete.go new file mode 100644 index 00000000..2a1996d8 --- /dev/null +++ b/x/booking/types/message_complete.go @@ -0,0 +1,49 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCompleteBooking{} + +func NewMsgComplete(booker string, bookID string) *MsgCompleteBooking { + return &MsgCompleteBooking{ + Booker: booker, + BookID: bookID, + } +} + +func (msg *MsgCompleteBooking) Route() string { + return RouterKey +} + +func (msg *MsgCompleteBooking) Type() string { + return TypeBookCompleteMsg +} + +func (msg *MsgCompleteBooking) GetSigners() []sdk.AccAddress { + booker, err := sdk.AccAddressFromBech32(msg.Booker) + if err != nil { + panic(err) + } + return []sdk.AccAddress{booker} +} + +func (msg *MsgCompleteBooking) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCompleteBooking) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Booker) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid booker address (%s)", err) + } + + if len(msg.GetBookID()) == 0 { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "BookID must not be empty") + } + + return nil +} diff --git a/x/booking/types/message_complete_test.go b/x/booking/types/message_complete_test.go new file mode 100644 index 00000000..143c7ff8 --- /dev/null +++ b/x/booking/types/message_complete_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgComplete_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgCompleteBooking + err error + }{ + { + name: "invalid address", + msg: MsgCompleteBooking{ + Booker: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgCompleteBooking{ + Booker: sample.AccAddress(), + BookID: "abc", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/booking/types/msgs.go b/x/booking/types/msgs.go deleted file mode 100644 index 8e82fab0..00000000 --- a/x/booking/types/msgs.go +++ /dev/null @@ -1,102 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeBookMsg = "booking" - TypeBookCompleteMsg = "book_complete" -) - -type MsgBook struct { - Booker sdk.AccAddress `json:"booker"` - UUID string `json:"uuid"` - Duration int64 `json:"duration"` -} - -func NewMsgBook(booker sdk.AccAddress, uuid string, duration int64) MsgBook { - return MsgBook{ - Booker: booker, - UUID: uuid, - Duration: duration, - } -} - -func (msg MsgBook) Route() string { - return RouterKey -} - -func (msg MsgBook) Type() string { - return TypeBookMsg -} - -func (msg MsgBook) ValidateBasic() error { - if len(msg.Booker) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Address of creator must not be empty") - } - if len(msg.UUID) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "UUID must not be empty") - } - if msg.Duration <= 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "duration must be positive") - } - return nil -} - -func (msg MsgBook) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgBook) String() string { - return fmt.Sprintf("Booking/MsgBook{UUID: %s}", msg.UUID) -} - -func (msg MsgBook) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Booker} -} - -type MsgComplete struct { - Booker sdk.AccAddress `json:"booker"` - BookID string `json:"uuid"` -} - -func NewMsgComplete(booker sdk.AccAddress, bookid string) MsgComplete { - return MsgComplete{ - Booker: booker, - BookID: bookid, - } -} - -func (msg MsgComplete) Route() string { - return RouterKey -} - -func (msg MsgComplete) Type() string { - return TypeBookCompleteMsg -} - -func (msg MsgComplete) ValidateBasic() error { - if len(msg.Booker) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Address of creator must not be empty") - } - if len(msg.BookID) == 0 { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "UUID must not be empty") - } - return nil -} - -func (msg MsgComplete) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgComplete) String() string { - return fmt.Sprintf("Booking/MsgComplete{BookID: %s}", msg.BookID) -} - -func (msg MsgComplete) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Booker} -} diff --git a/x/booking/types/querier.go b/x/booking/types/querier.go deleted file mode 100644 index f7a63a33..00000000 --- a/x/booking/types/querier.go +++ /dev/null @@ -1,21 +0,0 @@ -package types - -import "strings" - -// QueryResResolve Queries Result Payload for a resolve query -type QueryResResolve struct { - Value string `json:"value"` -} - -// implement fmt.Stringer -func (r QueryResResolve) String() string { - return r.Value -} - -// QueryResNames Queries Result Payload for a names query -type QueryResNames []string - -// implement fmt.Stringer -func (n QueryResNames) String() string { - return strings.Join(n[:], "\n") -} diff --git a/x/booking/types/query.pb.go b/x/booking/types/query.pb.go new file mode 100644 index 00000000..ba0bfbee --- /dev/null +++ b/x/booking/types/query.pb.go @@ -0,0 +1,587 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: booking/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryBookingRequest struct { + BookID string `protobuf:"bytes,1,opt,name=bookID,proto3" json:"bookID,omitempty"` +} + +func (m *QueryBookingRequest) Reset() { *m = QueryBookingRequest{} } +func (m *QueryBookingRequest) String() string { return proto.CompactTextString(m) } +func (*QueryBookingRequest) ProtoMessage() {} +func (*QueryBookingRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_28a72e504adbd3de, []int{0} +} +func (m *QueryBookingRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryBookingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryBookingRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryBookingRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryBookingRequest.Merge(m, src) +} +func (m *QueryBookingRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryBookingRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryBookingRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryBookingRequest proto.InternalMessageInfo + +type QueryBookingResponse struct { + Booking *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"` +} + +func (m *QueryBookingResponse) Reset() { *m = QueryBookingResponse{} } +func (m *QueryBookingResponse) String() string { return proto.CompactTextString(m) } +func (*QueryBookingResponse) ProtoMessage() {} +func (*QueryBookingResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_28a72e504adbd3de, []int{1} +} +func (m *QueryBookingResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryBookingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryBookingResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryBookingResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryBookingResponse.Merge(m, src) +} +func (m *QueryBookingResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryBookingResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryBookingResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryBookingResponse proto.InternalMessageInfo + +func (m *QueryBookingResponse) GetBooking() *Booking { + if m != nil { + return m.Booking + } + return nil +} + +func init() { + proto.RegisterType((*QueryBookingRequest)(nil), "shareledger.booking.QueryBookingRequest") + proto.RegisterType((*QueryBookingResponse)(nil), "shareledger.booking.QueryBookingResponse") +} + +func init() { proto.RegisterFile("booking/query.proto", fileDescriptor_28a72e504adbd3de) } + +var fileDescriptor_28a72e504adbd3de = []byte{ + // 323 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4e, 0xca, 0xcf, 0xcf, + 0xce, 0xcc, 0x4b, 0xd7, 0x2f, 0x2c, 0x4d, 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, + 0x12, 0x2e, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x83, 0x2a, 0x90, + 0x12, 0x85, 0xa9, 0x84, 0xd2, 0x10, 0xb5, 0x52, 0x32, 0xe9, 0xf9, 0xf9, 0xe9, 0x39, 0xa9, 0xfa, + 0x89, 0x05, 0x99, 0xfa, 0x89, 0x79, 0x79, 0xf9, 0x25, 0x89, 0x25, 0x99, 0xf9, 0x79, 0xc5, 0x50, + 0x59, 0xad, 0xe4, 0xfc, 0xe2, 0xdc, 0xfc, 0x62, 0xfd, 0xa4, 0xc4, 0xe2, 0x54, 0x88, 0x15, 0xfa, + 0x65, 0x86, 0x49, 0xa9, 0x25, 0x89, 0x86, 0xfa, 0x05, 0x89, 0xe9, 0x99, 0x79, 0x60, 0xc5, 0x50, + 0xb5, 0x22, 0xe9, 0xf9, 0xe9, 0xf9, 0x60, 0xa6, 0x3e, 0x88, 0x05, 0x11, 0x55, 0x32, 0xe7, 0x12, + 0x0e, 0x04, 0xe9, 0x73, 0x82, 0xd8, 0x1a, 0x94, 0x5a, 0x58, 0x9a, 0x5a, 0x5c, 0x22, 0x24, 0xc6, + 0xc5, 0x06, 0x72, 0x87, 0xa7, 0x8b, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x94, 0x67, 0xc5, + 0xd1, 0xb1, 0x40, 0x9e, 0xe1, 0xc5, 0x02, 0x79, 0x06, 0x25, 0x3f, 0x2e, 0x11, 0x54, 0x8d, 0xc5, + 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x42, 0x66, 0x5c, 0xec, 0x50, 0x1f, 0x80, 0xb5, 0x72, 0x1b, 0xc9, + 0xe8, 0x61, 0xf1, 0xae, 0x1e, 0x4c, 0x1b, 0x4c, 0xb1, 0x51, 0x3f, 0x23, 0x17, 0x2b, 0xd8, 0x40, + 0xa1, 0x56, 0x46, 0x2e, 0x76, 0xa8, 0xb4, 0x90, 0x06, 0x56, 0xcd, 0x58, 0x5c, 0x2c, 0xa5, 0x49, + 0x84, 0x4a, 0x88, 0x13, 0x95, 0x54, 0x9b, 0x2e, 0x3f, 0x99, 0xcc, 0x24, 0x2f, 0x24, 0xab, 0x8f, + 0xa4, 0x05, 0x16, 0xee, 0xfa, 0xd5, 0x10, 0xaf, 0xd6, 0x3a, 0x79, 0x9d, 0x78, 0x24, 0xc7, 0x78, + 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, + 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x41, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, + 0x2e, 0xc4, 0x88, 0x22, 0x90, 0x46, 0x64, 0xc3, 0x2a, 0xe0, 0xc6, 0x95, 0x54, 0x16, 0xa4, 0x16, + 0x27, 0xb1, 0x81, 0x43, 0xdb, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7d, 0xfb, 0x1f, 0x10, + 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Queries a list of booking items. + Booking(ctx context.Context, in *QueryBookingRequest, opts ...grpc.CallOption) (*QueryBookingResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) Booking(ctx context.Context, in *QueryBookingRequest, opts ...grpc.CallOption) (*QueryBookingResponse, error) { + out := new(QueryBookingResponse) + err := c.cc.Invoke(ctx, "/shareledger.booking.Query/Booking", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Queries a list of booking items. + Booking(context.Context, *QueryBookingRequest) (*QueryBookingResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) Booking(ctx context.Context, req *QueryBookingRequest) (*QueryBookingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Booking not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_Booking_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryBookingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Booking(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.booking.Query/Booking", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Booking(ctx, req.(*QueryBookingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.booking.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Booking", + Handler: _Query_Booking_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "booking/query.proto", +} + +func (m *QueryBookingRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryBookingRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryBookingRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.BookID) > 0 { + i -= len(m.BookID) + copy(dAtA[i:], m.BookID) + i = encodeVarintQuery(dAtA, i, uint64(len(m.BookID))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryBookingResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryBookingResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryBookingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Booking != nil { + { + size, err := m.Booking.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryBookingRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BookID) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryBookingResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Booking != nil { + l = m.Booking.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryBookingRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryBookingRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryBookingRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BookID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BookID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryBookingResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryBookingResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryBookingResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Booking", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Booking == nil { + m.Booking = &Booking{} + } + if err := m.Booking.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/booking/types/query.pb.gw.go b/x/booking/types/query.pb.gw.go new file mode 100644 index 00000000..5359a3a7 --- /dev/null +++ b/x/booking/types/query.pb.gw.go @@ -0,0 +1,189 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: booking/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_Booking_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryBookingRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["bookID"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "bookID") + } + + protoReq.BookID, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "bookID", err) + } + + msg, err := client.Booking(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Booking_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryBookingRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["bookID"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "bookID") + } + + protoReq.BookID, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "bookID", err) + } + + msg, err := server.Booking(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Booking_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Booking_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Booking_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_Booking_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Booking_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Booking_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_Booking_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"shareledger", "booking", "bookID"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Query_Booking_0 = runtime.ForwardResponseMessage +) diff --git a/x/booking/types/tx.pb.go b/x/booking/types/tx.pb.go new file mode 100644 index 00000000..b4f57049 --- /dev/null +++ b/x/booking/types/tx.pb.go @@ -0,0 +1,988 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: booking/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgCreateBooking struct { + Booker string `protobuf:"bytes,1,opt,name=booker,proto3" json:"booker,omitempty"` + UUID string `protobuf:"bytes,2,opt,name=UUID,proto3" json:"UUID,omitempty"` + Duration int64 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` +} + +func (m *MsgCreateBooking) Reset() { *m = MsgCreateBooking{} } +func (m *MsgCreateBooking) String() string { return proto.CompactTextString(m) } +func (*MsgCreateBooking) ProtoMessage() {} +func (*MsgCreateBooking) Descriptor() ([]byte, []int) { + return fileDescriptor_e243c29ad9ae20da, []int{0} +} +func (m *MsgCreateBooking) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateBooking) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateBooking.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateBooking) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateBooking.Merge(m, src) +} +func (m *MsgCreateBooking) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateBooking) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateBooking.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateBooking proto.InternalMessageInfo + +func (m *MsgCreateBooking) GetBooker() string { + if m != nil { + return m.Booker + } + return "" +} + +func (m *MsgCreateBooking) GetUUID() string { + if m != nil { + return m.UUID + } + return "" +} + +func (m *MsgCreateBooking) GetDuration() int64 { + if m != nil { + return m.Duration + } + return 0 +} + +type MsgCreateBookingResponse struct { +} + +func (m *MsgCreateBookingResponse) Reset() { *m = MsgCreateBookingResponse{} } +func (m *MsgCreateBookingResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateBookingResponse) ProtoMessage() {} +func (*MsgCreateBookingResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e243c29ad9ae20da, []int{1} +} +func (m *MsgCreateBookingResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateBookingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateBookingResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateBookingResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateBookingResponse.Merge(m, src) +} +func (m *MsgCreateBookingResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateBookingResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateBookingResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateBookingResponse proto.InternalMessageInfo + +type MsgCompleteBooking struct { + Booker string `protobuf:"bytes,1,opt,name=booker,proto3" json:"booker,omitempty"` + BookID string `protobuf:"bytes,2,opt,name=bookID,proto3" json:"bookID,omitempty"` +} + +func (m *MsgCompleteBooking) Reset() { *m = MsgCompleteBooking{} } +func (m *MsgCompleteBooking) String() string { return proto.CompactTextString(m) } +func (*MsgCompleteBooking) ProtoMessage() {} +func (*MsgCompleteBooking) Descriptor() ([]byte, []int) { + return fileDescriptor_e243c29ad9ae20da, []int{2} +} +func (m *MsgCompleteBooking) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCompleteBooking) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCompleteBooking.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCompleteBooking) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCompleteBooking.Merge(m, src) +} +func (m *MsgCompleteBooking) XXX_Size() int { + return m.Size() +} +func (m *MsgCompleteBooking) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCompleteBooking.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCompleteBooking proto.InternalMessageInfo + +func (m *MsgCompleteBooking) GetBooker() string { + if m != nil { + return m.Booker + } + return "" +} + +func (m *MsgCompleteBooking) GetBookID() string { + if m != nil { + return m.BookID + } + return "" +} + +type MsgCompleteBookingResponse struct { +} + +func (m *MsgCompleteBookingResponse) Reset() { *m = MsgCompleteBookingResponse{} } +func (m *MsgCompleteBookingResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCompleteBookingResponse) ProtoMessage() {} +func (*MsgCompleteBookingResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e243c29ad9ae20da, []int{3} +} +func (m *MsgCompleteBookingResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCompleteBookingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCompleteBookingResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCompleteBookingResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCompleteBookingResponse.Merge(m, src) +} +func (m *MsgCompleteBookingResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCompleteBookingResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCompleteBookingResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCompleteBookingResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCreateBooking)(nil), "shareledger.booking.MsgCreateBooking") + proto.RegisterType((*MsgCreateBookingResponse)(nil), "shareledger.booking.MsgCreateBookingResponse") + proto.RegisterType((*MsgCompleteBooking)(nil), "shareledger.booking.MsgCompleteBooking") + proto.RegisterType((*MsgCompleteBookingResponse)(nil), "shareledger.booking.MsgCompleteBookingResponse") +} + +func init() { proto.RegisterFile("booking/tx.proto", fileDescriptor_e243c29ad9ae20da) } + +var fileDescriptor_e243c29ad9ae20da = []byte{ + // 277 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x48, 0xca, 0xcf, 0xcf, + 0xce, 0xcc, 0x4b, 0xd7, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2e, 0xce, + 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x83, 0xca, 0x2a, 0x45, 0x71, 0x09, + 0xf8, 0x16, 0xa7, 0x3b, 0x17, 0xa5, 0x26, 0x96, 0xa4, 0x3a, 0x41, 0xc4, 0x84, 0xc4, 0xb8, 0xd8, + 0x40, 0xd2, 0xa9, 0x45, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x50, 0x9e, 0x90, 0x10, 0x17, + 0x4b, 0x68, 0xa8, 0xa7, 0x8b, 0x04, 0x13, 0x58, 0x14, 0xcc, 0x16, 0x92, 0xe2, 0xe2, 0x48, 0x29, + 0x2d, 0x4a, 0x2c, 0xc9, 0xcc, 0xcf, 0x93, 0x60, 0x56, 0x60, 0xd4, 0x60, 0x0e, 0x82, 0xf3, 0x95, + 0xa4, 0xb8, 0x24, 0xd0, 0xcd, 0x0e, 0x4a, 0x2d, 0x2e, 0xc8, 0xcf, 0x2b, 0x4e, 0x55, 0x72, 0xe1, + 0x12, 0x02, 0xc9, 0xe5, 0xe7, 0x16, 0xe4, 0xa4, 0x12, 0xb6, 0x19, 0x2a, 0x0e, 0xb7, 0x1b, 0xca, + 0x53, 0x92, 0xe1, 0x92, 0xc2, 0x34, 0x05, 0x66, 0x87, 0xd1, 0x4d, 0x46, 0x2e, 0x66, 0xdf, 0xe2, + 0x74, 0xa1, 0x54, 0x2e, 0x5e, 0x54, 0x0f, 0xaa, 0xea, 0x61, 0x09, 0x0a, 0x3d, 0x74, 0xb7, 0x4a, + 0xe9, 0x12, 0xa5, 0x0c, 0x66, 0x9d, 0x50, 0x36, 0x17, 0x3f, 0xba, 0x7f, 0xd4, 0x71, 0x9a, 0x80, + 0xaa, 0x50, 0x4a, 0x9f, 0x48, 0x85, 0x30, 0xcb, 0x9c, 0xbc, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, + 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, + 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x20, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, + 0x1f, 0x6c, 0x68, 0x11, 0x28, 0x15, 0x20, 0x19, 0xaf, 0x5f, 0xa1, 0x0f, 0x4f, 0x1b, 0x95, 0x05, + 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xf4, 0x61, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x80, 0x79, 0x0b, + 0xdc, 0x33, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + CreateBooking(ctx context.Context, in *MsgCreateBooking, opts ...grpc.CallOption) (*MsgCreateBookingResponse, error) + CompleteBooking(ctx context.Context, in *MsgCompleteBooking, opts ...grpc.CallOption) (*MsgCompleteBookingResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) CreateBooking(ctx context.Context, in *MsgCreateBooking, opts ...grpc.CallOption) (*MsgCreateBookingResponse, error) { + out := new(MsgCreateBookingResponse) + err := c.cc.Invoke(ctx, "/shareledger.booking.Msg/CreateBooking", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) CompleteBooking(ctx context.Context, in *MsgCompleteBooking, opts ...grpc.CallOption) (*MsgCompleteBookingResponse, error) { + out := new(MsgCompleteBookingResponse) + err := c.cc.Invoke(ctx, "/shareledger.booking.Msg/CompleteBooking", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + CreateBooking(context.Context, *MsgCreateBooking) (*MsgCreateBookingResponse, error) + CompleteBooking(context.Context, *MsgCompleteBooking) (*MsgCompleteBookingResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) CreateBooking(ctx context.Context, req *MsgCreateBooking) (*MsgCreateBookingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateBooking not implemented") +} +func (*UnimplementedMsgServer) CompleteBooking(ctx context.Context, req *MsgCompleteBooking) (*MsgCompleteBookingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CompleteBooking not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_CreateBooking_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateBooking) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateBooking(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.booking.Msg/CreateBooking", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateBooking(ctx, req.(*MsgCreateBooking)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_CompleteBooking_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCompleteBooking) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CompleteBooking(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.booking.Msg/CompleteBooking", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CompleteBooking(ctx, req.(*MsgCompleteBooking)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.booking.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateBooking", + Handler: _Msg_CreateBooking_Handler, + }, + { + MethodName: "CompleteBooking", + Handler: _Msg_CompleteBooking_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "booking/tx.proto", +} + +func (m *MsgCreateBooking) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateBooking) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateBooking) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Duration != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Duration)) + i-- + dAtA[i] = 0x18 + } + if len(m.UUID) > 0 { + i -= len(m.UUID) + copy(dAtA[i:], m.UUID) + i = encodeVarintTx(dAtA, i, uint64(len(m.UUID))) + i-- + dAtA[i] = 0x12 + } + if len(m.Booker) > 0 { + i -= len(m.Booker) + copy(dAtA[i:], m.Booker) + i = encodeVarintTx(dAtA, i, uint64(len(m.Booker))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateBookingResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateBookingResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateBookingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgCompleteBooking) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCompleteBooking) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCompleteBooking) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.BookID) > 0 { + i -= len(m.BookID) + copy(dAtA[i:], m.BookID) + i = encodeVarintTx(dAtA, i, uint64(len(m.BookID))) + i-- + dAtA[i] = 0x12 + } + if len(m.Booker) > 0 { + i -= len(m.Booker) + copy(dAtA[i:], m.Booker) + i = encodeVarintTx(dAtA, i, uint64(len(m.Booker))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCompleteBookingResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCompleteBookingResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCompleteBookingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateBooking) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Booker) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.UUID) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Duration != 0 { + n += 1 + sovTx(uint64(m.Duration)) + } + return n +} + +func (m *MsgCreateBookingResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgCompleteBooking) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Booker) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.BookID) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgCompleteBookingResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateBooking) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateBooking: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateBooking: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Booker", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Booker = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UUID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + m.Duration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Duration |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateBookingResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateBookingResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateBookingResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCompleteBooking) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCompleteBooking: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCompleteBooking: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Booker", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Booker = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BookID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BookID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCompleteBookingResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCompleteBookingResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCompleteBookingResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/booking/types/types.go b/x/booking/types/types.go index 73d3f6a1..c376b2dc 100644 --- a/x/booking/types/types.go +++ b/x/booking/types/types.go @@ -1,18 +1,6 @@ package types -import ( - "encoding/json" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -type Booking struct { - BookID string `json:"bookingId"` - Booker sdk.AccAddress `json:"renter"` - UUID string `json:"uuid"` - Duration int64 `json:"duration"` - IsCompleted bool `json:"isCompleted` -} +import "encoding/json" func (b Booking) GetString() (string, error) { js, err := json.Marshal(b) @@ -22,11 +10,7 @@ func (b Booking) GetString() (string, error) { return string(js), nil } -func NewBooking() Booking { - return Booking{} -} - -func NewBookingFromMsgBook(msg MsgBook) Booking { +func NewBookingFromMsgBook(msg MsgCreateBooking) Booking { return Booking{ UUID: msg.UUID, Booker: msg.Booker, diff --git a/x/booking/utils.go b/x/booking/utils.go deleted file mode 100644 index 31551148..00000000 --- a/x/booking/utils.go +++ /dev/null @@ -1,21 +0,0 @@ -package booking - -import ( - "crypto/sha256" - "encoding/hex" - "encoding/json" -) - -func GenBookID(inp interface{}) (string, error) { - h := sha256.New() - - enc, err := json.Marshal(inp) - if err != nil { - return "", err - } - - h.Write(enc) - hash := h.Sum(nil) - - return hex.EncodeToString(hash)[:20], nil -} diff --git a/x/constant/fee.go b/x/constant/fee.go new file mode 100644 index 00000000..23727897 --- /dev/null +++ b/x/constant/fee.go @@ -0,0 +1,22 @@ +package constant + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +type DefaultLevel string + +const HighFee = DefaultLevel("high") +const MediumFee = DefaultLevel("medium") +const LowFee = DefaultLevel("low") +const MinFee = DefaultLevel("min") +const NoFee = DefaultLevel("zero") + +var DefaultFeeLevel = map[DefaultLevel]sdk.DecCoin{ + HighFee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("0.05")), + MediumFee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("0.03")), + LowFee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("0.02")), + MinFee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("0.01")), + NoFee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("0")), +} diff --git a/x/document/client/cli/query.go b/x/document/client/cli/query.go new file mode 100644 index 00000000..65628247 --- /dev/null +++ b/x/document/client/cli/query.go @@ -0,0 +1,36 @@ +package cli + +import ( + "fmt" + // "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + // "github.com/cosmos/cosmos-sdk/client/flags" + // sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/sharering/shareledger/x/document/types" +) + +// GetQueryCmd returns the cli query commands for this module +func GetQueryCmd(queryRoute string) *cobra.Command { + // Group document queries under a subcommand + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand(CmdDocumentByProof()) + + cmd.AddCommand(CmdDocumentByHolderId()) + + cmd.AddCommand(CmdDocumentOfHolderByIssuer()) + + // this line is used by starport scaffolding # 1 + + return cmd +} diff --git a/x/document/client/cli/query_document_by_holder_id.go b/x/document/client/cli/query_document_by_holder_id.go new file mode 100644 index 00000000..988f883c --- /dev/null +++ b/x/document/client/cli/query_document_by_holder_id.go @@ -0,0 +1,54 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/document/types" +) + +var _ = strconv.Itoa(0) + +func CmdDocumentByHolderId() *cobra.Command { + cmd := &cobra.Command{ + Use: "holder [holder id]", + Short: "Get all documents of a holder.", + Long: strings.TrimSpace(fmt.Sprintf(` +Get all docs of a holder. +Example: +$ %s query %s holder uid-11594`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqId := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryDocumentByHolderIdRequest{ + + Id: reqId, + } + + res, err := queryClient.DocumentByHolderId(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/document/client/cli/query_document_by_proof.go b/x/document/client/cli/query_document_by_proof.go new file mode 100644 index 00000000..060c953d --- /dev/null +++ b/x/document/client/cli/query_document_by_proof.go @@ -0,0 +1,54 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/document/types" +) + +var _ = strconv.Itoa(0) + +func CmdDocumentByProof() *cobra.Command { + cmd := &cobra.Command{ + Use: "proof [proof]", + Short: "Query for document information", + Long: strings.TrimSpace(fmt.Sprintf(` +Query document information by the proof. +Example: +$ %s query %s proof 5wpluxhf4qru2ewy58kc3w4tkzm3v`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqProof := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryDocumentByProofRequest{ + + Proof: reqProof, + } + + res, err := queryClient.DocumentByProof(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/document/client/cli/query_document_of_holder_by_issuer.go b/x/document/client/cli/query_document_of_holder_by_issuer.go new file mode 100644 index 00000000..e79e3a4b --- /dev/null +++ b/x/document/client/cli/query_document_of_holder_by_issuer.go @@ -0,0 +1,55 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/document/types" +) + +var _ = strconv.Itoa(0) + +func CmdDocumentOfHolderByIssuer() *cobra.Command { + cmd := &cobra.Command{ + Use: "document-by-issuer [holder] [issuer]", + Short: "Get all document of a holder issue by a specific issuer", + Long: strings.TrimSpace(fmt.Sprintf(` +Example: +$ %s query %s document-by-issuer uuid-5312 shareledger1z8h2ymcpr7w75l4pwxkgr3fmg6wqv9fk5mrc79`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqHolder := args[0] + reqIssuer := args[1] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryDocumentOfHolderByIssuerRequest{ + + Holder: reqHolder, + Issuer: reqIssuer, + } + + res, err := queryClient.DocumentOfHolderByIssuer(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/document/client/cli/tx.go b/x/document/client/cli/tx.go new file mode 100644 index 00000000..6cab40b6 --- /dev/null +++ b/x/document/client/cli/tx.go @@ -0,0 +1,39 @@ +package cli + +import ( + "fmt" + "time" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + // "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/document/types" +) + +var ( + DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) +) + +const ( + flagPacketTimeoutTimestamp = "packet-timeout-timestamp" +) + +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand(CmdCreateDocument()) + cmd.AddCommand(CmdCreateDocuments()) + cmd.AddCommand(CmdRevokeDocument()) + cmd.AddCommand(CmdUpdateDocument()) + // this line is used by starport scaffolding # 1 + + return cmd +} diff --git a/x/document/client/cli/tx_create_document.go b/x/document/client/cli/tx_create_document.go new file mode 100644 index 00000000..daeb3fbe --- /dev/null +++ b/x/document/client/cli/tx_create_document.go @@ -0,0 +1,54 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/document/types" +) + +var _ = strconv.Itoa(0) + +func CmdCreateDocument() *cobra.Command { + cmd := &cobra.Command{ + Use: "create [holder id] [proof] [extra data]", + Short: "CreateAsset a new document", + Long: strings.TrimSpace(fmt.Sprintf(` +Example: +$ %s tx %s create uuid-5132 c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6 https://sharering.network/id/463`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argHolder := args[0] + argProof := args[1] + argData := args[2] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgCreateDocument( + argData, + argHolder, + clientCtx.GetFromAddress().String(), + argProof, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/document/client/cli/tx_create_documents.go b/x/document/client/cli/tx_create_documents.go new file mode 100644 index 00000000..135e5467 --- /dev/null +++ b/x/document/client/cli/tx_create_documents.go @@ -0,0 +1,54 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/document/types" +) + +var _ = strconv.Itoa(0) + +func CmdCreateDocuments() *cobra.Command { + cmd := &cobra.Command{ + Use: "create-documents [holder id] [proof] [extra data]", + Short: "Create new documents", + Long: strings.TrimSpace(fmt.Sprintf(` +Example: +$ %s tx %s create-documents uuid-5122,uuid-0218 c89efdaa54c0f20c7adf6,c89efdaa54c0f20c7adf6 https://sharering.network/id/463,https://sharering.network/id/463`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) (err error) { + sep := "," + argHolder := strings.Split(args[0], sep) + argProof := strings.Split(args[1], sep) + argData := strings.Split(args[2], sep) + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgCreateDocuments( + argData, + argHolder, + clientCtx.GetFromAddress().String(), + argProof, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/document/client/cli/tx_revoke_document.go b/x/document/client/cli/tx_revoke_document.go new file mode 100644 index 00000000..4b7bc8c7 --- /dev/null +++ b/x/document/client/cli/tx_revoke_document.go @@ -0,0 +1,45 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/document/types" +) + +var _ = strconv.Itoa(0) + +func CmdRevokeDocument() *cobra.Command { + cmd := &cobra.Command{ + Use: "revoke [holder id] [proof]", + Short: "Revoke a document", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argHolder := args[0] + argProof := args[1] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgRevokeDocument( + argHolder, + clientCtx.GetFromAddress().String(), + argProof, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/document/client/cli/tx_update_document.go b/x/document/client/cli/tx_update_document.go new file mode 100644 index 00000000..1d5b6424 --- /dev/null +++ b/x/document/client/cli/tx_update_document.go @@ -0,0 +1,47 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/document/types" +) + +var _ = strconv.Itoa(0) + +func CmdUpdateDocument() *cobra.Command { + cmd := &cobra.Command{ + Use: "update [holder id] [proof] [extra data]", + Short: "UpdateAsset a document", + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argHolder := args[0] + argProof := args[1] + argData := args[2] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgUpdateDocument( + argData, + argHolder, + clientCtx.GetFromAddress().String(), + argProof, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/document/client/tests/cli_test.go b/x/document/client/tests/cli_test.go new file mode 100644 index 00000000..220c659c --- /dev/null +++ b/x/document/client/tests/cli_test.go @@ -0,0 +1,24 @@ +package tests + +import ( + "github.com/sharering/shareledger/cmd/Shareledgerd/cli" + "sync" + "testing" + + "github.com/sharering/shareledger/testutil/network" + "github.com/stretchr/testify/suite" +) + +var runOnce = sync.Once{} + +func init() { + runOnce.Do(func() { + cli.InitMiddleWare() + }) +} + +func TestDocumentIntegrationTest(t *testing.T) { + networkConfig := network.ShareLedgerTestingConfig() + networkConfig.NumValidators = 1 + suite.Run(t, NewDocumentIntegrationTestSuite(networkConfig)) +} diff --git a/x/document/client/tests/suite.go b/x/document/client/tests/suite.go new file mode 100644 index 00000000..a67c59ea --- /dev/null +++ b/x/document/client/tests/suite.go @@ -0,0 +1,512 @@ +package tests + +import ( + "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/cosmos/cosmos-sdk/types" + netutilts "github.com/sharering/shareledger/testutil/network" + "github.com/stretchr/testify/suite" + "os" + "strings" + + "github.com/sharering/shareledger/testutil/sample" + documenttypes "github.com/sharering/shareledger/x/document/types" + "github.com/sharering/shareledger/x/electoral/client/tests" + idtest "github.com/sharering/shareledger/x/id/client/tests" +) + +type DocumentIntegrationTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network + dir string + userID1 string + userID1Addr string + userID2 string + userID2Addr string + userID3 string + userID3Addr string +} + +func NewDocumentIntegrationTestSuite(cf network.Config) *DocumentIntegrationTestSuite { + return &DocumentIntegrationTestSuite{ + cfg: cf, + } +} +func (s *DocumentIntegrationTestSuite) setupTestingMaterial() { + + initIDSigAndDocIssuer := []struct { + id string + accountID string + idData string + docProof string + docData string + }{ + { + id: "id_1", + accountID: netutilts.KeyAccount1, + idData: "extra_1", + }, + { + id: "id_2", + accountID: netutilts.KeyAccount2, + idData: "extra_2", + }, + { + id: "id_3", + accountID: netutilts.KeyAccount3, + idData: "extra_3", + }, + { + id: "id_4", + accountID: netutilts.KeyAccount4, + idData: "extra_4", + docData: "doc_data", + docProof: "proofff1", + }, + { + id: "id_5", + accountID: netutilts.KeyAccount5, + idData: "extra_5_update", + docData: "doc_for_update_1", + docProof: "proof_doc_for_update_1", + }, + { + id: "id_6", + accountID: netutilts.KeyAccount6, + idData: "extra_6_update", + docData: "doc_for_update_2", + docProof: "proof_doc_for_update_2", + }, + { + id: "id_7", + accountID: netutilts.KeyAccount7, + idData: "extra_6_update", + docData: "doc_for_update_3", + docProof: "proof_doc_for_update_3", + }, + } + + //Enroll ACCOUNT_OPERATOR + out, _ := tests.ExCmdEnrollAccountOperator( + s.network.Validators[0].ClientCtx, + []string{netutilts.Accounts[netutilts.KeyOperator].String()}, + netutilts.MakeByAccount(netutilts.KeyAuthority), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee2, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init operator fail %v", res.String()) + + for _, iz := range initIDSigAndDocIssuer { + //Enroll ID_SIGNER + out, _ = tests.ExCmdEnrollIdSigner( + s.network.Validators[0].ClientCtx, + []string{netutilts.Accounts[iz.accountID].String()}, + netutilts.SHRFee2, + netutilts.MakeByAccount(netutilts.KeyOperator), + netutilts.SkipConfirmation, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res = netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init doc issuer fail %v", res.String()) + + out, _ = tests.ExCmdEnrollDocIssuer( + s.network.Validators[0].ClientCtx, + []string{netutilts.Accounts[iz.accountID].String()}, + netutilts.SHRFee2, + netutilts.MakeByAccount(netutilts.KeyOperator), + netutilts.SkipConfirmation, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res = netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init doc issuer fail %v", res.String()) + + out, _ = idtest.CmdExNewID(s.network.Validators[0].ClientCtx, + iz.id, + sample.AccAddress(), + netutilts.Accounts[iz.accountID].String(), + iz.idData, + netutilts.MakeByAccount(iz.accountID), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee2) + + s.Require().NoError(s.network.WaitForNextBlock()) + res = netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init id fail %v for id %s", res.String(), iz.id) + + if strings.TrimSpace(iz.docProof) != "" && strings.TrimSpace(iz.docData) != "" { + out, _ := CmdExCreateDocument(s.network.Validators[0].ClientCtx, + iz.id, iz.docProof, iz.docData, + netutilts.MakeByAccount(iz.accountID), + netutilts.BlockBroadcast, + netutilts.SHRFee2, + netutilts.SkipConfirmation, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res = netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init doc %s fail %v", iz.docProof, res.String()) + } + + } + +} +func (s *DocumentIntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite for document module") + + kb, dir := netutilts.GetTestingGenesis(s.T(), &s.cfg) + s.dir = dir + + s.network = network.New(s.T(), s.cfg) + _, err := s.network.WaitForHeight(1) + s.Require().NoError(err) + + //override the keyring by our keyring informatirevoke_the_document_successfullyon + s.network.Validators[0].ClientCtx.Keyring = kb + + s.setupTestingMaterial() + + s.T().Log("setting up integration test suite successfully") + +} +func (s *DocumentIntegrationTestSuite) TearDownSuite() { + s.NoError(os.RemoveAll(s.dir), "cleanup test case fails") + s.network.Cleanup() + s.T().Log("tearing down integration test suite") +} + +func (s *DocumentIntegrationTestSuite) TestCreateDocument() { + type ( + TestCase struct { + d string + iHolderID string + iDocProof string + iDocData string + txnCreator string + txnFee int + oErr error + oRes *types.TxResponse + oDoc *documenttypes.Document + } + ) + + testSuite := []TestCase{ + { + d: "create_document_success_by_using_authority_account", + iHolderID: "id_1", + iDocProof: "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8sa6", + iDocData: "extradata-001", + txnCreator: netutilts.KeyAccount1, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oDoc: &documenttypes.Document{ + Holder: "id_1", + Issuer: netutilts.Accounts[netutilts.KeyAccount1].String(), + Proof: "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8sa6", + Data: "extradata-001", + Version: 0, + }, + }, + { + d: "create_document_but_duplicated_the_tx_must_be_fail", + iHolderID: "id_4", + iDocProof: "proofff1", + iDocData: "extra_4", + txnCreator: netutilts.KeyAccount4, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: documenttypes.ErrDocExisted.ABCICode()}, + oDoc: nil, + }, + } + + validationCtx := s.network.Validators[0].ClientCtx + + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExCreateDocument(validationCtx, + tc.iHolderID, tc.iDocProof, tc.iDocData, + netutilts.MakeByAccount(tc.txnCreator), + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txnFee), + netutilts.SkipConfirmation, + ) + if tc.oErr != nil { + s.NotNilf(err, "this case need got error") + } + if tc.oRes != nil { + txnResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "create document fail %s", txnResponse.String()) + } + if tc.oDoc != nil { + queryDocResponse := CmdExGetDocByProof(validationCtx, s.T(), tc.iDocProof, netutilts.JSONFlag) + docResponse := queryDocResponse.GetDocument() + s.Equalf(tc.oDoc.Holder, docResponse.GetHolder(), "holder ID isn't equal") + s.Equalf(tc.oDoc.Proof, docResponse.GetProof(), "proof isn't equal") + s.Equalf(tc.oDoc.Data, docResponse.GetData(), "data ID isn't equal") + } + + }) + } + +} + +func (s *DocumentIntegrationTestSuite) TestCreateBatchDocument() { + validationCtx := s.network.Validators[0].ClientCtx + type ( + TestCase struct { + d string + iHolderIDs []string + iDocProofs []string + iDocDatas []string + txnCreator string + txnFee int + oErr error + oRes *types.TxResponse + oDocs []documenttypes.Document + } + ) + + testSuite := []TestCase{ + { + d: "create_documents_success_by_using_authority_account", + iHolderIDs: []string{ + "id_1", + "id_2", + "id_3", + }, + iDocProofs: []string{ + "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", + "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8", + }, + iDocDatas: []string{ + "extradata_batch_001", + "extradata_batch_002", + "extradata_batch_003"}, + txnCreator: netutilts.KeyAccount3, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oDocs: []documenttypes.Document{ + { + Holder: "id_1", + Issuer: netutilts.Accounts[netutilts.KeyAccount3].String(), + Proof: "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + Data: "extradata_batch_001", + Version: 0, + }, + { + Holder: "id_2", + Issuer: netutilts.Accounts[netutilts.KeyAccount3].String(), + Proof: "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc7", + Data: "extradata_batch_002", + Version: 0, + }, + { + Holder: "id_3", + Issuer: netutilts.Accounts[netutilts.KeyAccount3].String(), + Proof: "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8", + Data: "extradata_batch_003", + Version: 0, + }, + }, + }, + } + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExCreateDocumentInBatch(validationCtx, + strings.Join(tc.iHolderIDs, ","), + strings.Join(tc.iDocProofs, ","), + strings.Join(tc.iDocDatas, ","), + netutilts.MakeByAccount(tc.txnCreator), + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txnFee), + netutilts.SkipConfirmation, + ) + if tc.oErr != nil { + s.NotNilf(err, "this case need got error") + } + if tc.oRes != nil { + txnResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "create documents fail %s", txnResponse.String()) + } + if len(tc.oDocs) != 0 { + for _, d := range tc.oDocs { + queryDocResponse := CmdExGetDocByProof(validationCtx, s.T(), d.Proof, netutilts.JSONFlag) + docResponse := queryDocResponse.GetDocument() + s.Equalf(d.Holder, docResponse.GetHolder(), "holder ID isn't equal") + s.Equalf(d.Proof, docResponse.GetProof(), "proof isn't equal") + s.Equalf(d.Data, docResponse.GetData(), "data ID isn't equal") + } + + } + + }) + } +} + +func (s *DocumentIntegrationTestSuite) TestUpdateDocument() { + + validationCtx := s.network.Validators[0].ClientCtx + + type ( + TestCase struct { + d string + iHolderID string + iDocProof string + iDocData string + txnCreator string + txnFee int + oErr error + oRes *types.TxResponse + oDoc *documenttypes.Document + } + ) + + testSuite := []TestCase{ + { + d: "update the document success", + iHolderID: "id_5", + iDocProof: "proof_doc_for_update_1", + iDocData: "doc_for_update_3_newwww-001", + txnCreator: netutilts.KeyAccount5, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oDoc: &documenttypes.Document{ + Holder: "id_5", + Issuer: netutilts.Accounts[netutilts.KeyAccount5].String(), + Proof: "proof_doc_for_update_1", + Data: "doc_for_update_3_newwww-001", + Version: 1, + }, + }, + { + d: "update_document_with_not_exist_hold_id_should_be_fail", + iHolderID: "id_5", + iDocProof: "proof_doc_for_update_1+hithere", + iDocData: "doc_for_update_3_newwww", + txnCreator: netutilts.KeyAccount5, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: documenttypes.ErrDocNotExisted.ABCICode()}, + }, + { + d: "update the document but by not authorize", + iHolderID: "id_7", + iDocProof: "proof_doc_for_update_3", + iDocData: "doc_for_update_3", + txnCreator: netutilts.KeyAccount6, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: documenttypes.ErrDocNotExisted.ABCICode()}, + oDoc: &documenttypes.Document{ + Holder: "id_7", + Issuer: netutilts.Accounts[netutilts.KeyAccount5].String(), + Proof: "proof_doc_for_update_3", + Data: "doc_for_update_3", + Version: 0, + }, + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExUpdateDocument(validationCtx, + tc.iHolderID, tc.iDocProof, tc.iDocData, + netutilts.MakeByAccount(tc.txnCreator), + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txnFee), + netutilts.SkipConfirmation, + ) + if tc.oErr != nil { + s.NotNilf(err, "this case need got error") + } + if tc.oRes != nil { + txnResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "update document fail %s", txnResponse.String()) + } + if tc.oDoc != nil { + queryDocResponse := CmdExGetDocByProof(validationCtx, s.T(), tc.iDocProof, netutilts.JSONFlag) + docResponse := queryDocResponse.GetDocument() + s.Equalf(tc.oDoc.Holder, docResponse.GetHolder(), "holder ID isn't equal") + s.Equalf(tc.oDoc.Proof, docResponse.GetProof(), "proof isn't equal") + s.Equalf(tc.oDoc.Data, docResponse.GetData(), "data ID isn't equal") + } + + }) + } + +} + +func (s *DocumentIntegrationTestSuite) TestRevokeDocument() { + validationCtx := s.network.Validators[0].ClientCtx + + type ( + TestCase struct { + d string + iHolderID string + iDocProof string + txnCreator string + txnFee int + oErr error + oRes *types.TxResponse + oDoc *documenttypes.Document + } + ) + + testSuite := []TestCase{ + { + d: "revoke the document successfully", + iHolderID: "id_1", + iDocProof: "c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8sa6", + txnCreator: netutilts.KeyAccount1, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oDoc: &documenttypes.Document{ + Version: documenttypes.DocRevokeFlag, + }, + }, + { + d: "revoke the document fail", + iHolderID: "id_33424", + iDocProof: "c89efdaa54c0f20c7adf612882df0950f5a958+not found", + txnCreator: netutilts.KeyAccount1, + txnFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: documenttypes.ErrDocNotExisted.ABCICode()}, + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExRevokeDocument(validationCtx, + tc.iHolderID, tc.iDocProof, + netutilts.MakeByAccount(tc.txnCreator), + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txnFee), + netutilts.SkipConfirmation, + ) + if tc.oErr != nil { + s.NotNilf(err, "this case need got error") + } + if tc.oRes != nil { + txnResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "revoke document fail %s", txnResponse.String()) + } + if tc.oDoc != nil { + queryDocResponse := CmdExGetDocByProof(validationCtx, s.T(), tc.iDocProof, netutilts.JSONFlag) + docResponse := queryDocResponse.GetDocument() + s.Equalf(tc.oDoc.Version, docResponse.GetVersion(), "version isn't equal") + } + + }) + } + +} diff --git a/x/document/client/tests/test_helpers.go b/x/document/client/tests/test_helpers.go new file mode 100644 index 00000000..791e10a0 --- /dev/null +++ b/x/document/client/tests/test_helpers.go @@ -0,0 +1,79 @@ +package tests + +import ( + "encoding/json" + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + + "github.com/sharering/shareledger/testutil/network" + "github.com/sharering/shareledger/x/document/client/cli" + "github.com/sharering/shareledger/x/document/types" +) + +func CmdExCreateDocument(clientCtx client.Context, holderID, docProof, extraData string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{holderID, docProof, extraData} + args = append(args, extraFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdCreateDocument(), args) +} + +func CmdExCreateDocumentInBatch(clientCtx client.Context, holderID, docProof, extraData string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{holderID, docProof, extraData} + args = append(args, extraFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdCreateDocuments(), args) +} + +func CmdExUpdateDocument(clientCtx client.Context, holderID, docProof, extraData string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{holderID, docProof, extraData} + args = append(args, extraFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdUpdateDocument(), args) +} + +func CmdExRevokeDocument(clientCtx client.Context, holderID, docProof string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{holderID, docProof} + args = append(args, extraFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdRevokeDocument(), args) +} + +func CmdExGetDocByHolderID(clientCtx client.Context, t *testing.T, holderID string, extraFlags ...string) types.QueryDocumentByHolderIdResponse { + args := []string{holderID} + args = append(args, extraFlags...) + args = append(args, network.JSONFlag) + out, err := clitestutil.ExecTestCLICmd(clientCtx, cli.CmdDocumentByHolderId(), args) + if err != nil { + t.Errorf("fail get document by holderID: %v", err) + } + + return DocumentsResponseUnMarshal(t, out.Bytes()) +} +func CmdExGetDocByProof(clientCtx client.Context, t *testing.T, proof string, extraFlags ...string) types.QueryDocumentByProofResponse { + args := []string{proof} + args = append(args, extraFlags...) + args = append(args, network.JSONFlag) + out, err := clitestutil.ExecTestCLICmd(clientCtx, cli.CmdDocumentByProof(), args) + if err != nil { + t.Errorf("fail get document by proof: %v", err) + } + + return DocumentResponseUnMarshal(t, out.Bytes()) +} + +func DocumentResponseUnMarshal(t *testing.T, bs []byte) (res types.QueryDocumentByProofResponse) { + err := json.Unmarshal(bs, &res) + if err != nil { + t.Errorf("unmarshall fail %v", err) + } + return +} +func DocumentsResponseUnMarshal(t *testing.T, bs []byte) (res types.QueryDocumentByHolderIdResponse) { + err := json.Unmarshal(bs, &res) + if err != nil { + t.Errorf("unmarshall fail %v", err) + } + return +} diff --git a/x/document/genesis.go b/x/document/genesis.go new file mode 100644 index 00000000..9de45088 --- /dev/null +++ b/x/document/genesis.go @@ -0,0 +1,31 @@ +package document + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/document/keeper" + "github.com/sharering/shareledger/x/document/types" +) + +// InitGenesis initializes the capability module's state from a provided genesis +// state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + // this line is used by starport scaffolding # genesis/module/init + for _, doc := range genState.Documents { + k.SetDoc(ctx, doc) + } +} + +// ExportGenesis returns the capability module's exported genesis. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() + + // this line is used by starport scaffolding # genesis/module/export + cb := func(doc types.Document) bool { + genesis.Documents = append(genesis.Documents, &doc) + return false + } + + k.IterateDocs(ctx, cb) + + return genesis +} diff --git a/x/document/genesis_test.go b/x/document/genesis_test.go new file mode 100644 index 00000000..13451fec --- /dev/null +++ b/x/document/genesis_test.go @@ -0,0 +1,23 @@ +package document_test + +import ( + "testing" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/document" + "github.com/sharering/shareledger/x/document/types" + "github.com/stretchr/testify/require" +) + +func TestGenesis(t *testing.T) { + genesisState := types.GenesisState{ + // this line is used by starport scaffolding # genesis/test/state + } + + k, ctx := keepertest.DocumentKeeper(t) + document.InitGenesis(ctx, *k, genesisState) + got := document.ExportGenesis(ctx, *k) + require.NotNil(t, got) + + // this line is used by starport scaffolding # genesis/test/assert +} diff --git a/x/document/handler.go b/x/document/handler.go new file mode 100644 index 00000000..7b325066 --- /dev/null +++ b/x/document/handler.go @@ -0,0 +1,38 @@ +package document + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/document/keeper" + "github.com/sharering/shareledger/x/document/types" +) + +// NewHandler ... +func NewHandler(k keeper.Keeper) sdk.Handler { + msgServer := keeper.NewMsgServerImpl(k) + + return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + ctx = ctx.WithEventManager(sdk.NewEventManager()) + + switch msg := msg.(type) { + case *types.MsgCreateDocument: + res, err := msgServer.CreateDocument(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgCreateDocuments: + res, err := msgServer.CreateDocuments(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRevokeDocument: + res, err := msgServer.RevokeDocument(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgUpdateDocument: + res, err := msgServer.UpdateDocument(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + // this line is used by starport scaffolding # 1 + default: + errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) + return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + } + } +} diff --git a/x/document/keeper/document.go b/x/document/keeper/document.go new file mode 100644 index 00000000..2261ae8d --- /dev/null +++ b/x/document/keeper/document.go @@ -0,0 +1,101 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/document/types" +) + +func (k Keeper) SetDoc(ctx sdk.Context, doc *types.Document) { + baseStore := ctx.KVStore(k.storeKey) + detailStore := prefix.NewStore(baseStore, types.KeyPrefix(types.DocDetailKeyPrefix)) + detailStore.Set(doc.GetKeyDetailState(), types.MustMarshalDocDetailState(k.cdc, doc.GetDetailState())) + + basicStore := prefix.NewStore(baseStore, types.KeyPrefix(types.DocBasicKeyPrefix)) + basicStore.Set(doc.GetKeyBasicState(), types.MustMarshalDocBasicState(k.cdc, doc.GetBasicState())) +} + +func (k Keeper) GetDoc(ctx sdk.Context, queryDoc types.Document) (types.Document, bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DocDetailKeyPrefix)) + bz := store.Get(queryDoc.GetKeyDetailState()) + + if len(bz) == 0 { + return types.Document{}, false + } + + ds := types.MustUnmarshalDocDetailState(k.cdc, bz) + + queryDoc.Version = ds.Version + queryDoc.Data = ds.Data + return queryDoc, true +} + +func (k Keeper) GetDocByProof(ctx sdk.Context, queryDoc types.Document) (types.Document, bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DocBasicKeyPrefix)) + bz := store.Get(queryDoc.GetKeyBasicState()) + if len(bz) == 0 { + return types.Document{}, false + } + + bs := types.MustUnmarshalDocBasicState(k.cdc, bz) + queryDoc.Holder = bs.Holder + queryDoc.Issuer = bs.Issuer + + result, found := k.GetDoc(ctx, queryDoc) + if !found { + return types.Document{}, false + } + + return result, true +} + +func (k Keeper) IterateAllDocsOfAHolder(ctx sdk.Context, holderId string, cb func(doc types.Document) bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DocDetailKeyPrefix)) + + queryDoc := types.Document{Holder: holderId} + it := sdk.KVStorePrefixIterator(store, queryDoc.GetKeyDetailOfHolder()) + + defer it.Close() + for ; it.Valid(); it.Next() { + + doc := types.MustMarshalFromDetailRawState(k.cdc, it.Key(), it.Value()) + if cb(*doc) { + break + } + } +} + +func (k Keeper) IterateDocs(ctx sdk.Context, cb func(doc types.Document) bool) { + store := ctx.KVStore(k.storeKey) + + it := sdk.KVStorePrefixIterator(store, types.KeyPrefix(types.DocDetailKeyPrefix)) + + defer it.Close() + for ; it.Valid(); it.Next() { + + doc := types.MustMarshalFromDetailRawState(k.cdc, it.Key(), it.Value()) + if cb(*doc) { + break + } + } +} + +func (k Keeper) IterateAllDocOfHolderByIssuer(ctx sdk.Context, holder string, issuer string, cb func(doc types.Document) bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DocDetailKeyPrefix)) + + queryDoc := types.Document{Holder: holder, Issuer: issuer} + it := sdk.KVStorePrefixIterator(store, queryDoc.GetKeyDetailHolderAndIssuer()) + + defer it.Close() + for ; it.Valid(); it.Next() { + doc := types.MustMarshalFromDetailRawState(k.cdc, it.Key(), it.Value()) + if cb(*doc) { + break + } + } +} + +func (k Keeper) IsIDExist(ctx sdk.Context, id string) bool { + _, found := k.idKeeper.GetFullIDByIDString(ctx, id) + return found +} diff --git a/x/document/keeper/grpc_query.go b/x/document/keeper/grpc_query.go new file mode 100644 index 00000000..f738288f --- /dev/null +++ b/x/document/keeper/grpc_query.go @@ -0,0 +1,7 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/document/types" +) + +var _ types.QueryServer = Keeper{} diff --git a/x/document/keeper/grpc_query_document_by_holder_id.go b/x/document/keeper/grpc_query_document_by_holder_id.go new file mode 100644 index 00000000..03513b05 --- /dev/null +++ b/x/document/keeper/grpc_query_document_by_holder_id.go @@ -0,0 +1,30 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/document/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) DocumentByHolderId(goCtx context.Context, req *types.QueryDocumentByHolderIdRequest) (*types.QueryDocumentByHolderIdResponse, error) { + if req == nil || len(req.Id) == 0 || len(req.Id) > types.MAX_LEN { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Process the query + docs := make([]*types.Document, 0) + + cb := func(doc types.Document) bool { + docs = append(docs, &doc) + return false + } + + k.IterateAllDocsOfAHolder(ctx, req.Id, cb) + + return &types.QueryDocumentByHolderIdResponse{Documents: docs}, nil +} diff --git a/x/document/keeper/grpc_query_document_by_proof.go b/x/document/keeper/grpc_query_document_by_proof.go new file mode 100644 index 00000000..204cca00 --- /dev/null +++ b/x/document/keeper/grpc_query_document_by_proof.go @@ -0,0 +1,27 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/document/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) DocumentByProof(goCtx context.Context, req *types.QueryDocumentByProofRequest) (*types.QueryDocumentByProofResponse, error) { + if req == nil || len(req.Proof) == 0 { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Process the query + queryDoc := types.Document{Proof: req.Proof} + doc, found := k.GetDocByProof(ctx, queryDoc) + if !found { + return nil, status.Error(codes.NotFound, "document not found") + } + + return &types.QueryDocumentByProofResponse{Document: &doc}, nil +} diff --git a/x/document/keeper/grpc_query_document_of_holder_by_issuer.go b/x/document/keeper/grpc_query_document_of_holder_by_issuer.go new file mode 100644 index 00000000..d3075abd --- /dev/null +++ b/x/document/keeper/grpc_query_document_of_holder_by_issuer.go @@ -0,0 +1,30 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/document/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) DocumentOfHolderByIssuer(goCtx context.Context, req *types.QueryDocumentOfHolderByIssuerRequest) (*types.QueryDocumentOfHolderByIssuerResponse, error) { + if req == nil || len(req.Holder) == 0 || len(req.Issuer) == 0 { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Process the query + docs := make([]*types.Document, 0) + + cb := func(doc types.Document) bool { + docs = append(docs, &doc) + return false + } + + k.IterateAllDocOfHolderByIssuer(ctx, req.Holder, req.Issuer, cb) + + return &types.QueryDocumentOfHolderByIssuerResponse{Documents: docs}, nil +} diff --git a/x/document/keeper/keeper.go b/x/document/keeper/keeper.go new file mode 100644 index 00000000..39a149f0 --- /dev/null +++ b/x/document/keeper/keeper.go @@ -0,0 +1,39 @@ +package keeper + +import ( + "fmt" + + "github.com/tendermint/tendermint/libs/log" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/document/types" + idk "github.com/sharering/shareledger/x/id/keeper" +) + +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey sdk.StoreKey + memKey sdk.StoreKey + idKeeper idk.Keeper + } +) + +func NewKeeper( + cdc codec.BinaryCodec, + storeKey, + memKey sdk.StoreKey, + idKeeper idk.Keeper, +) *Keeper { + return &Keeper{ + cdc: cdc, + storeKey: storeKey, + memKey: memKey, + idKeeper: idKeeper, + } +} + +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) +} diff --git a/x/document/keeper/msg_server.go b/x/document/keeper/msg_server.go new file mode 100644 index 00000000..24e2eb67 --- /dev/null +++ b/x/document/keeper/msg_server.go @@ -0,0 +1,17 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/document/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} diff --git a/x/document/keeper/msg_server_create_document.go b/x/document/keeper/msg_server_create_document.go new file mode 100644 index 00000000..6d4343ce --- /dev/null +++ b/x/document/keeper/msg_server_create_document.go @@ -0,0 +1,53 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/document/types" +) + +func (k msgServer) CreateDocument(goCtx context.Context, msg *types.MsgCreateDocument) (*types.MsgCreateDocumentResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + doc := types.Document{ + Issuer: msg.Issuer, + Holder: msg.Holder, + Proof: msg.Proof, + Data: msg.Data, + Version: 0, + } + + // check holder ID exist + holderIDExist := k.IsIDExist(ctx, msg.Holder) + if !holderIDExist { + return nil, sdkerrors.Wrap(types.ErrHolderIDNotExisted, msg.Holder) + } + + // check existing doc + _, found := k.GetDoc(ctx, doc) + if found { + return nil, sdkerrors.Wrap(types.ErrDocExisted, doc.String()) + } + + k.SetDoc(ctx, &doc) + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.EventTypeCreateDoc, + sdk.NewAttribute(types.EventAttrIssuer, msg.Issuer), + sdk.NewAttribute(types.EventAttrHolder, string(msg.Holder)), + sdk.NewAttribute(types.EventAttrProof, string(msg.Proof)), + ), + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Issuer), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeCreateDoc), + ), + }) + + return &types.MsgCreateDocumentResponse{}, nil +} diff --git a/x/document/keeper/msg_server_create_document_in_batch.go b/x/document/keeper/msg_server_create_document_in_batch.go new file mode 100644 index 00000000..276ac98a --- /dev/null +++ b/x/document/keeper/msg_server_create_document_in_batch.go @@ -0,0 +1,59 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/document/types" +) + +func (k msgServer) CreateDocuments(goCtx context.Context, msg *types.MsgCreateDocuments) (*types.MsgCreateDocumentsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + for i := 0; i < len(msg.Holder); i++ { + doc := types.Document{ + Issuer: msg.Issuer, + Holder: msg.Holder[i], + Proof: msg.Proof[i], + Data: msg.Data[i], + Version: 0, + } + + // check holder ID exist + holderIDExist := k.IsIDExist(ctx, msg.Holder[i]) + if !holderIDExist { + return nil, sdkerrors.Wrap(types.ErrHolderIDNotExisted, msg.Holder[i]) + } + + // check existing doc + _, found := k.GetDoc(ctx, doc) + if found { + return nil, sdkerrors.Wrap(types.ErrDocExisted, doc.String()) + } + + k.SetDoc(ctx, &doc) + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeCreateDoc, + sdk.NewAttribute(types.EventAttrIssuer, msg.Issuer), + sdk.NewAttribute(types.EventAttrHolder, string(msg.Holder[i])), + sdk.NewAttribute(types.EventAttrProof, string(msg.Proof[i])), + sdk.NewAttribute(types.EventAttrData, string(msg.Data[i])), + ), + ) + } + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Issuer), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeCreateDoc), + ), + ) + + return &types.MsgCreateDocumentsResponse{}, nil +} diff --git a/x/document/keeper/msg_server_revoke_document.go b/x/document/keeper/msg_server_revoke_document.go new file mode 100644 index 00000000..e1e897a7 --- /dev/null +++ b/x/document/keeper/msg_server_revoke_document.go @@ -0,0 +1,46 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/document/types" +) + +func (k msgServer) RevokeDocument(goCtx context.Context, msg *types.MsgRevokeDocument) (*types.MsgRevokeDocumentResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + queryDoc := types.Document{ + Issuer: msg.Issuer, + Holder: msg.Holder, + Proof: msg.Proof, + } + + // check existing doc + existingDoc, found := k.GetDocByProof(ctx, queryDoc) + if !found { + return nil, sdkerrors.Wrap(types.ErrDocNotExisted, existingDoc.String()) + } + + existingDoc.Version = int32(types.DocRevokeFlag) + k.SetDoc(ctx, &existingDoc) + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.EventTypeRevokeDoc, + sdk.NewAttribute(types.EventAttrIssuer, msg.Issuer), + sdk.NewAttribute(types.EventAttrHolder, string(msg.Holder)), + sdk.NewAttribute(types.EventAttrProof, string(msg.Proof)), + ), + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Issuer), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeRevokeDoc), + ), + }) + + return &types.MsgRevokeDocumentResponse{}, nil +} diff --git a/x/document/keeper/msg_server_test.go b/x/document/keeper/msg_server_test.go new file mode 100644 index 00000000..d630ccb4 --- /dev/null +++ b/x/document/keeper/msg_server_test.go @@ -0,0 +1,16 @@ +package keeper_test + +import ( + "context" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/document/keeper" + "github.com/sharering/shareledger/x/document/types" +) + +func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) { + k, ctx := keepertest.DocumentKeeper(t) + return keeper.NewMsgServerImpl(*k), sdk.WrapSDKContext(ctx) +} diff --git a/x/document/keeper/msg_server_update_document.go b/x/document/keeper/msg_server_update_document.go new file mode 100644 index 00000000..bc87d1d9 --- /dev/null +++ b/x/document/keeper/msg_server_update_document.go @@ -0,0 +1,58 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/document/types" +) + +func (k msgServer) UpdateDocument(goCtx context.Context, msg *types.MsgUpdateDocument) (*types.MsgUpdateDocumentResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + queryDoc := types.Document{ + Issuer: msg.Issuer, + Holder: msg.Holder, + Proof: msg.Proof, + Data: msg.Data, + Version: 0, + } + + existingDoc, found := k.GetDocByProof(ctx, queryDoc) + if !found { + return nil, sdkerrors.Wrap(types.ErrDocNotExisted, queryDoc.String()) + } + + if existingDoc.Holder != msg.Holder || existingDoc.Issuer != msg.Issuer { + return nil, sdkerrors.Wrap(types.ErrDocNotExisted, queryDoc.String()) + } + + if existingDoc.Version == int32(types.DocRevokeFlag) { + return nil, sdkerrors.Wrap(types.ErrDocRevoked, queryDoc.String()) + } + + existingDoc.Data = msg.Data + existingDoc.Version = existingDoc.Version + 1 + + k.SetDoc(ctx, &existingDoc) + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.EventTypeUpdateDoc, + sdk.NewAttribute(types.EventAttrIssuer, msg.Issuer), + sdk.NewAttribute(types.EventAttrHolder, msg.Holder), + sdk.NewAttribute(types.EventAttrProof, msg.Proof), + sdk.NewAttribute(types.EventAttrData, msg.Data), + ), + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Issuer), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeUpdateDoc), + ), + }) + + return &types.MsgUpdateDocumentResponse{}, nil +} diff --git a/x/document/module.go b/x/document/module.go new file mode 100644 index 00000000..bd16c0d5 --- /dev/null +++ b/x/document/module.go @@ -0,0 +1,169 @@ +package document + +import ( + "context" + "encoding/json" + "fmt" + + // this line is used by starport scaffolding # 1 + + "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/sharering/shareledger/x/document/client/cli" + "github.com/sharering/shareledger/x/document/keeper" + "github.com/sharering/shareledger/x/document/types" +) + +var ( + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} +) + +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- + +// AppModuleBasic implements the AppModuleBasic interface for the capability module. +type AppModuleBasic struct { + cdc codec.BinaryCodec +} + +func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the capability module's name. +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +// RegisterInterfaces registers the module's interface types +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) +} + +// DefaultGenesis returns the capability module's default genesis state. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) +} + +// ValidateGenesis performs genesis state validation for the capability module. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) + } + return genState.Validate() +} + +// RegisterRESTRoutes registers the capability module's REST service handlers. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { +} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + // this line is used by starport scaffolding # 2 + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) +} + +// GetTxCmd returns the capability module's root tx command. +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() +} + +// GetQueryCmd returns the capability module's root query command. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(types.StoreKey) +} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- + +// AppModule implements the AppModule interface for the capability module. +type AppModule struct { + AppModuleBasic + + keeper keeper.Keeper +} + +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { + return AppModule{ + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, + } +} + +// Name returns the capability module's name. +func (am AppModule) Name() string { + return am.AppModuleBasic.Name() +} + +// Route returns the capability module's message routing key. +func (am AppModule) Route() sdk.Route { + return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) +} + +// QuerierRoute returns the capability module's query routing key. +func (AppModule) QuerierRoute() string { return types.QuerierRoute } + +// LegacyQuerierHandler returns the capability module's Querier. +func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { + return nil +} + +// RegisterServices registers a GRPC query service to respond to the +// module-specific GRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) +} + +// RegisterInvariants registers the capability module's invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the capability module's genesis initialization It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, am.keeper, genState) + + return []abci.ValidatorUpdate{} +} + +// ExportGenesis returns the capability 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) + return cdc.MustMarshalJSON(genState) +} + +// ConsensusVersion implements ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 2 } + +// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. +func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} + +// EndBlock executes all ABCI EndBlock logic respective to the capability module. It +// returns no validator updates. +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} +} diff --git a/x/document/types/codec.go b/x/document/types/codec.go new file mode 100644 index 00000000..990e6430 --- /dev/null +++ b/x/document/types/codec.go @@ -0,0 +1,39 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgCreateDocument{}, "document/CreateDocument", nil) + cdc.RegisterConcrete(&MsgCreateDocuments{}, "document/CreateDocuments", nil) + cdc.RegisterConcrete(&MsgRevokeDocument{}, "document/RevokeDocument", nil) + cdc.RegisterConcrete(&MsgUpdateDocument{}, "document/UpdateDocument", nil) + // this line is used by starport scaffolding # 2 +} + +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCreateDocument{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCreateDocuments{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgRevokeDocument{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgUpdateDocument{}, + ) + // this line is used by starport scaffolding # 3 + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} + +var ( + amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) +) diff --git a/x/document/types/doc_basic_state.pb.go b/x/document/types/doc_basic_state.pb.go new file mode 100644 index 00000000..f4f997a3 --- /dev/null +++ b/x/document/types/doc_basic_state.pb.go @@ -0,0 +1,367 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: document/doc_basic_state.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type DocBasicState struct { + Holder string `protobuf:"bytes,1,opt,name=holder,proto3" json:"holder,omitempty"` + Issuer string `protobuf:"bytes,2,opt,name=issuer,proto3" json:"issuer,omitempty"` +} + +func (m *DocBasicState) Reset() { *m = DocBasicState{} } +func (m *DocBasicState) String() string { return proto.CompactTextString(m) } +func (*DocBasicState) ProtoMessage() {} +func (*DocBasicState) Descriptor() ([]byte, []int) { + return fileDescriptor_0f86c5413bd85096, []int{0} +} +func (m *DocBasicState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DocBasicState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DocBasicState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DocBasicState) XXX_Merge(src proto.Message) { + xxx_messageInfo_DocBasicState.Merge(m, src) +} +func (m *DocBasicState) XXX_Size() int { + return m.Size() +} +func (m *DocBasicState) XXX_DiscardUnknown() { + xxx_messageInfo_DocBasicState.DiscardUnknown(m) +} + +var xxx_messageInfo_DocBasicState proto.InternalMessageInfo + +func (m *DocBasicState) GetHolder() string { + if m != nil { + return m.Holder + } + return "" +} + +func (m *DocBasicState) GetIssuer() string { + if m != nil { + return m.Issuer + } + return "" +} + +func init() { + proto.RegisterType((*DocBasicState)(nil), "shareledger.document.DocBasicState") +} + +func init() { proto.RegisterFile("document/doc_basic_state.proto", fileDescriptor_0f86c5413bd85096) } + +var fileDescriptor_0f86c5413bd85096 = []byte{ + // 183 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xc9, 0x4f, 0x2e, + 0xcd, 0x4d, 0xcd, 0x2b, 0xd1, 0x4f, 0xc9, 0x4f, 0x8e, 0x4f, 0x4a, 0x2c, 0xce, 0x4c, 0x8e, 0x2f, + 0x2e, 0x49, 0x2c, 0x49, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x29, 0xce, 0x48, 0x2c, + 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x83, 0xa9, 0x55, 0xb2, 0xe7, 0xe2, 0x75, 0xc9, + 0x4f, 0x76, 0x02, 0xa9, 0x0e, 0x06, 0x29, 0x16, 0x12, 0xe3, 0x62, 0xcb, 0xc8, 0xcf, 0x49, 0x49, + 0x2d, 0x92, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0xf2, 0x40, 0xe2, 0x99, 0xc5, 0xc5, 0xa5, + 0xa9, 0x45, 0x12, 0x4c, 0x10, 0x71, 0x08, 0xcf, 0xc9, 0xfb, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, + 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, + 0x8f, 0xe5, 0x18, 0xa2, 0x0c, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, + 0xc1, 0x76, 0x17, 0x65, 0xe6, 0xa5, 0xeb, 0x23, 0xb9, 0x42, 0xbf, 0x42, 0x1f, 0xee, 0xe6, 0x92, + 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x53, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x12, + 0x9f, 0xee, 0xec, 0xcc, 0x00, 0x00, 0x00, +} + +func (m *DocBasicState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DocBasicState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DocBasicState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Issuer) > 0 { + i -= len(m.Issuer) + copy(dAtA[i:], m.Issuer) + i = encodeVarintDocBasicState(dAtA, i, uint64(len(m.Issuer))) + i-- + dAtA[i] = 0x12 + } + if len(m.Holder) > 0 { + i -= len(m.Holder) + copy(dAtA[i:], m.Holder) + i = encodeVarintDocBasicState(dAtA, i, uint64(len(m.Holder))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintDocBasicState(dAtA []byte, offset int, v uint64) int { + offset -= sovDocBasicState(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *DocBasicState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Holder) + if l > 0 { + n += 1 + l + sovDocBasicState(uint64(l)) + } + l = len(m.Issuer) + if l > 0 { + n += 1 + l + sovDocBasicState(uint64(l)) + } + return n +} + +func sovDocBasicState(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozDocBasicState(x uint64) (n int) { + return sovDocBasicState(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *DocBasicState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocBasicState + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: DocBasicState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DocBasicState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Holder", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocBasicState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDocBasicState + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDocBasicState + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Holder = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocBasicState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDocBasicState + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDocBasicState + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipDocBasicState(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthDocBasicState + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipDocBasicState(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocBasicState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocBasicState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocBasicState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthDocBasicState + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupDocBasicState + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthDocBasicState + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthDocBasicState = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowDocBasicState = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupDocBasicState = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/document/types/doc_detail_state.pb.go b/x/document/types/doc_detail_state.pb.go new file mode 100644 index 00000000..b2b8993b --- /dev/null +++ b/x/document/types/doc_detail_state.pb.go @@ -0,0 +1,351 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: document/doc_detail_state.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type DocDetailState struct { + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + Version int32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` +} + +func (m *DocDetailState) Reset() { *m = DocDetailState{} } +func (m *DocDetailState) String() string { return proto.CompactTextString(m) } +func (*DocDetailState) ProtoMessage() {} +func (*DocDetailState) Descriptor() ([]byte, []int) { + return fileDescriptor_31a015b6bc14fb7e, []int{0} +} +func (m *DocDetailState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DocDetailState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DocDetailState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DocDetailState) XXX_Merge(src proto.Message) { + xxx_messageInfo_DocDetailState.Merge(m, src) +} +func (m *DocDetailState) XXX_Size() int { + return m.Size() +} +func (m *DocDetailState) XXX_DiscardUnknown() { + xxx_messageInfo_DocDetailState.DiscardUnknown(m) +} + +var xxx_messageInfo_DocDetailState proto.InternalMessageInfo + +func (m *DocDetailState) GetData() string { + if m != nil { + return m.Data + } + return "" +} + +func (m *DocDetailState) GetVersion() int32 { + if m != nil { + return m.Version + } + return 0 +} + +func init() { + proto.RegisterType((*DocDetailState)(nil), "shareledger.document.DocDetailState") +} + +func init() { proto.RegisterFile("document/doc_detail_state.proto", fileDescriptor_31a015b6bc14fb7e) } + +var fileDescriptor_31a015b6bc14fb7e = []byte{ + // 188 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xc9, 0x4f, 0x2e, + 0xcd, 0x4d, 0xcd, 0x2b, 0xd1, 0x4f, 0xc9, 0x4f, 0x8e, 0x4f, 0x49, 0x2d, 0x49, 0xcc, 0xcc, 0x89, + 0x2f, 0x2e, 0x49, 0x2c, 0x49, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x29, 0xce, 0x48, + 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x83, 0x29, 0x56, 0xb2, 0xe3, 0xe2, 0x73, + 0xc9, 0x4f, 0x76, 0x01, 0x2b, 0x0f, 0x06, 0xa9, 0x16, 0x12, 0xe2, 0x62, 0x49, 0x49, 0x2c, 0x49, + 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0xb3, 0x85, 0x24, 0xb8, 0xd8, 0xcb, 0x52, 0x8b, + 0x8a, 0x33, 0xf3, 0xf3, 0x24, 0x98, 0x14, 0x18, 0x35, 0x58, 0x83, 0x60, 0x5c, 0x27, 0xef, 0x13, + 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, + 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x4c, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, + 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x07, 0x5b, 0x5d, 0x94, 0x99, 0x97, 0xae, 0x8f, 0xe4, 0x08, 0xfd, + 0x0a, 0x7d, 0xb8, 0x9b, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x2e, 0x35, 0x06, 0x04, + 0x00, 0x00, 0xff, 0xff, 0x78, 0xd5, 0x1e, 0x35, 0xcc, 0x00, 0x00, 0x00, +} + +func (m *DocDetailState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DocDetailState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DocDetailState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Version != 0 { + i = encodeVarintDocDetailState(dAtA, i, uint64(m.Version)) + i-- + dAtA[i] = 0x10 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintDocDetailState(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintDocDetailState(dAtA []byte, offset int, v uint64) int { + offset -= sovDocDetailState(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *DocDetailState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovDocDetailState(uint64(l)) + } + if m.Version != 0 { + n += 1 + sovDocDetailState(uint64(m.Version)) + } + return n +} + +func sovDocDetailState(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozDocDetailState(x uint64) (n int) { + return sovDocDetailState(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *DocDetailState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocDetailState + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: DocDetailState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DocDetailState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocDetailState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDocDetailState + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDocDetailState + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocDetailState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipDocDetailState(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthDocDetailState + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipDocDetailState(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocDetailState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocDetailState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocDetailState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthDocDetailState + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupDocDetailState + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthDocDetailState + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthDocDetailState = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowDocDetailState = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupDocDetailState = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/document/types/document.go b/x/document/types/document.go new file mode 100644 index 00000000..e28fddf7 --- /dev/null +++ b/x/document/types/document.go @@ -0,0 +1,111 @@ +package types + +import ( + "strings" + + "github.com/cosmos/cosmos-sdk/codec" +) + +func (d Document) GetDetailState() *DocDetailState { + ds := DocDetailState{d.Data, d.Version} + return &ds +} + +// holder/issuer/proof +func (d Document) GetKeyDetailState() []byte { + key := []byte{} + + key = append(key, []byte(Separator)...) + key = append(key, []byte(d.Issuer)...) + + key = append(key, []byte(Separator)...) + key = append(key, []byte(d.Proof)...) + + key = append([]byte(d.Holder), key...) + + return key +} + +// holder +func (d Document) GetKeyDetailOfHolder() []byte { + key := d.Holder + + return KeyPrefix(key) +} + +func (d Document) GetKeyDetailHolderAndIssuer() []byte { + key := []byte{} + + key = append(key, []byte(Separator)...) + key = append(key, []byte(d.Issuer)...) + + key = append([]byte(d.Holder), key...) + + return key +} + +func MustMarshalDocDetailState(cdc codec.BinaryCodec, ds *DocDetailState) []byte { + return cdc.MustMarshalLengthPrefixed(ds) +} + +func MustUnmarshalDocDetailState(cdc codec.BinaryCodec, value []byte) *DocDetailState { + ds := DocDetailState{} + + err := cdc.UnmarshalLengthPrefixed(value, &ds) + if err != nil { + panic(err) + } + + return &ds +} + +func (d Document) GetBasicState() *DocBasicState { + ds := DocBasicState{Holder: d.Holder, Issuer: d.Issuer} + return &ds +} + +// proof +func (d Document) GetKeyBasicState() []byte { + key := d.Proof + + return KeyPrefix(key) +} + +func MustMarshalDocBasicState(cdc codec.BinaryCodec, bs *DocBasicState) []byte { + return cdc.MustMarshalLengthPrefixed(bs) +} + +func MustUnmarshalDocBasicState(cdc codec.BinaryCodec, value []byte) *DocBasicState { + bs := DocBasicState{} + + err := cdc.UnmarshalLengthPrefixed(value, &bs) + if err != nil { + panic(err) + } + + return &bs +} + +// holder/issuer/proof +func MustMarshalFromDetailRawState(cdc codec.BinaryCodec, key, value []byte) *Document { + sKey := string(key) + sKeyArr := strings.Split(sKey, Separator) + + doc := Document{} + + // issuer := sdk.AccAddress(sKeyArr[1]) + // // if err != nil { + // // panic(err) + // // } + + doc.Holder = sKeyArr[0] + doc.Proof = sKeyArr[2] + doc.Issuer = sKeyArr[1] + // doc.Issuer = issuer.String() + + ds := MustUnmarshalDocDetailState(cdc, value) + doc.Data = ds.Data + doc.Version = ds.Version + + return &doc +} diff --git a/x/document/types/document.pb.go b/x/document/types/document.pb.go new file mode 100644 index 00000000..fa3d10a5 --- /dev/null +++ b/x/document/types/document.pb.go @@ -0,0 +1,506 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: document/document.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Document struct { + Holder string `protobuf:"bytes,1,opt,name=holder,proto3" json:"holder,omitempty"` + Issuer string `protobuf:"bytes,2,opt,name=issuer,proto3" json:"issuer,omitempty"` + Proof string `protobuf:"bytes,3,opt,name=proof,proto3" json:"proof,omitempty"` + Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + Version int32 `protobuf:"varint,5,opt,name=version,proto3" json:"version,omitempty"` +} + +func (m *Document) Reset() { *m = Document{} } +func (m *Document) String() string { return proto.CompactTextString(m) } +func (*Document) ProtoMessage() {} +func (*Document) Descriptor() ([]byte, []int) { + return fileDescriptor_d73f96f4a4450761, []int{0} +} +func (m *Document) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Document) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Document.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Document) XXX_Merge(src proto.Message) { + xxx_messageInfo_Document.Merge(m, src) +} +func (m *Document) XXX_Size() int { + return m.Size() +} +func (m *Document) XXX_DiscardUnknown() { + xxx_messageInfo_Document.DiscardUnknown(m) +} + +var xxx_messageInfo_Document proto.InternalMessageInfo + +func (m *Document) GetHolder() string { + if m != nil { + return m.Holder + } + return "" +} + +func (m *Document) GetIssuer() string { + if m != nil { + return m.Issuer + } + return "" +} + +func (m *Document) GetProof() string { + if m != nil { + return m.Proof + } + return "" +} + +func (m *Document) GetData() string { + if m != nil { + return m.Data + } + return "" +} + +func (m *Document) GetVersion() int32 { + if m != nil { + return m.Version + } + return 0 +} + +func init() { + proto.RegisterType((*Document)(nil), "shareledger.document.Document") +} + +func init() { proto.RegisterFile("document/document.proto", fileDescriptor_d73f96f4a4450761) } + +var fileDescriptor_d73f96f4a4450761 = []byte{ + // 211 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4f, 0xc9, 0x4f, 0x2e, + 0xcd, 0x4d, 0xcd, 0x2b, 0xd1, 0x87, 0x31, 0xf4, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0x44, 0x8a, + 0x33, 0x12, 0x8b, 0x52, 0x73, 0x52, 0x53, 0xd2, 0x53, 0x8b, 0xf4, 0x60, 0x72, 0x4a, 0x75, 0x5c, + 0x1c, 0x2e, 0x50, 0xb6, 0x90, 0x18, 0x17, 0x5b, 0x46, 0x7e, 0x4e, 0x4a, 0x6a, 0x91, 0x04, 0xa3, + 0x02, 0xa3, 0x06, 0x67, 0x10, 0x94, 0x07, 0x12, 0xcf, 0x2c, 0x2e, 0x2e, 0x4d, 0x2d, 0x92, 0x60, + 0x82, 0x88, 0x43, 0x78, 0x42, 0x22, 0x5c, 0xac, 0x05, 0x45, 0xf9, 0xf9, 0x69, 0x12, 0xcc, 0x60, + 0x61, 0x08, 0x47, 0x48, 0x88, 0x8b, 0x25, 0x25, 0xb1, 0x24, 0x51, 0x82, 0x05, 0x2c, 0x08, 0x66, + 0x0b, 0x49, 0x70, 0xb1, 0x97, 0xa5, 0x16, 0x15, 0x67, 0xe6, 0xe7, 0x49, 0xb0, 0x2a, 0x30, 0x6a, + 0xb0, 0x06, 0xc1, 0xb8, 0x4e, 0xde, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, + 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, + 0x65, 0x98, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x76, 0x7a, 0x51, + 0x66, 0x5e, 0xba, 0x3e, 0x92, 0x27, 0xf4, 0x2b, 0xe0, 0x5e, 0xd4, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, + 0x4e, 0x62, 0x03, 0xfb, 0xd4, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xc2, 0x99, 0xd1, 0x8e, 0x04, + 0x01, 0x00, 0x00, +} + +func (m *Document) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Document) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Document) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Version != 0 { + i = encodeVarintDocument(dAtA, i, uint64(m.Version)) + i-- + dAtA[i] = 0x28 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintDocument(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x22 + } + if len(m.Proof) > 0 { + i -= len(m.Proof) + copy(dAtA[i:], m.Proof) + i = encodeVarintDocument(dAtA, i, uint64(len(m.Proof))) + i-- + dAtA[i] = 0x1a + } + if len(m.Issuer) > 0 { + i -= len(m.Issuer) + copy(dAtA[i:], m.Issuer) + i = encodeVarintDocument(dAtA, i, uint64(len(m.Issuer))) + i-- + dAtA[i] = 0x12 + } + if len(m.Holder) > 0 { + i -= len(m.Holder) + copy(dAtA[i:], m.Holder) + i = encodeVarintDocument(dAtA, i, uint64(len(m.Holder))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintDocument(dAtA []byte, offset int, v uint64) int { + offset -= sovDocument(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Document) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Holder) + if l > 0 { + n += 1 + l + sovDocument(uint64(l)) + } + l = len(m.Issuer) + if l > 0 { + n += 1 + l + sovDocument(uint64(l)) + } + l = len(m.Proof) + if l > 0 { + n += 1 + l + sovDocument(uint64(l)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovDocument(uint64(l)) + } + if m.Version != 0 { + n += 1 + sovDocument(uint64(m.Version)) + } + return n +} + +func sovDocument(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozDocument(x uint64) (n int) { + return sovDocument(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Document) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocument + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: Document: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Document: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Holder", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocument + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDocument + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDocument + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Holder = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocument + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDocument + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDocument + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocument + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDocument + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDocument + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proof = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocument + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDocument + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDocument + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDocument + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipDocument(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthDocument + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipDocument(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocument + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocument + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDocument + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthDocument + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupDocument + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthDocument + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthDocument = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowDocument = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupDocument = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/document/types/errors.go b/x/document/types/errors.go new file mode 100644 index 00000000..b01a1284 --- /dev/null +++ b/x/document/types/errors.go @@ -0,0 +1,17 @@ +package types + +// DONTCOVER + +import ( + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +// x/document module sentinel errors +var ( + ErrDocNotExisted = sdkerrors.Register(ModuleName, 41, "Doc does not exist") + ErrDocExisted = sdkerrors.Register(ModuleName, 42, "Doc existed") + ErrDocInvalidData = sdkerrors.Register(ModuleName, 43, "Invalid data") + ErrorNotIssuer = sdkerrors.Register(ModuleName, 44, "Not doc issuer") + ErrDocRevoked = sdkerrors.Register(ModuleName, 45, "Doc already revoked") + ErrHolderIDNotExisted = sdkerrors.Register(ModuleName, 46, "Holder ID not exist") +) diff --git a/x/document/types/events.go b/x/document/types/events.go new file mode 100644 index 00000000..2dd5e0c6 --- /dev/null +++ b/x/document/types/events.go @@ -0,0 +1,12 @@ +package types + +const ( + EventTypeCreateDoc = "create_doc" + EventTypeUpdateDoc = "update_doc" + EventTypeRevokeDoc = "revoke_doc" + + EventAttrHolder = "holder" + EventAttrProof = "proof" + EventAttrIssuer = "issuer" + EventAttrData = "data" +) diff --git a/x/document/types/expected_keepers.go b/x/document/types/expected_keepers.go new file mode 100644 index 00000000..ab1254f4 --- /dev/null +++ b/x/document/types/expected_keepers.go @@ -0,0 +1 @@ +package types diff --git a/x/document/types/genesis.go b/x/document/types/genesis.go new file mode 100644 index 00000000..4d36ee93 --- /dev/null +++ b/x/document/types/genesis.go @@ -0,0 +1,22 @@ +package types + +// this line is used by starport scaffolding # genesis/types/import + +// DefaultIndex is the default capability global index +const DefaultIndex uint64 = 1 + +// DefaultGenesis returns the default Capability genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{ + // this line is used by starport scaffolding # genesis/types/default + Documents: make([]*Document, 0), + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + // this line is used by starport scaffolding # genesis/types/validate + + return nil +} diff --git a/x/document/types/genesis.pb.go b/x/document/types/genesis.pb.go new file mode 100644 index 00000000..31d6aaad --- /dev/null +++ b/x/document/types/genesis.pb.go @@ -0,0 +1,331 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: document/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the document module's genesis state. +type GenesisState struct { + // this line is used by starport scaffolding # genesis/proto/state + Documents []*Document `protobuf:"bytes,1,rep,name=documents,proto3" json:"documents,omitempty"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_a054040d168a4996, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetDocuments() []*Document { + if m != nil { + return m.Documents + } + return nil +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "shareledger.document.GenesisState") +} + +func init() { proto.RegisterFile("document/genesis.proto", fileDescriptor_a054040d168a4996) } + +var fileDescriptor_a054040d168a4996 = []byte{ + // 193 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4b, 0xc9, 0x4f, 0x2e, + 0xcd, 0x4d, 0xcd, 0x2b, 0xd1, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, + 0x2f, 0xc9, 0x17, 0x12, 0x29, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, + 0x83, 0xa9, 0x91, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x2b, 0xd0, 0x07, 0xb1, 0x20, 0x6a, 0xa5, + 0xc4, 0xe1, 0x66, 0xc0, 0x18, 0x10, 0x09, 0xa5, 0x20, 0x2e, 0x1e, 0x77, 0x88, 0xa9, 0xc1, 0x25, + 0x89, 0x25, 0xa9, 0x42, 0x4e, 0x5c, 0x9c, 0x30, 0x15, 0xc5, 0x12, 0x8c, 0x0a, 0xcc, 0x1a, 0xdc, + 0x46, 0x72, 0x7a, 0xd8, 0x2c, 0xd2, 0x73, 0x81, 0x32, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x0c, + 0x42, 0x68, 0x73, 0xf2, 0x3e, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, + 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xc3, + 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xb0, 0xa1, 0x45, 0x99, 0x79, + 0xe9, 0xfa, 0x48, 0xc6, 0xeb, 0x57, 0xc0, 0x1d, 0xa8, 0x5f, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, + 0x06, 0x76, 0xa7, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x35, 0xbe, 0xbc, 0x86, 0x06, 0x01, 0x00, + 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Documents) > 0 { + for iNdEx := len(m.Documents) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Documents[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Documents) > 0 { + for _, e := range m.Documents { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Documents", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Documents = append(m.Documents, &Document{}) + if err := m.Documents[len(m.Documents)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/document/types/genesis_test.go b/x/document/types/genesis_test.go new file mode 100644 index 00000000..87681927 --- /dev/null +++ b/x/document/types/genesis_test.go @@ -0,0 +1,32 @@ +package types_test + +import ( + "testing" + + "github.com/sharering/shareledger/x/document/types" + "github.com/stretchr/testify/require" +) + +func TestGenesisState_Validate(t *testing.T) { + for _, tc := range []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + // this line is used by starport scaffolding # types/genesis/testcase + } { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/x/document/types/keys.go b/x/document/types/keys.go new file mode 100644 index 00000000..8c7c7036 --- /dev/null +++ b/x/document/types/keys.go @@ -0,0 +1,36 @@ +package types + +const ( + // ModuleName defines the module name + ModuleName = "document" + + // StoreKey defines the primary module store key + StoreKey = ModuleName + + // RouterKey is the message route for slashing + RouterKey = ModuleName + + // QuerierRoute defines the module's query routing key + QuerierRoute = ModuleName + + // MemStoreKey defines the in-memory store key + MemStoreKey = "mem_document" + + TypeMsgCreateDoc = "create_doc" + TypeMsgCreateDocs = "create_docs" + TypeMsgUpdateDoc = "update_doc" + TypeMsgRevokeDoc = "revoke_doc" + + DocDetailKeyPrefix = "DocumentDetail/" + DocBasicKeyPrefix = "DocumentBasic/" + + DocRevokeFlag = 0xffff + Separator = "/" + + MAX_LEN = 64 + MAX_LEN_BATCH = 20 +) + +func KeyPrefix(p string) []byte { + return []byte(p) +} diff --git a/x/document/types/message_create_document.go b/x/document/types/message_create_document.go new file mode 100644 index 00000000..20c0c51d --- /dev/null +++ b/x/document/types/message_create_document.go @@ -0,0 +1,59 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCreateDocument{} + +func NewMsgCreateDocument(data string, holder string, issuer string, proof string) *MsgCreateDocument { + return &MsgCreateDocument{ + Data: data, + Holder: holder, + Issuer: issuer, + Proof: proof, + } +} + +func (msg *MsgCreateDocument) Route() string { + return RouterKey +} + +func (msg *MsgCreateDocument) Type() string { + return TypeMsgCreateDoc +} + +func (msg *MsgCreateDocument) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgCreateDocument) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCreateDocument) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + if len(msg.Holder) > MAX_LEN || len(msg.Holder) == 0 { + return ErrDocInvalidData + } + + if len(msg.Proof) > MAX_LEN || len(msg.Proof) == 0 { + return ErrDocInvalidData + } + + if len(msg.Data) > MAX_LEN { + return ErrDocInvalidData + } + + return nil +} diff --git a/x/document/types/message_create_document_test.go b/x/document/types/message_create_document_test.go new file mode 100644 index 00000000..9f3e1865 --- /dev/null +++ b/x/document/types/message_create_document_test.go @@ -0,0 +1,43 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgCreateDocument_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgCreateDocument + err error + }{ + { + name: "invalid address", + msg: MsgCreateDocument{ + Issuer: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgCreateDocument{ + Data: "data", + Holder: "holder", + Issuer: sample.AccAddress(), + Proof: "proof", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/document/types/message_create_documents.go b/x/document/types/message_create_documents.go new file mode 100644 index 00000000..3d78701e --- /dev/null +++ b/x/document/types/message_create_documents.go @@ -0,0 +1,59 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCreateDocuments{} + +func NewMsgCreateDocuments(data []string, holder []string, issuer string, proof []string) *MsgCreateDocuments { + return &MsgCreateDocuments{ + Data: data, + Holder: holder, + Issuer: issuer, + Proof: proof, + } +} + +func (msg *MsgCreateDocuments) Route() string { + return RouterKey +} + +func (msg *MsgCreateDocuments) Type() string { + return TypeMsgCreateDocs +} + +func (msg *MsgCreateDocuments) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgCreateDocuments) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCreateDocuments) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + // check len + maxLen := len(msg.Holder) + if maxLen == 0 || maxLen > MAX_LEN_BATCH || maxLen != len(msg.Proof) || maxLen != len(msg.Data) { + return ErrDocInvalidData + } + + for i := 0; i < maxLen; i++ { + if len(msg.Holder[i]) > MAX_LEN || len(msg.Data[i]) > MAX_LEN || len(msg.Proof[i]) > MAX_LEN { + return ErrDocInvalidData + } + } + + return nil +} diff --git a/x/document/types/message_create_documents_test.go b/x/document/types/message_create_documents_test.go new file mode 100644 index 00000000..e3b7a46d --- /dev/null +++ b/x/document/types/message_create_documents_test.go @@ -0,0 +1,43 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgCreateDocuments_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgCreateDocuments + err error + }{ + { + name: "invalid address", + msg: MsgCreateDocuments{ + Issuer: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgCreateDocuments{ + Data: []string{"data"}, + Holder: []string{sample.AccAddress()}, + Issuer: sample.AccAddress(), + Proof: []string{"proof"}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/document/types/message_revoke_document.go b/x/document/types/message_revoke_document.go new file mode 100644 index 00000000..3cd61bd6 --- /dev/null +++ b/x/document/types/message_revoke_document.go @@ -0,0 +1,54 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgRevokeDocument{} + +func NewMsgRevokeDocument(holder string, issuer string, proof string) *MsgRevokeDocument { + return &MsgRevokeDocument{ + Holder: holder, + Issuer: issuer, + Proof: proof, + } +} + +func (msg *MsgRevokeDocument) Route() string { + return RouterKey +} + +func (msg *MsgRevokeDocument) Type() string { + return TypeMsgRevokeDoc +} + +func (msg *MsgRevokeDocument) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgRevokeDocument) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgRevokeDocument) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + if len(msg.Holder) > MAX_LEN || len(msg.Holder) == 0 { + return ErrDocInvalidData + } + + if len(msg.Proof) > MAX_LEN || len(msg.Proof) == 0 { + return ErrDocInvalidData + } + + return nil +} diff --git a/x/document/types/message_revoke_document_test.go b/x/document/types/message_revoke_document_test.go new file mode 100644 index 00000000..6c9974b1 --- /dev/null +++ b/x/document/types/message_revoke_document_test.go @@ -0,0 +1,42 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgRevokeDocument_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgRevokeDocument + err error + }{ + { + name: "invalid address", + msg: MsgRevokeDocument{ + Issuer: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgRevokeDocument{ + Holder: "holder", + Issuer: sample.AccAddress(), + Proof: "proof", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/document/types/message_update_document.go b/x/document/types/message_update_document.go new file mode 100644 index 00000000..fb8beb22 --- /dev/null +++ b/x/document/types/message_update_document.go @@ -0,0 +1,59 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgUpdateDocument{} + +func NewMsgUpdateDocument(data string, holder string, issuer string, proof string) *MsgUpdateDocument { + return &MsgUpdateDocument{ + Data: data, + Holder: holder, + Issuer: issuer, + Proof: proof, + } +} + +func (msg *MsgUpdateDocument) Route() string { + return RouterKey +} + +func (msg *MsgUpdateDocument) Type() string { + return TypeMsgUpdateDoc +} + +func (msg *MsgUpdateDocument) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgUpdateDocument) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgUpdateDocument) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Issuer) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + if len(msg.Holder) > MAX_LEN || len(msg.Holder) == 0 { + return ErrDocInvalidData + } + + if len(msg.Proof) > MAX_LEN || len(msg.Proof) == 0 { + return ErrDocInvalidData + } + + if len(msg.Data) > MAX_LEN { + return ErrDocInvalidData + } + + return nil +} diff --git a/x/document/types/message_update_document_test.go b/x/document/types/message_update_document_test.go new file mode 100644 index 00000000..39e278e9 --- /dev/null +++ b/x/document/types/message_update_document_test.go @@ -0,0 +1,43 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgUpdateDocument_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgUpdateDocument + err error + }{ + { + name: "invalid address", + msg: MsgUpdateDocument{ + Issuer: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgUpdateDocument{ + Data: "data", + Holder: "holder", + Issuer: sample.AccAddress(), + Proof: "proof", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/document/types/query.pb.go b/x/document/types/query.pb.go new file mode 100644 index 00000000..8ab175d2 --- /dev/null +++ b/x/document/types/query.pb.go @@ -0,0 +1,1406 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: document/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryDocumentByProofRequest struct { + Proof string `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` +} + +func (m *QueryDocumentByProofRequest) Reset() { *m = QueryDocumentByProofRequest{} } +func (m *QueryDocumentByProofRequest) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentByProofRequest) ProtoMessage() {} +func (*QueryDocumentByProofRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d6f5760b19c0d3bb, []int{0} +} +func (m *QueryDocumentByProofRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentByProofRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentByProofRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentByProofRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentByProofRequest.Merge(m, src) +} +func (m *QueryDocumentByProofRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentByProofRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentByProofRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentByProofRequest proto.InternalMessageInfo + +type QueryDocumentByProofResponse struct { + Document *Document `protobuf:"bytes,1,opt,name=document,proto3" json:"document,omitempty"` +} + +func (m *QueryDocumentByProofResponse) Reset() { *m = QueryDocumentByProofResponse{} } +func (m *QueryDocumentByProofResponse) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentByProofResponse) ProtoMessage() {} +func (*QueryDocumentByProofResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d6f5760b19c0d3bb, []int{1} +} +func (m *QueryDocumentByProofResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentByProofResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentByProofResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentByProofResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentByProofResponse.Merge(m, src) +} +func (m *QueryDocumentByProofResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentByProofResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentByProofResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentByProofResponse proto.InternalMessageInfo + +func (m *QueryDocumentByProofResponse) GetDocument() *Document { + if m != nil { + return m.Document + } + return nil +} + +type QueryDocumentByHolderIdRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *QueryDocumentByHolderIdRequest) Reset() { *m = QueryDocumentByHolderIdRequest{} } +func (m *QueryDocumentByHolderIdRequest) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentByHolderIdRequest) ProtoMessage() {} +func (*QueryDocumentByHolderIdRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d6f5760b19c0d3bb, []int{2} +} +func (m *QueryDocumentByHolderIdRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentByHolderIdRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentByHolderIdRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentByHolderIdRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentByHolderIdRequest.Merge(m, src) +} +func (m *QueryDocumentByHolderIdRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentByHolderIdRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentByHolderIdRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentByHolderIdRequest proto.InternalMessageInfo + +type QueryDocumentByHolderIdResponse struct { + Documents []*Document `protobuf:"bytes,1,rep,name=documents,proto3" json:"documents,omitempty"` +} + +func (m *QueryDocumentByHolderIdResponse) Reset() { *m = QueryDocumentByHolderIdResponse{} } +func (m *QueryDocumentByHolderIdResponse) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentByHolderIdResponse) ProtoMessage() {} +func (*QueryDocumentByHolderIdResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d6f5760b19c0d3bb, []int{3} +} +func (m *QueryDocumentByHolderIdResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentByHolderIdResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentByHolderIdResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentByHolderIdResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentByHolderIdResponse.Merge(m, src) +} +func (m *QueryDocumentByHolderIdResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentByHolderIdResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentByHolderIdResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentByHolderIdResponse proto.InternalMessageInfo + +func (m *QueryDocumentByHolderIdResponse) GetDocuments() []*Document { + if m != nil { + return m.Documents + } + return nil +} + +type QueryDocumentOfHolderByIssuerRequest struct { + Holder string `protobuf:"bytes,1,opt,name=holder,proto3" json:"holder,omitempty"` + Issuer string `protobuf:"bytes,2,opt,name=issuer,proto3" json:"issuer,omitempty"` +} + +func (m *QueryDocumentOfHolderByIssuerRequest) Reset() { *m = QueryDocumentOfHolderByIssuerRequest{} } +func (m *QueryDocumentOfHolderByIssuerRequest) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentOfHolderByIssuerRequest) ProtoMessage() {} +func (*QueryDocumentOfHolderByIssuerRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d6f5760b19c0d3bb, []int{4} +} +func (m *QueryDocumentOfHolderByIssuerRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentOfHolderByIssuerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentOfHolderByIssuerRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentOfHolderByIssuerRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentOfHolderByIssuerRequest.Merge(m, src) +} +func (m *QueryDocumentOfHolderByIssuerRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentOfHolderByIssuerRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentOfHolderByIssuerRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentOfHolderByIssuerRequest proto.InternalMessageInfo + +type QueryDocumentOfHolderByIssuerResponse struct { + Documents []*Document `protobuf:"bytes,1,rep,name=documents,proto3" json:"documents,omitempty"` +} + +func (m *QueryDocumentOfHolderByIssuerResponse) Reset() { *m = QueryDocumentOfHolderByIssuerResponse{} } +func (m *QueryDocumentOfHolderByIssuerResponse) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentOfHolderByIssuerResponse) ProtoMessage() {} +func (*QueryDocumentOfHolderByIssuerResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d6f5760b19c0d3bb, []int{5} +} +func (m *QueryDocumentOfHolderByIssuerResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentOfHolderByIssuerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentOfHolderByIssuerResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentOfHolderByIssuerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentOfHolderByIssuerResponse.Merge(m, src) +} +func (m *QueryDocumentOfHolderByIssuerResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentOfHolderByIssuerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentOfHolderByIssuerResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentOfHolderByIssuerResponse proto.InternalMessageInfo + +func (m *QueryDocumentOfHolderByIssuerResponse) GetDocuments() []*Document { + if m != nil { + return m.Documents + } + return nil +} + +func init() { + proto.RegisterType((*QueryDocumentByProofRequest)(nil), "shareledger.document.QueryDocumentByProofRequest") + proto.RegisterType((*QueryDocumentByProofResponse)(nil), "shareledger.document.QueryDocumentByProofResponse") + proto.RegisterType((*QueryDocumentByHolderIdRequest)(nil), "shareledger.document.QueryDocumentByHolderIdRequest") + proto.RegisterType((*QueryDocumentByHolderIdResponse)(nil), "shareledger.document.QueryDocumentByHolderIdResponse") + proto.RegisterType((*QueryDocumentOfHolderByIssuerRequest)(nil), "shareledger.document.QueryDocumentOfHolderByIssuerRequest") + proto.RegisterType((*QueryDocumentOfHolderByIssuerResponse)(nil), "shareledger.document.QueryDocumentOfHolderByIssuerResponse") +} + +func init() { proto.RegisterFile("document/query.proto", fileDescriptor_d6f5760b19c0d3bb) } + +var fileDescriptor_d6f5760b19c0d3bb = []byte{ + // 506 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0x3f, 0x6f, 0x13, 0x31, + 0x18, 0xc6, 0xef, 0x02, 0xad, 0x5a, 0x23, 0x81, 0x64, 0x45, 0x10, 0x1d, 0xd1, 0xa5, 0x3a, 0xa8, + 0xf8, 0x27, 0x9d, 0x95, 0x00, 0x4b, 0x80, 0x25, 0x62, 0xa0, 0x62, 0x00, 0x32, 0x76, 0x81, 0x4b, + 0xce, 0x75, 0x2c, 0x25, 0xf7, 0x5e, 0x6d, 0x1f, 0x22, 0x8a, 0xb2, 0x30, 0x31, 0x22, 0xb1, 0xa3, + 0x2e, 0x7c, 0x13, 0x06, 0xc6, 0x4a, 0x2c, 0x8c, 0x28, 0x61, 0xe0, 0x63, 0xa0, 0xb3, 0x7d, 0x69, + 0x1a, 0x12, 0x48, 0x11, 0x53, 0xec, 0xd7, 0xef, 0xf3, 0x3c, 0x3f, 0xc7, 0xaf, 0x0e, 0x95, 0x63, + 0xe8, 0x66, 0x03, 0x9a, 0x28, 0x72, 0x98, 0x51, 0x31, 0x0c, 0x53, 0x01, 0x0a, 0x70, 0x59, 0xf6, + 0x22, 0x41, 0xfb, 0x34, 0x66, 0x54, 0x84, 0x45, 0x87, 0x57, 0x65, 0x00, 0xac, 0x4f, 0x49, 0x94, + 0x72, 0x12, 0x25, 0x09, 0xa8, 0x48, 0x71, 0x48, 0xa4, 0xd1, 0x78, 0xb7, 0xbb, 0x20, 0x07, 0x20, + 0x49, 0x27, 0x92, 0xd4, 0x98, 0x91, 0xd7, 0xf5, 0x0e, 0x55, 0x51, 0x9d, 0xa4, 0x11, 0xe3, 0x89, + 0x6e, 0xb6, 0xbd, 0x65, 0x06, 0x0c, 0xf4, 0x92, 0xe4, 0x2b, 0x5b, 0xbd, 0x32, 0x63, 0x29, 0x16, + 0xe6, 0x20, 0x78, 0x84, 0xae, 0xbe, 0xc8, 0x0d, 0x1f, 0xdb, 0x72, 0x6b, 0xf8, 0x5c, 0x00, 0x1c, + 0xb4, 0xe9, 0x61, 0x46, 0xa5, 0xc2, 0x65, 0xb4, 0x91, 0xe6, 0xfb, 0x8a, 0xbb, 0xe3, 0xde, 0xdc, + 0x6e, 0x9b, 0x4d, 0x73, 0xeb, 0xdd, 0x51, 0xcd, 0xf9, 0x79, 0x54, 0x73, 0x82, 0x7d, 0x54, 0x5d, + 0x2e, 0x97, 0x29, 0x24, 0x92, 0xe2, 0x26, 0xda, 0x2a, 0x02, 0xb5, 0xc5, 0x85, 0x86, 0x1f, 0x2e, + 0xfb, 0x03, 0xc2, 0xc2, 0xa0, 0x3d, 0xeb, 0x0f, 0x9a, 0xc8, 0x5f, 0xf0, 0x7e, 0x02, 0xfd, 0x98, + 0x8a, 0xbd, 0xb8, 0xa0, 0xbb, 0x88, 0x4a, 0x3c, 0xb6, 0x68, 0x25, 0x1e, 0xcf, 0x71, 0xbd, 0x44, + 0xb5, 0x95, 0x5a, 0x8b, 0xf6, 0x10, 0x6d, 0x17, 0x51, 0xb2, 0xe2, 0xee, 0x9c, 0x5b, 0x83, 0xed, + 0x44, 0x10, 0xbc, 0x42, 0xd7, 0x4f, 0x05, 0x3c, 0x3b, 0x30, 0x01, 0xad, 0xe1, 0x9e, 0x94, 0x19, + 0x15, 0x05, 0xe2, 0x65, 0xb4, 0xd9, 0xd3, 0x07, 0x16, 0xd3, 0xee, 0xf2, 0x3a, 0xd7, 0x8d, 0x95, + 0x92, 0xa9, 0x9b, 0xdd, 0xdc, 0x15, 0x28, 0xda, 0xfd, 0x4b, 0xc2, 0xff, 0xb8, 0x48, 0xe3, 0xe3, + 0x79, 0xb4, 0xa1, 0x73, 0xf0, 0x27, 0x17, 0x5d, 0x5a, 0x78, 0x47, 0x5c, 0x5f, 0x6e, 0xf4, 0x87, + 0x91, 0xf1, 0x1a, 0x67, 0x91, 0x98, 0x2b, 0x04, 0x77, 0xde, 0x7e, 0xfd, 0xf1, 0xa1, 0xb4, 0x8b, + 0xaf, 0x91, 0x39, 0xed, 0x6c, 0x54, 0x89, 0x9e, 0x3a, 0x32, 0xd2, 0x3f, 0xe3, 0x9c, 0x13, 0xff, + 0xfe, 0xae, 0xf8, 0xde, 0x5a, 0xb9, 0x0b, 0x23, 0xe4, 0xdd, 0x3f, 0xa3, 0xca, 0x02, 0x07, 0x1a, + 0xb8, 0x8a, 0xbd, 0xe5, 0xc0, 0x23, 0x1e, 0x8f, 0xf1, 0x67, 0x17, 0x55, 0x56, 0x3d, 0x1e, 0x6e, + 0xae, 0x91, 0xbb, 0x62, 0xa6, 0xbc, 0x07, 0xff, 0xa4, 0xb5, 0xe4, 0x44, 0x93, 0xdf, 0xc2, 0x37, + 0x56, 0x90, 0x9b, 0xf9, 0x1c, 0x93, 0x91, 0x19, 0xc8, 0x71, 0xeb, 0xe9, 0x97, 0x89, 0xef, 0x1e, + 0x4f, 0x7c, 0xf7, 0xfb, 0xc4, 0x77, 0xdf, 0x4f, 0x7d, 0xe7, 0x78, 0xea, 0x3b, 0xdf, 0xa6, 0xbe, + 0xb3, 0x5f, 0x67, 0x5c, 0xf5, 0xb2, 0x4e, 0xd8, 0x85, 0x81, 0x31, 0x13, 0x3c, 0x61, 0xa7, 0x6c, + 0xdf, 0x9c, 0x18, 0xab, 0x61, 0x4a, 0x65, 0x67, 0x53, 0x7f, 0x75, 0xee, 0xfe, 0x0a, 0x00, 0x00, + 0xff, 0xff, 0x2d, 0x48, 0x53, 0x18, 0x1c, 0x05, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Queries a list of documentByProof items. + DocumentByProof(ctx context.Context, in *QueryDocumentByProofRequest, opts ...grpc.CallOption) (*QueryDocumentByProofResponse, error) + // Queries a list of documentByHolderId items. + DocumentByHolderId(ctx context.Context, in *QueryDocumentByHolderIdRequest, opts ...grpc.CallOption) (*QueryDocumentByHolderIdResponse, error) + // Queries a list of documentOfHolderByIssuer items. + DocumentOfHolderByIssuer(ctx context.Context, in *QueryDocumentOfHolderByIssuerRequest, opts ...grpc.CallOption) (*QueryDocumentOfHolderByIssuerResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) DocumentByProof(ctx context.Context, in *QueryDocumentByProofRequest, opts ...grpc.CallOption) (*QueryDocumentByProofResponse, error) { + out := new(QueryDocumentByProofResponse) + err := c.cc.Invoke(ctx, "/shareledger.document.Query/DocumentByProof", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) DocumentByHolderId(ctx context.Context, in *QueryDocumentByHolderIdRequest, opts ...grpc.CallOption) (*QueryDocumentByHolderIdResponse, error) { + out := new(QueryDocumentByHolderIdResponse) + err := c.cc.Invoke(ctx, "/shareledger.document.Query/DocumentByHolderId", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) DocumentOfHolderByIssuer(ctx context.Context, in *QueryDocumentOfHolderByIssuerRequest, opts ...grpc.CallOption) (*QueryDocumentOfHolderByIssuerResponse, error) { + out := new(QueryDocumentOfHolderByIssuerResponse) + err := c.cc.Invoke(ctx, "/shareledger.document.Query/DocumentOfHolderByIssuer", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Queries a list of documentByProof items. + DocumentByProof(context.Context, *QueryDocumentByProofRequest) (*QueryDocumentByProofResponse, error) + // Queries a list of documentByHolderId items. + DocumentByHolderId(context.Context, *QueryDocumentByHolderIdRequest) (*QueryDocumentByHolderIdResponse, error) + // Queries a list of documentOfHolderByIssuer items. + DocumentOfHolderByIssuer(context.Context, *QueryDocumentOfHolderByIssuerRequest) (*QueryDocumentOfHolderByIssuerResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) DocumentByProof(ctx context.Context, req *QueryDocumentByProofRequest) (*QueryDocumentByProofResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentByProof not implemented") +} +func (*UnimplementedQueryServer) DocumentByHolderId(ctx context.Context, req *QueryDocumentByHolderIdRequest) (*QueryDocumentByHolderIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentByHolderId not implemented") +} +func (*UnimplementedQueryServer) DocumentOfHolderByIssuer(ctx context.Context, req *QueryDocumentOfHolderByIssuerRequest) (*QueryDocumentOfHolderByIssuerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentOfHolderByIssuer not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_DocumentByProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryDocumentByProofRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).DocumentByProof(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.document.Query/DocumentByProof", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).DocumentByProof(ctx, req.(*QueryDocumentByProofRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_DocumentByHolderId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryDocumentByHolderIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).DocumentByHolderId(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.document.Query/DocumentByHolderId", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).DocumentByHolderId(ctx, req.(*QueryDocumentByHolderIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_DocumentOfHolderByIssuer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryDocumentOfHolderByIssuerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).DocumentOfHolderByIssuer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.document.Query/DocumentOfHolderByIssuer", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).DocumentOfHolderByIssuer(ctx, req.(*QueryDocumentOfHolderByIssuerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.document.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DocumentByProof", + Handler: _Query_DocumentByProof_Handler, + }, + { + MethodName: "DocumentByHolderId", + Handler: _Query_DocumentByHolderId_Handler, + }, + { + MethodName: "DocumentOfHolderByIssuer", + Handler: _Query_DocumentOfHolderByIssuer_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "document/query.proto", +} + +func (m *QueryDocumentByProofRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentByProofRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentByProofRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Proof) > 0 { + i -= len(m.Proof) + copy(dAtA[i:], m.Proof) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Proof))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentByProofResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentByProofResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentByProofResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Document != nil { + { + size, err := m.Document.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentByHolderIdRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentByHolderIdRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentByHolderIdRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentByHolderIdResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentByHolderIdResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentByHolderIdResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Documents) > 0 { + for iNdEx := len(m.Documents) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Documents[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentOfHolderByIssuerRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentOfHolderByIssuerRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentOfHolderByIssuerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Issuer) > 0 { + i -= len(m.Issuer) + copy(dAtA[i:], m.Issuer) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Issuer))) + i-- + dAtA[i] = 0x12 + } + if len(m.Holder) > 0 { + i -= len(m.Holder) + copy(dAtA[i:], m.Holder) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Holder))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentOfHolderByIssuerResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentOfHolderByIssuerResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentOfHolderByIssuerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Documents) > 0 { + for iNdEx := len(m.Documents) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Documents[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryDocumentByProofRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Proof) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryDocumentByProofResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Document != nil { + l = m.Document.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryDocumentByHolderIdRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryDocumentByHolderIdResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Documents) > 0 { + for _, e := range m.Documents { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryDocumentOfHolderByIssuerRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Holder) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.Issuer) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryDocumentOfHolderByIssuerResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Documents) > 0 { + for _, e := range m.Documents { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryDocumentByProofRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentByProofRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentByProofRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proof = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentByProofResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentByProofResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentByProofResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Document", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Document == nil { + m.Document = &Document{} + } + if err := m.Document.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentByHolderIdRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentByHolderIdRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentByHolderIdRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentByHolderIdResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentByHolderIdResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentByHolderIdResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Documents", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Documents = append(m.Documents, &Document{}) + if err := m.Documents[len(m.Documents)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentOfHolderByIssuerRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentOfHolderByIssuerRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentOfHolderByIssuerRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Holder", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Holder = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentOfHolderByIssuerResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentOfHolderByIssuerResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentOfHolderByIssuerResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Documents", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Documents = append(m.Documents, &Document{}) + if err := m.Documents[len(m.Documents)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/document/types/query.pb.gw.go b/x/document/types/query.pb.gw.go new file mode 100644 index 00000000..fd39dfbf --- /dev/null +++ b/x/document/types/query.pb.gw.go @@ -0,0 +1,413 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: document/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_DocumentByProof_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentByProofRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proof"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proof") + } + + protoReq.Proof, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proof", err) + } + + msg, err := client.DocumentByProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_DocumentByProof_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentByProofRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proof"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proof") + } + + protoReq.Proof, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proof", err) + } + + msg, err := server.DocumentByProof(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_DocumentByHolderId_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentByHolderIdRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := client.DocumentByHolderId(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_DocumentByHolderId_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentByHolderIdRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.DocumentByHolderId(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_DocumentOfHolderByIssuer_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentOfHolderByIssuerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["holder"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "holder") + } + + protoReq.Holder, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "holder", err) + } + + val, ok = pathParams["issuer"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "issuer") + } + + protoReq.Issuer, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "issuer", err) + } + + msg, err := client.DocumentOfHolderByIssuer(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_DocumentOfHolderByIssuer_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentOfHolderByIssuerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["holder"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "holder") + } + + protoReq.Holder, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "holder", err) + } + + val, ok = pathParams["issuer"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "issuer") + } + + protoReq.Issuer, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "issuer", err) + } + + msg, err := server.DocumentOfHolderByIssuer(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_DocumentByProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DocumentByProof_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentByProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentByHolderId_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DocumentByHolderId_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentByHolderId_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentOfHolderByIssuer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DocumentOfHolderByIssuer_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentOfHolderByIssuer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_DocumentByProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_DocumentByProof_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentByProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentByHolderId_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_DocumentByHolderId_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentByHolderId_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentOfHolderByIssuer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_DocumentOfHolderByIssuer_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentOfHolderByIssuer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_DocumentByProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2}, []string{"shareledger", "document", "proof"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_DocumentByHolderId_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"shareledger", "document", "id"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_DocumentOfHolderByIssuer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "document", "holder", "issuer"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Query_DocumentByProof_0 = runtime.ForwardResponseMessage + + forward_Query_DocumentByHolderId_0 = runtime.ForwardResponseMessage + + forward_Query_DocumentOfHolderByIssuer_0 = runtime.ForwardResponseMessage +) diff --git a/x/document/types/tx.pb.go b/x/document/types/tx.pb.go new file mode 100644 index 00000000..ca8e61e5 --- /dev/null +++ b/x/document/types/tx.pb.go @@ -0,0 +1,2079 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: document/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgCreateDocument struct { + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + Holder string `protobuf:"bytes,2,opt,name=holder,proto3" json:"holder,omitempty"` + Issuer string `protobuf:"bytes,3,opt,name=issuer,proto3" json:"issuer,omitempty"` + Proof string `protobuf:"bytes,4,opt,name=proof,proto3" json:"proof,omitempty"` +} + +func (m *MsgCreateDocument) Reset() { *m = MsgCreateDocument{} } +func (m *MsgCreateDocument) String() string { return proto.CompactTextString(m) } +func (*MsgCreateDocument) ProtoMessage() {} +func (*MsgCreateDocument) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{0} +} +func (m *MsgCreateDocument) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateDocument) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateDocument.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateDocument) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateDocument.Merge(m, src) +} +func (m *MsgCreateDocument) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateDocument) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateDocument.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateDocument proto.InternalMessageInfo + +func (m *MsgCreateDocument) GetData() string { + if m != nil { + return m.Data + } + return "" +} + +func (m *MsgCreateDocument) GetHolder() string { + if m != nil { + return m.Holder + } + return "" +} + +func (m *MsgCreateDocument) GetIssuer() string { + if m != nil { + return m.Issuer + } + return "" +} + +func (m *MsgCreateDocument) GetProof() string { + if m != nil { + return m.Proof + } + return "" +} + +type MsgCreateDocumentResponse struct { +} + +func (m *MsgCreateDocumentResponse) Reset() { *m = MsgCreateDocumentResponse{} } +func (m *MsgCreateDocumentResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateDocumentResponse) ProtoMessage() {} +func (*MsgCreateDocumentResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{1} +} +func (m *MsgCreateDocumentResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateDocumentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateDocumentResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateDocumentResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateDocumentResponse.Merge(m, src) +} +func (m *MsgCreateDocumentResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateDocumentResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateDocumentResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateDocumentResponse proto.InternalMessageInfo + +type MsgCreateDocuments struct { + Data []string `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` + Holder []string `protobuf:"bytes,2,rep,name=holder,proto3" json:"holder,omitempty"` + Issuer string `protobuf:"bytes,3,opt,name=issuer,proto3" json:"issuer,omitempty"` + Proof []string `protobuf:"bytes,4,rep,name=proof,proto3" json:"proof,omitempty"` +} + +func (m *MsgCreateDocuments) Reset() { *m = MsgCreateDocuments{} } +func (m *MsgCreateDocuments) String() string { return proto.CompactTextString(m) } +func (*MsgCreateDocuments) ProtoMessage() {} +func (*MsgCreateDocuments) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{2} +} +func (m *MsgCreateDocuments) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateDocuments) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateDocuments.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateDocuments) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateDocuments.Merge(m, src) +} +func (m *MsgCreateDocuments) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateDocuments) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateDocuments.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateDocuments proto.InternalMessageInfo + +func (m *MsgCreateDocuments) GetData() []string { + if m != nil { + return m.Data + } + return nil +} + +func (m *MsgCreateDocuments) GetHolder() []string { + if m != nil { + return m.Holder + } + return nil +} + +func (m *MsgCreateDocuments) GetIssuer() string { + if m != nil { + return m.Issuer + } + return "" +} + +func (m *MsgCreateDocuments) GetProof() []string { + if m != nil { + return m.Proof + } + return nil +} + +type MsgCreateDocumentsResponse struct { +} + +func (m *MsgCreateDocumentsResponse) Reset() { *m = MsgCreateDocumentsResponse{} } +func (m *MsgCreateDocumentsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateDocumentsResponse) ProtoMessage() {} +func (*MsgCreateDocumentsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{3} +} +func (m *MsgCreateDocumentsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateDocumentsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateDocumentsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateDocumentsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateDocumentsResponse.Merge(m, src) +} +func (m *MsgCreateDocumentsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateDocumentsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateDocumentsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateDocumentsResponse proto.InternalMessageInfo + +type MsgRevokeDocument struct { + Holder string `protobuf:"bytes,1,opt,name=holder,proto3" json:"holder,omitempty"` + Issuer string `protobuf:"bytes,2,opt,name=issuer,proto3" json:"issuer,omitempty"` + Proof string `protobuf:"bytes,3,opt,name=proof,proto3" json:"proof,omitempty"` +} + +func (m *MsgRevokeDocument) Reset() { *m = MsgRevokeDocument{} } +func (m *MsgRevokeDocument) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeDocument) ProtoMessage() {} +func (*MsgRevokeDocument) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{4} +} +func (m *MsgRevokeDocument) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeDocument) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeDocument.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeDocument) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeDocument.Merge(m, src) +} +func (m *MsgRevokeDocument) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeDocument) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeDocument.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeDocument proto.InternalMessageInfo + +func (m *MsgRevokeDocument) GetHolder() string { + if m != nil { + return m.Holder + } + return "" +} + +func (m *MsgRevokeDocument) GetIssuer() string { + if m != nil { + return m.Issuer + } + return "" +} + +func (m *MsgRevokeDocument) GetProof() string { + if m != nil { + return m.Proof + } + return "" +} + +type MsgRevokeDocumentResponse struct { +} + +func (m *MsgRevokeDocumentResponse) Reset() { *m = MsgRevokeDocumentResponse{} } +func (m *MsgRevokeDocumentResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeDocumentResponse) ProtoMessage() {} +func (*MsgRevokeDocumentResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{5} +} +func (m *MsgRevokeDocumentResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeDocumentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeDocumentResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeDocumentResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeDocumentResponse.Merge(m, src) +} +func (m *MsgRevokeDocumentResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeDocumentResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeDocumentResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeDocumentResponse proto.InternalMessageInfo + +type MsgUpdateDocument struct { + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + Holder string `protobuf:"bytes,2,opt,name=holder,proto3" json:"holder,omitempty"` + Issuer string `protobuf:"bytes,3,opt,name=issuer,proto3" json:"issuer,omitempty"` + Proof string `protobuf:"bytes,4,opt,name=proof,proto3" json:"proof,omitempty"` +} + +func (m *MsgUpdateDocument) Reset() { *m = MsgUpdateDocument{} } +func (m *MsgUpdateDocument) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateDocument) ProtoMessage() {} +func (*MsgUpdateDocument) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{6} +} +func (m *MsgUpdateDocument) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateDocument) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateDocument.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateDocument) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateDocument.Merge(m, src) +} +func (m *MsgUpdateDocument) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateDocument) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateDocument.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateDocument proto.InternalMessageInfo + +func (m *MsgUpdateDocument) GetData() string { + if m != nil { + return m.Data + } + return "" +} + +func (m *MsgUpdateDocument) GetHolder() string { + if m != nil { + return m.Holder + } + return "" +} + +func (m *MsgUpdateDocument) GetIssuer() string { + if m != nil { + return m.Issuer + } + return "" +} + +func (m *MsgUpdateDocument) GetProof() string { + if m != nil { + return m.Proof + } + return "" +} + +type MsgUpdateDocumentResponse struct { +} + +func (m *MsgUpdateDocumentResponse) Reset() { *m = MsgUpdateDocumentResponse{} } +func (m *MsgUpdateDocumentResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateDocumentResponse) ProtoMessage() {} +func (*MsgUpdateDocumentResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9b59fe9729b670ce, []int{7} +} +func (m *MsgUpdateDocumentResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateDocumentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateDocumentResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateDocumentResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateDocumentResponse.Merge(m, src) +} +func (m *MsgUpdateDocumentResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateDocumentResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateDocumentResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateDocumentResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCreateDocument)(nil), "shareledger.document.MsgCreateDocument") + proto.RegisterType((*MsgCreateDocumentResponse)(nil), "shareledger.document.MsgCreateDocumentResponse") + proto.RegisterType((*MsgCreateDocuments)(nil), "shareledger.document.MsgCreateDocuments") + proto.RegisterType((*MsgCreateDocumentsResponse)(nil), "shareledger.document.MsgCreateDocumentsResponse") + proto.RegisterType((*MsgRevokeDocument)(nil), "shareledger.document.MsgRevokeDocument") + proto.RegisterType((*MsgRevokeDocumentResponse)(nil), "shareledger.document.MsgRevokeDocumentResponse") + proto.RegisterType((*MsgUpdateDocument)(nil), "shareledger.document.MsgUpdateDocument") + proto.RegisterType((*MsgUpdateDocumentResponse)(nil), "shareledger.document.MsgUpdateDocumentResponse") +} + +func init() { proto.RegisterFile("document/tx.proto", fileDescriptor_9b59fe9729b670ce) } + +var fileDescriptor_9b59fe9729b670ce = []byte{ + // 359 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0xcd, 0x4e, 0xc2, 0x40, + 0x10, 0xc7, 0x29, 0x8b, 0x24, 0xce, 0x01, 0xc3, 0x86, 0x98, 0x8a, 0xa6, 0x31, 0x5c, 0xe4, 0xd4, + 0xf5, 0xe3, 0x0d, 0xd4, 0x9b, 0xe1, 0x42, 0xe2, 0x41, 0x6f, 0x85, 0x8e, 0x05, 0xa4, 0xdd, 0x66, + 0x77, 0x31, 0xf8, 0x16, 0x3e, 0x8e, 0x8f, 0xe0, 0x91, 0xa3, 0x47, 0x03, 0x2f, 0x62, 0xd8, 0x02, + 0xa5, 0x1f, 0x90, 0x7a, 0xf1, 0xb6, 0x33, 0x3b, 0x99, 0xdf, 0x7f, 0xe7, 0x3f, 0x59, 0xa8, 0xbb, + 0xbc, 0x3f, 0xf1, 0x31, 0x50, 0x4c, 0x4d, 0xed, 0x50, 0x70, 0xc5, 0x69, 0x43, 0x0e, 0x1c, 0x81, + 0x63, 0x74, 0x3d, 0x14, 0xf6, 0xfa, 0xba, 0xe5, 0x43, 0xbd, 0x23, 0xbd, 0x3b, 0x81, 0x8e, 0xc2, + 0xfb, 0x55, 0x92, 0x52, 0xa8, 0xb8, 0x8e, 0x72, 0x4c, 0xe3, 0xdc, 0x68, 0x1f, 0x76, 0xf5, 0x99, + 0x1e, 0x43, 0x75, 0xc0, 0xc7, 0x2e, 0x0a, 0xb3, 0xac, 0xb3, 0xab, 0x68, 0x99, 0x1f, 0x4a, 0x39, + 0x41, 0x61, 0x92, 0x28, 0x1f, 0x45, 0xb4, 0x01, 0x07, 0xa1, 0xe0, 0xfc, 0xc5, 0xac, 0xe8, 0x74, + 0x14, 0xb4, 0x4e, 0xe1, 0x24, 0x83, 0xeb, 0xa2, 0x0c, 0x79, 0x20, 0xb1, 0x15, 0x00, 0xcd, 0x5c, + 0xca, 0x2d, 0x31, 0x24, 0x57, 0x0c, 0xf9, 0x9b, 0x18, 0x12, 0x8b, 0x39, 0x83, 0x66, 0x96, 0xb7, + 0x51, 0xf3, 0xa4, 0x27, 0xd3, 0xc5, 0x37, 0xfe, 0x1a, 0x4f, 0x26, 0x06, 0x1b, 0x3b, 0xa6, 0x50, + 0xce, 0x07, 0x93, 0xec, 0x14, 0x92, 0xad, 0x37, 0xdc, 0xc8, 0x91, 0xc7, 0xd0, 0xfd, 0x4f, 0x47, + 0x92, 0xb8, 0xb5, 0x96, 0xeb, 0x4f, 0x02, 0xa4, 0x23, 0x3d, 0x3a, 0x82, 0x5a, 0x6a, 0x45, 0x2e, + 0xec, 0xbc, 0x75, 0xb2, 0x33, 0xf3, 0x6c, 0xb2, 0x82, 0x85, 0x6b, 0x26, 0xf5, 0xe1, 0x28, 0xbd, + 0x02, 0xed, 0x82, 0x3d, 0x64, 0xf3, 0xb2, 0x68, 0xe5, 0x06, 0x37, 0x82, 0x5a, 0xca, 0xe3, 0xdd, + 0x4f, 0x4b, 0x16, 0xee, 0x79, 0x5a, 0xbe, 0xb5, 0x4b, 0x56, 0xca, 0xd7, 0xdd, 0xac, 0x64, 0xe1, + 0x1e, 0x56, 0xbe, 0x75, 0xb7, 0x0f, 0x5f, 0x73, 0xcb, 0x98, 0xcd, 0x2d, 0xe3, 0x67, 0x6e, 0x19, + 0x1f, 0x0b, 0xab, 0x34, 0x5b, 0x58, 0xa5, 0xef, 0x85, 0x55, 0x7a, 0xbe, 0xf2, 0x86, 0x6a, 0x30, + 0xe9, 0xd9, 0x7d, 0xee, 0x33, 0xdd, 0x54, 0x0c, 0x03, 0x8f, 0x6d, 0xb5, 0x67, 0x53, 0x16, 0x7f, + 0x1f, 0xef, 0x21, 0xca, 0x5e, 0x55, 0x7f, 0x21, 0x37, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x68, + 0x3d, 0x4b, 0x11, 0x57, 0x04, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + CreateDocument(ctx context.Context, in *MsgCreateDocument, opts ...grpc.CallOption) (*MsgCreateDocumentResponse, error) + CreateDocuments(ctx context.Context, in *MsgCreateDocuments, opts ...grpc.CallOption) (*MsgCreateDocumentsResponse, error) + RevokeDocument(ctx context.Context, in *MsgRevokeDocument, opts ...grpc.CallOption) (*MsgRevokeDocumentResponse, error) + UpdateDocument(ctx context.Context, in *MsgUpdateDocument, opts ...grpc.CallOption) (*MsgUpdateDocumentResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) CreateDocument(ctx context.Context, in *MsgCreateDocument, opts ...grpc.CallOption) (*MsgCreateDocumentResponse, error) { + out := new(MsgCreateDocumentResponse) + err := c.cc.Invoke(ctx, "/shareledger.document.Msg/CreateDocument", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) CreateDocuments(ctx context.Context, in *MsgCreateDocuments, opts ...grpc.CallOption) (*MsgCreateDocumentsResponse, error) { + out := new(MsgCreateDocumentsResponse) + err := c.cc.Invoke(ctx, "/shareledger.document.Msg/CreateDocuments", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RevokeDocument(ctx context.Context, in *MsgRevokeDocument, opts ...grpc.CallOption) (*MsgRevokeDocumentResponse, error) { + out := new(MsgRevokeDocumentResponse) + err := c.cc.Invoke(ctx, "/shareledger.document.Msg/RevokeDocument", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) UpdateDocument(ctx context.Context, in *MsgUpdateDocument, opts ...grpc.CallOption) (*MsgUpdateDocumentResponse, error) { + out := new(MsgUpdateDocumentResponse) + err := c.cc.Invoke(ctx, "/shareledger.document.Msg/UpdateDocument", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + CreateDocument(context.Context, *MsgCreateDocument) (*MsgCreateDocumentResponse, error) + CreateDocuments(context.Context, *MsgCreateDocuments) (*MsgCreateDocumentsResponse, error) + RevokeDocument(context.Context, *MsgRevokeDocument) (*MsgRevokeDocumentResponse, error) + UpdateDocument(context.Context, *MsgUpdateDocument) (*MsgUpdateDocumentResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) CreateDocument(ctx context.Context, req *MsgCreateDocument) (*MsgCreateDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateDocument not implemented") +} +func (*UnimplementedMsgServer) CreateDocuments(ctx context.Context, req *MsgCreateDocuments) (*MsgCreateDocumentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateDocuments not implemented") +} +func (*UnimplementedMsgServer) RevokeDocument(ctx context.Context, req *MsgRevokeDocument) (*MsgRevokeDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeDocument not implemented") +} +func (*UnimplementedMsgServer) UpdateDocument(ctx context.Context, req *MsgUpdateDocument) (*MsgUpdateDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDocument not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_CreateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateDocument) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateDocument(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.document.Msg/CreateDocument", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateDocument(ctx, req.(*MsgCreateDocument)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_CreateDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateDocuments) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateDocuments(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.document.Msg/CreateDocuments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateDocuments(ctx, req.(*MsgCreateDocuments)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RevokeDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRevokeDocument) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RevokeDocument(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.document.Msg/RevokeDocument", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RevokeDocument(ctx, req.(*MsgRevokeDocument)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_UpdateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateDocument) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateDocument(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.document.Msg/UpdateDocument", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateDocument(ctx, req.(*MsgUpdateDocument)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.document.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateDocument", + Handler: _Msg_CreateDocument_Handler, + }, + { + MethodName: "CreateDocuments", + Handler: _Msg_CreateDocuments_Handler, + }, + { + MethodName: "RevokeDocument", + Handler: _Msg_RevokeDocument_Handler, + }, + { + MethodName: "UpdateDocument", + Handler: _Msg_UpdateDocument_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "document/tx.proto", +} + +func (m *MsgCreateDocument) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateDocument) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateDocument) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Proof) > 0 { + i -= len(m.Proof) + copy(dAtA[i:], m.Proof) + i = encodeVarintTx(dAtA, i, uint64(len(m.Proof))) + i-- + dAtA[i] = 0x22 + } + if len(m.Issuer) > 0 { + i -= len(m.Issuer) + copy(dAtA[i:], m.Issuer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Issuer))) + i-- + dAtA[i] = 0x1a + } + if len(m.Holder) > 0 { + i -= len(m.Holder) + copy(dAtA[i:], m.Holder) + i = encodeVarintTx(dAtA, i, uint64(len(m.Holder))) + i-- + dAtA[i] = 0x12 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateDocumentResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateDocumentResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateDocumentResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgCreateDocuments) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateDocuments) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateDocuments) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Proof) > 0 { + for iNdEx := len(m.Proof) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Proof[iNdEx]) + copy(dAtA[i:], m.Proof[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Proof[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Issuer) > 0 { + i -= len(m.Issuer) + copy(dAtA[i:], m.Issuer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Issuer))) + i-- + dAtA[i] = 0x1a + } + if len(m.Holder) > 0 { + for iNdEx := len(m.Holder) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Holder[iNdEx]) + copy(dAtA[i:], m.Holder[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Holder[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Data) > 0 { + for iNdEx := len(m.Data) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Data[iNdEx]) + copy(dAtA[i:], m.Data[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateDocumentsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateDocumentsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateDocumentsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgRevokeDocument) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeDocument) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeDocument) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Proof) > 0 { + i -= len(m.Proof) + copy(dAtA[i:], m.Proof) + i = encodeVarintTx(dAtA, i, uint64(len(m.Proof))) + i-- + dAtA[i] = 0x1a + } + if len(m.Issuer) > 0 { + i -= len(m.Issuer) + copy(dAtA[i:], m.Issuer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Issuer))) + i-- + dAtA[i] = 0x12 + } + if len(m.Holder) > 0 { + i -= len(m.Holder) + copy(dAtA[i:], m.Holder) + i = encodeVarintTx(dAtA, i, uint64(len(m.Holder))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRevokeDocumentResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeDocumentResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeDocumentResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgUpdateDocument) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateDocument) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateDocument) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Proof) > 0 { + i -= len(m.Proof) + copy(dAtA[i:], m.Proof) + i = encodeVarintTx(dAtA, i, uint64(len(m.Proof))) + i-- + dAtA[i] = 0x22 + } + if len(m.Issuer) > 0 { + i -= len(m.Issuer) + copy(dAtA[i:], m.Issuer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Issuer))) + i-- + dAtA[i] = 0x1a + } + if len(m.Holder) > 0 { + i -= len(m.Holder) + copy(dAtA[i:], m.Holder) + i = encodeVarintTx(dAtA, i, uint64(len(m.Holder))) + i-- + dAtA[i] = 0x12 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateDocumentResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateDocumentResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateDocumentResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateDocument) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Holder) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Issuer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Proof) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgCreateDocumentResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgCreateDocuments) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Data) > 0 { + for _, s := range m.Data { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + if len(m.Holder) > 0 { + for _, s := range m.Holder { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + l = len(m.Issuer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Proof) > 0 { + for _, s := range m.Proof { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgCreateDocumentsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgRevokeDocument) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Holder) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Issuer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Proof) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgRevokeDocumentResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgUpdateDocument) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Holder) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Issuer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Proof) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgUpdateDocumentResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateDocument) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateDocument: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateDocument: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Holder", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Holder = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proof = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateDocumentResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateDocumentResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateDocumentResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateDocuments) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateDocuments: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateDocuments: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Holder", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Holder = append(m.Holder, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proof = append(m.Proof, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateDocumentsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateDocumentsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateDocumentsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeDocument) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeDocument: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeDocument: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Holder", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Holder = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proof = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeDocumentResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeDocumentResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeDocumentResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateDocument) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgUpdateDocument: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateDocument: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Holder", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Holder = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proof = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateDocumentResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgUpdateDocumentResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateDocumentResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/document/types/types.go b/x/document/types/types.go new file mode 100644 index 00000000..ab1254f4 --- /dev/null +++ b/x/document/types/types.go @@ -0,0 +1 @@ +package types diff --git a/x/electoral/alias.go b/x/electoral/alias.go deleted file mode 100644 index 36739e5b..00000000 --- a/x/electoral/alias.go +++ /dev/null @@ -1,32 +0,0 @@ -package electoral - -import ( - "github.com/sharering/shareledger/x/electoral/keeper" - "github.com/sharering/shareledger/x/electoral/types" -) - -const ( - ModuleName = types.ModuleName - RouterKey = types.RouterKey - StoreKey = types.StoreKey - QuerierRoute = types.QuerierRoute - TypeEnrollVoter = types.TypeEnrollVoterMsg - TypeRevokeVoter = types.TypeRevokeVoterMsg - StatusVoterEnrolled = types.StatusVoterEnrolled -) - -var ( - NewKeeper = keeper.NewKeeper - NewQuerier = keeper.NewQuerier - NewMsgEnrollVoter = types.NewMsgEnrollVoter - NewMsgRevokeVoter = types.NewMsgRevokeVoter - ModuleCdc = types.ModuleCdc - RegisterCodec = types.RegisterCodec -) - -type ( - Keeper = keeper.Keeper - MsgEnrollVoter = types.MsgEnrollVoter - MsgRevokeVoter = types.MsgRevokeVoter - Voter = types.Voter -) diff --git a/x/electoral/client/cli/query.go b/x/electoral/client/cli/query.go index 908160dd..76f51120 100644 --- a/x/electoral/client/cli/query.go +++ b/x/electoral/client/cli/query.go @@ -2,48 +2,44 @@ package cli import ( "fmt" + // "strings" + + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" + // "github.com/cosmos/cosmos-sdk/client/flags" + // sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" - "github.com/spf13/cobra" ) -func QueryCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - bookingQueryCmd := &cobra.Command{ +// GetQueryCmd returns the cli query commands for this module +func GetQueryCmd(queryRoute string) *cobra.Command { + // Group electoral queries under a subcommand + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "Querying commands for the electoral module", + Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - bookingQueryCmd.AddCommand(flags.GetCommands( - CmdGetVoter(storeKey, cdc), - )...) - return bookingQueryCmd -} + cmd.AddCommand(CmdGetVoter()) -func CmdGetVoter(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "get [address]", - Short: "return status of voter", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - voter := args[0] - voterID := "voter" + voter - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/voter/%s", queryRoute, voterID), nil) - if err != nil { - fmt.Printf("could not get voter - %s \n", voterID) - return nil - } - - var out types.Voter - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } + cmd.AddCommand(CmdGetLoader()) + cmd.AddCommand(CmdGetLoadersFromFile()) + cmd.AddCommand(CmdIdSigner()) + cmd.AddCommand(CmdIdSigners()) + cmd.AddCommand(CmdAccountOperator()) + cmd.AddCommand(CmdAccountOperators()) + cmd.AddCommand(CmdDocumentIssuer()) + cmd.AddCommand(CmdDocumentIssuers()) + + cmd.AddCommand(CmdGetVoters()) + + cmd.AddCommand(CmdGetLoaders()) + + // this line is used by starport scaffolding # 1 + + return cmd } diff --git a/x/electoral/client/cli/query_account_operator.go b/x/electoral/client/cli/query_account_operator.go new file mode 100644 index 00000000..0813d65e --- /dev/null +++ b/x/electoral/client/cli/query_account_operator.go @@ -0,0 +1,47 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdAccountOperator() *cobra.Command { + cmd := &cobra.Command{ + Use: "account-operator [address]", + Short: "get account operator by address", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqAddress := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryAccountOperatorRequest{ + + Address: reqAddress, + } + + res, err := queryClient.AccountOperator(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_account_operators.go b/x/electoral/client/cli/query_account_operators.go new file mode 100644 index 00000000..a52d1bf5 --- /dev/null +++ b/x/electoral/client/cli/query_account_operators.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdAccountOperators() *cobra.Command { + cmd := &cobra.Command{ + Use: "account-operators", + Short: "get all account operators", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryAccountOperatorsRequest{} + + res, err := queryClient.AccountOperators(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_document_issuer.go b/x/electoral/client/cli/query_document_issuer.go new file mode 100644 index 00000000..92108f98 --- /dev/null +++ b/x/electoral/client/cli/query_document_issuer.go @@ -0,0 +1,47 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdDocumentIssuer() *cobra.Command { + cmd := &cobra.Command{ + Use: "document-issuer [address]", + Short: "get account operator by address", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqAddress := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryDocumentIssuerRequest{ + + Address: reqAddress, + } + + res, err := queryClient.DocumentIssuer(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_document_issuers.go b/x/electoral/client/cli/query_document_issuers.go new file mode 100644 index 00000000..56540af5 --- /dev/null +++ b/x/electoral/client/cli/query_document_issuers.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdDocumentIssuers() *cobra.Command { + cmd := &cobra.Command{ + Use: "document-issuers", + Short: "get all document-issuers", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryDocumentIssuersRequest{} + + res, err := queryClient.DocumentIssuers(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_get_loader.go b/x/electoral/client/cli/query_get_loader.go new file mode 100644 index 00000000..05ebab7d --- /dev/null +++ b/x/electoral/client/cli/query_get_loader.go @@ -0,0 +1,87 @@ +package cli + +import ( + "github.com/sharering/shareledger/x/utils" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdGetLoader() *cobra.Command { + cmd := &cobra.Command{ + Use: "get-loader [address]", + Short: "get shrp loader from address", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqAddress := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryLoaderRequest{ + + Address: reqAddress, + } + + res, err := queryClient.Loader(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +func CmdGetLoadersFromFile() *cobra.Command { + cmd := &cobra.Command{ + Use: "get-loaders-from-file [filepath]", + Short: "get shrp loaders from json file of addresses", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + addrList, err := utils.GetAddressFromFile(args[0]) + + queryClient := types.NewQueryClient(clientCtx) + + for _, addr := range addrList { + params := &types.QueryLoaderRequest{ + Address: addr, + } + + res, err := queryClient.Loader(cmd.Context(), params) + if err != nil { + return err + } + + if err := clientCtx.PrintProto(res); err != nil { + return err + } + } + return nil + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_get_loaders.go b/x/electoral/client/cli/query_get_loaders.go new file mode 100644 index 00000000..8fcd1a76 --- /dev/null +++ b/x/electoral/client/cli/query_get_loaders.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdGetLoaders() *cobra.Command { + cmd := &cobra.Command{ + Use: "get-loaders", + Short: "Query get-loaders", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryLoadersRequest{} + + res, err := queryClient.Loaders(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_get_voter.go b/x/electoral/client/cli/query_get_voter.go new file mode 100644 index 00000000..3624c205 --- /dev/null +++ b/x/electoral/client/cli/query_get_voter.go @@ -0,0 +1,47 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdGetVoter() *cobra.Command { + cmd := &cobra.Command{ + Use: "get-voter [address]", + Short: "return status of voter address", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqAddress := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryVoterRequest{ + + Address: reqAddress, + } + + res, err := queryClient.Voter(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_get_voters.go b/x/electoral/client/cli/query_get_voters.go new file mode 100644 index 00000000..3cb3692c --- /dev/null +++ b/x/electoral/client/cli/query_get_voters.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdGetVoters() *cobra.Command { + cmd := &cobra.Command{ + Use: "get-voters", + Short: "Query get-voters", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryVotersRequest{} + + res, err := queryClient.Voters(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_id_signer.go b/x/electoral/client/cli/query_id_signer.go new file mode 100644 index 00000000..d30700ba --- /dev/null +++ b/x/electoral/client/cli/query_id_signer.go @@ -0,0 +1,47 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdIdSigner() *cobra.Command { + cmd := &cobra.Command{ + Use: "id-signer [address]", + Short: "get id signer by address", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqAddress := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryIdSignerRequest{ + + Address: reqAddress, + } + + res, err := queryClient.IdSigner(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/query_id_signers.go b/x/electoral/client/cli/query_id_signers.go new file mode 100644 index 00000000..607c06d7 --- /dev/null +++ b/x/electoral/client/cli/query_id_signers.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdIdSigners() *cobra.Command { + cmd := &cobra.Command{ + Use: "id-signers", + Short: "get all id signers", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryIdSignersRequest{} + + res, err := queryClient.IdSigners(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx.go b/x/electoral/client/cli/tx.go index 31c4ea87..cf8d03a6 100644 --- a/x/electoral/client/cli/tx.go +++ b/x/electoral/client/cli/tx.go @@ -1,126 +1,48 @@ package cli import ( - "bufio" + "fmt" + "time" "github.com/spf13/cobra" - "github.com/spf13/viper" - - shareringUtils "github.com/ShareRing/modules/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" + // "github.com/cosmos/cosmos-sdk/client/flags" "github.com/sharering/shareledger/x/electoral/types" - - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" ) var ( - minFeeShr = shareringUtils.MINFEE.String() + "shr" + DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) +) + +const ( + flagPacketTimeoutTimestamp = "packet-timeout-timestamp" ) -func GetTxCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - bookCmd := &cobra.Command{ +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "booking transaction subcommands", + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - bookCmd.AddCommand(flags.PostCommands( - GetCmdEnroll(cdc), - GetCmdRevoke(cdc), - )...) - - return bookCmd -} - -func GetCmdEnroll(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll [address]", - Short: "enroll a voter", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - // Get key from key seed - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - // Get key from keychain - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - voter, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - msg := types.NewMsgEnrollVoter(cliCtx.GetFromAddress(), voter) - err = msg.ValidateBasic() - - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdRevoke(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "revoke [address]", - Short: "revoke a voter", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } + cmd.AddCommand(CmdEnrollVoter()) + cmd.AddCommand(CmdRevokeVoter()) + cmd.AddCommand(CmdEnrollLoaders()) + cmd.AddCommand(CmdEnrollLoadersFromFile()) + cmd.AddCommand(CmdRevokeLoaders()) + cmd.AddCommand(CmdRevokeLoadersFromFile()) + cmd.AddCommand(CmdEnrollIdSigners()) + cmd.AddCommand(CmdEnrollIdSignerFromFile()) + cmd.AddCommand(CmdRevokeIdSigners()) + cmd.AddCommand(CmdEnrollDocIssuers()) + cmd.AddCommand(CmdRevokeDocIssuers()) + cmd.AddCommand(CmdEnrollAccountOperators()) + cmd.AddCommand(CmdRevokeAccountOperators()) + // this line is used by starport scaffolding # 1 - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minFeeShr) - - voter, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - msg := types.NewMsgRevokeVoter(cliCtx.GetFromAddress(), voter) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") return cmd } diff --git a/x/electoral/client/cli/tx_enroll_account_operators.go b/x/electoral/client/cli/tx_enroll_account_operators.go new file mode 100644 index 00000000..33726021 --- /dev/null +++ b/x/electoral/client/cli/tx_enroll_account_operators.go @@ -0,0 +1,41 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdEnrollAccountOperators() *cobra.Command { + cmd := &cobra.Command{ + Use: "enroll-account-operators [addresses]", + Short: "Broadcast message enroll-account-operators", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgEnrollAccountOperators( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_enroll_doc_issuers.go b/x/electoral/client/cli/tx_enroll_doc_issuers.go new file mode 100644 index 00000000..3d55637e --- /dev/null +++ b/x/electoral/client/cli/tx_enroll_doc_issuers.go @@ -0,0 +1,42 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdEnrollDocIssuers() *cobra.Command { + cmd := &cobra.Command{ + Use: "enroll-doc-issuers [addresses]", + Short: "Broadcast message enroll-doc-issuers", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgEnrollDocIssuers( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_enroll_id_signers.go b/x/electoral/client/cli/tx_enroll_id_signers.go new file mode 100644 index 00000000..9fbe3669 --- /dev/null +++ b/x/electoral/client/cli/tx_enroll_id_signers.go @@ -0,0 +1,86 @@ +package cli + +import ( + "github.com/sharering/shareledger/x/utils" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdEnrollIdSigners() *cobra.Command { + cmd := &cobra.Command{ + Use: "enroll-id-signers [addresses]", + Short: "Broadcast message enroll-id-signers", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgEnrollIdSigners( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdEnrollIdSignerFromFile() *cobra.Command { + cmd := &cobra.Command{ + Use: "enroll-id-signers-from-file [filepath]", + Short: "enroll id signers from files", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + addrList, err := utils.GetAddressFromFile(args[0]) + if err != nil { + return err + } + lenAddr := len(addrList) + reqAddr := make([]string, 0, 5) + for i := 0; i < lenAddr; i++ { + reqAddr = append(reqAddr, addrList[i]) + // Send 5 addresses per time. Following the old logic of cli + if (i+1)%5 == 0 || i == lenAddr-1 { + msg := types.NewMsgEnrollIdSigners( + clientCtx.GetFromAddress().String(), + reqAddr[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + if err := tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg); err != nil { + return err + } + reqAddr = make([]string, 0, 5) + } + } + + return nil + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_enroll_loaders.go b/x/electoral/client/cli/tx_enroll_loaders.go new file mode 100644 index 00000000..8031f215 --- /dev/null +++ b/x/electoral/client/cli/tx_enroll_loaders.go @@ -0,0 +1,86 @@ +package cli + +import ( + "github.com/sharering/shareledger/x/utils" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdEnrollLoaders() *cobra.Command { + cmd := &cobra.Command{ + Use: "enroll-loaders [addresses]", + Short: "Broadcast message enroll-loaders", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgEnrollLoaders( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdEnrollLoadersFromFile() *cobra.Command { + cmd := &cobra.Command{ + Use: "enroll-loaders-from-file [filepath]", + Short: "enroll loaders from json file with array of addresses. The function will batch each 5 addresses per broadcast", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + addrList, err := utils.GetAddressFromFile(args[0]) + if err != nil { + return err + } + lenAddr := len(addrList) + reqAddr := make([]string, 0, 5) + for i := 0; i < lenAddr; i++ { + reqAddr = append(reqAddr, addrList[i]) + // Send 5 addresses per time. Following the old logic of cli + if (i+1)%5 == 0 || i == lenAddr-1 { + msg := types.NewMsgEnrollLoaders( + clientCtx.GetFromAddress().String(), + reqAddr[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + if err := tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg); err != nil { + return err + } + reqAddr = make([]string, 0, 5) + } + } + return nil + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_enroll_voter.go b/x/electoral/client/cli/tx_enroll_voter.go new file mode 100644 index 00000000..659a37dd --- /dev/null +++ b/x/electoral/client/cli/tx_enroll_voter.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdEnrollVoter() *cobra.Command { + cmd := &cobra.Command{ + Use: "enroll-voter [voter]", + Short: "Broadcast message enroll-voter", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argVoter := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgEnrollVoter( + clientCtx.GetFromAddress().String(), + argVoter, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_revoke_account_operators.go b/x/electoral/client/cli/tx_revoke_account_operators.go new file mode 100644 index 00000000..ff7795fc --- /dev/null +++ b/x/electoral/client/cli/tx_revoke_account_operators.go @@ -0,0 +1,42 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdRevokeAccountOperators() *cobra.Command { + cmd := &cobra.Command{ + Use: "revoke-account-operators [addresses]", + Short: "Broadcast message revoke-account-operators", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgRevokeAccountOperators( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_revoke_doc_issuer.go b/x/electoral/client/cli/tx_revoke_doc_issuer.go new file mode 100644 index 00000000..6f461073 --- /dev/null +++ b/x/electoral/client/cli/tx_revoke_doc_issuer.go @@ -0,0 +1,42 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdRevokeDocIssuers() *cobra.Command { + cmd := &cobra.Command{ + Use: "revoke-doc-issuers [addresses]", + Short: "Broadcast message revoke-doc-issuers", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgRevokeDocIssuers( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_revoke_id_signers.go b/x/electoral/client/cli/tx_revoke_id_signers.go new file mode 100644 index 00000000..716d2367 --- /dev/null +++ b/x/electoral/client/cli/tx_revoke_id_signers.go @@ -0,0 +1,42 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdRevokeIdSigners() *cobra.Command { + cmd := &cobra.Command{ + Use: "revoke-id-signers [addresses]", + Short: "Broadcast message revoke-id-signers", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgRevokeIdSigners( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_revoke_loaders.go b/x/electoral/client/cli/tx_revoke_loaders.go new file mode 100644 index 00000000..eb5e207a --- /dev/null +++ b/x/electoral/client/cli/tx_revoke_loaders.go @@ -0,0 +1,86 @@ +package cli + +import ( + "github.com/sharering/shareledger/x/utils" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdRevokeLoaders() *cobra.Command { + cmd := &cobra.Command{ + Use: "revoke-loaders [addresses]", + Short: "Broadcast message revoke-loaders", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgRevokeLoaders( + clientCtx.GetFromAddress().String(), + args[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdRevokeLoadersFromFile() *cobra.Command { + cmd := &cobra.Command{ + Use: "revoke-loaders-from-file [filepath]", + Short: "revoke shrp loaders from file path", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + addrList, err := utils.GetAddressFromFile(args[0]) + if err != nil { + return err + } + lenAddr := len(addrList) + reqAddr := make([]string, 0, 5) + for i := 0; i < lenAddr; i++ { + reqAddr = append(reqAddr, addrList[i]) + // Send 5 addresses per time. Following the old logic of cli + if (i+1)%5 == 0 || i == lenAddr-1 { + msg := types.NewMsgRevokeLoaders( + clientCtx.GetFromAddress().String(), + reqAddr[:], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + if err := tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg); err != nil { + return err + } + reqAddr = make([]string, 0, 5) + } + } + return nil + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/cli/tx_revoke_voter.go b/x/electoral/client/cli/tx_revoke_voter.go new file mode 100644 index 00000000..dc98555c --- /dev/null +++ b/x/electoral/client/cli/tx_revoke_voter.go @@ -0,0 +1,43 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ = strconv.Itoa(0) + +func CmdRevokeVoter() *cobra.Command { + cmd := &cobra.Command{ + Use: "revoke-voter [address]", + Short: "Broadcast message revoke-voter", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argAddress := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgRevokeVoter( + clientCtx.GetFromAddress().String(), + argAddress, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/electoral/client/rest/rest.go b/x/electoral/client/rest/rest.go deleted file mode 100644 index 1d686fd8..00000000 --- a/x/electoral/client/rest/rest.go +++ /dev/null @@ -1,15 +0,0 @@ -package rest - -import ( - "github.com/cosmos/cosmos-sdk/client/context" - - "github.com/gorilla/mux" -) - -const ( - restName = "name" -) - -// RegisterRoutes - Central function to define routes that get registered by the main application -func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, storeName string) { -} diff --git a/x/electoral/client/tests/cli_test.go b/x/electoral/client/tests/cli_test.go new file mode 100644 index 00000000..0d1e2be1 --- /dev/null +++ b/x/electoral/client/tests/cli_test.go @@ -0,0 +1,24 @@ +package tests + +import ( + "github.com/sharering/shareledger/cmd/Shareledgerd/cli" + "sync" + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/sharering/shareledger/testutil/network" +) + +var runOnce = sync.Once{} + +func init() { + runOnce.Do(func() { + cli.InitMiddleWare() + }) +} +func TestElectoralModule(t *testing.T) { + cf := network.ShareLedgerTestingConfig() + cf.NumValidators = 2 + suite.Run(t, NewElectoralIntegrationTestSuite(cf)) +} diff --git a/x/electoral/client/tests/suite.go b/x/electoral/client/tests/suite.go new file mode 100644 index 00000000..e73da9ef --- /dev/null +++ b/x/electoral/client/tests/suite.go @@ -0,0 +1,531 @@ +package tests + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + netutilts "github.com/sharering/shareledger/testutil/network" + types2 "github.com/sharering/shareledger/x/electoral/types" + "github.com/stretchr/testify/suite" + "os" +) + +type ElectoralIntegrationTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network + dir string +} + +func NewElectoralIntegrationTestSuite(cf network.Config) *ElectoralIntegrationTestSuite { + return &ElectoralIntegrationTestSuite{ + cfg: cf, + } +} + +func (s *ElectoralIntegrationTestSuite) setupTestMaterial() { + s.T().Log("setting up user operator") + + out, _ := ExCmdEnrollAccountOperator(s.network.Validators[0].ClientCtx, + []string{netutilts.Accounts[netutilts.KeyOperator].String()}, + netutilts.SHRFee2, + netutilts.MakeByAccount(netutilts.KeyAuthority), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(netutilts.ShareLedgerSuccessCode, txResponse.Code, "%s", out.String()) + + intData := struct { + Operator []string + DocIssuer []string + IdSigner []string + }{ + Operator: []string{ + "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + "shareledger1cfyrlfknvufzqap3yqsnyk4hxtp3xrqh7jlysm", + }, + DocIssuer: []string{ + "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + "shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + }, + IdSigner: []string{ + "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + "shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8", + }, + } + + if len(intData.IdSigner) != 0 { + out, err := ExCmdEnrollIdSigner(s.network.Validators[0].ClientCtx, + intData.IdSigner, + netutilts.SHRFee2, + netutilts.MakeByAccount(netutilts.KeyOperator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + ) + if err != nil { + s.Require().NoError(err, "init id signer fail") + } + s.Require().NoError(s.network.WaitForNextBlock()) + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(netutilts.ShareLedgerSuccessCode, txResponse.Code, "%s", out.String()) + } + if len(intData.Operator) != 0 { + out, err := ExCmdEnrollAccountOperator(s.network.Validators[0].ClientCtx, + intData.Operator, + netutilts.SHRFee2, + netutilts.MakeByAccount(netutilts.KeyAuthority), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + ) + if err != nil { + s.Require().NoError(err, "init operator fail") + } + s.Require().NoError(s.network.WaitForNextBlock()) + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(netutilts.ShareLedgerSuccessCode, txResponse.Code, "%s", out.String()) + } + + if len(intData.DocIssuer) != 0 { + out, err := ExCmdEnrollDocIssuer(s.network.Validators[0].ClientCtx, + intData.DocIssuer, + netutilts.SHRFee2, + netutilts.MakeByAccount(netutilts.KeyOperator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + ) + if err != nil { + s.Require().NoError(err, "init doc issuer fail") + } + s.Require().NoError(s.network.WaitForNextBlock()) + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equal(netutilts.ShareLedgerSuccessCode, txResponse.Code, "%s", out.String()) + } +} + +func (s *ElectoralIntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite for document module") + kb, dir := netutilts.GetTestingGenesis(s.T(), &s.cfg) + s.dir = dir + + s.network = network.New(s.T(), s.cfg) + _, err := s.network.WaitForHeight(1) + s.Require().NoError(err) + + //override the keyring by our keyring information + s.network.Validators[0].ClientCtx.Keyring = kb + s.setupTestMaterial() + s.T().Log("setting up integration test suite successfully") + +} +func (s *ElectoralIntegrationTestSuite) TearDownSuite() { + s.network.Cleanup() + s.NoError(os.RemoveAll(s.dir), "fail to cleanup") + s.T().Log("tearing down integration test suite") +} + +func (s *ElectoralIntegrationTestSuite) TestEnrollAccountOperator() { + + testSuite := []struct { + d string + iAddress []string + txCreator string + txFee int + oErr error + oRes *types.TxResponse + oAccState []types2.AccState + }{ + { + d: "enroll_account_operator", + iAddress: []string{"shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep"}, + txCreator: netutilts.KeyAuthority, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAccState: []types2.AccState{ + { + Key: "accopshareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + Address: "shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep", + Status: "active", + }, + }, + }, + { + d: "enroll_account_operator_but_not_authority", + iAddress: []string{"shareledger18ncqa238qk0xxpgq5v9yz88p79r0mc3tt0yyvx"}, + txCreator: netutilts.KeyAccount1, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err := ExCmdEnrollAccountOperator(validatorCtx, tc.iAddress, + netutilts.SHRFee(tc.txFee), + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.d) + } + + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Require().NoError(s.network.WaitForNextBlock()) + if tc.oRes != nil { + s.Equal(tc.oRes.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + + if len(tc.oAccState) != 0 { + for _, a := range tc.oAccState { + accOut, err := ExCmdQueryAccountOperator(validatorCtx, a.Address, netutilts.JSONFlag) + s.Require().NoError(err, "fail to get account operator") + acc := JsonAccountOperatorUnmarshal(s.T(), accOut.Bytes()) + s.Equal(a.GetKey(), acc.GetAccState().Key, "account operator key no equal") + s.Equal(a.GetAddress(), acc.GetAccState().Address, "account operator address no equal") + s.Equal(a.GetStatus(), acc.GetAccState().Status, "account operator status no equal") + } + } + }) + } + +} + +func (s *ElectoralIntegrationTestSuite) TestRevokeAccountOperator() { + + testSuite := []struct { + d string + iAddress []string + txCreator string + txFee int + oErr error + oRes *types.TxResponse + oAccState []types2.AccState + }{ + { + d: "revoke_account_operator", + iAddress: []string{"shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg"}, + txCreator: netutilts.KeyAuthority, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAccState: []types2.AccState{ + { + Key: "accopshareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + Address: "shareledger1tc9yej24s698vm5w0jvt7452mgxl3ck74nqxjg", + Status: "inactive", + }, + }, + }, + { + d: "enroll_account_operator_but_not_authority", + iAddress: []string{"shareledger1cfyrlfknvufzqap3yqsnyk4hxtp3xrqh7jlysm"}, + txCreator: netutilts.KeyAccount1, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err := ExCmdRevokeAccountOperator(validatorCtx, tc.iAddress, + netutilts.SHRFee(tc.txFee), + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.d) + } + + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Require().NoError(s.network.WaitForNextBlock()) + if tc.oRes != nil { + s.Equal(tc.oRes.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + + if len(tc.oAccState) != 0 { + for _, a := range tc.oAccState { + accOut, err := ExCmdQueryAccountOperator(validatorCtx, a.Address, netutilts.JSONFlag) + s.Require().NoErrorf(err, "fail to get account operator %s", a.Address) + acc := JsonAccountOperatorUnmarshal(s.T(), accOut.Bytes()) + s.Equal(a.GetStatus(), acc.GetAccState().Status, "account operator status no equal") + } + } + }) + } + +} + +func (s *ElectoralIntegrationTestSuite) TestEnrollDocIssuer() { + + testSuite := []struct { + d string + iAddress []string + txCreator string + txFee int + oErr error + oRes *types.TxResponse + oAccState []types2.AccState + }{ + { + d: "enroll_doc_issuer", + iAddress: []string{"shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq"}, + txCreator: netutilts.KeyOperator, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAccState: []types2.AccState{ + { + Key: "docIssuershareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + Address: "shareledger1syxg95th7whx23fn6vwaan34w4kal49azlawnq", + Status: "active", + }, + }, + }, + { + d: "enroll_doc_issuer_but_not_authority", + iAddress: []string{"shareledger18ncqa238qk0xxpgq5v9yz88p79r0mc3tt0yyvx"}, + txCreator: netutilts.KeyAccount1, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err := ExCmdEnrollDocIssuer(validatorCtx, tc.iAddress, + netutilts.SHRFee(tc.txFee), + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.d) + } + + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Require().NoError(s.network.WaitForNextBlock()) + if tc.oRes != nil { + s.Equal(tc.oRes.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + + if len(tc.oAccState) != 0 { + for _, a := range tc.oAccState { + accOut, err := ExCmdGetDocIssuer(validatorCtx, a.Address, netutilts.JSONFlag) + s.Require().NoError(err, "fail to get doc issuer") + acc := JsonIDSignerUnmarshal(s.T(), accOut.Bytes()) + s.Equal(a.GetKey(), acc.GetAccState().Key, "doc issuer key no equal") + s.Equal(a.GetAddress(), acc.GetAccState().Address, "doc issuer address no equal") + s.Equal(a.GetStatus(), acc.GetAccState().Status, "doc issuer status no equal") + } + } + }) + } +} + +func (s *ElectoralIntegrationTestSuite) TestRevokeDocIssuer() { + + testSuite := []struct { + d string + iAddress []string + txCreator string + txFee int + oErr error + oRes *types.TxResponse + oAccState []types2.AccState + }{ + { + d: "reovke_doc_issuer_successfully", + iAddress: []string{"shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8"}, + txCreator: netutilts.KeyOperator, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAccState: []types2.AccState{ + { + Key: "docIssuershareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + Address: "shareledger19w2g2pdcwpj5kutn6ve3r4ay5twptlejlcvkq8", + Status: "inactive", + }, + }, + }, + { + d: "revoke_doc_issuer_but_not_authority", + iAddress: []string{"shareledger1pasya6jtvglu9q36nl3tqh5drqzeh0s98czrep"}, + txCreator: netutilts.KeyAccount1, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err := ExCmdRevokeDocIssuer(validatorCtx, tc.iAddress, + netutilts.SHRFee(tc.txFee), + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.d) + } + + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Require().NoError(s.network.WaitForNextBlock()) + if tc.oRes != nil { + s.Equal(tc.oRes.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + + if len(tc.oAccState) != 0 { + for _, a := range tc.oAccState { + accOut, err := ExCmdGetDocIssuer(validatorCtx, a.Address, netutilts.JSONFlag) + s.Require().NoError(err, "fail to get doc issuer") + acc := JsonIDSignerUnmarshal(s.T(), accOut.Bytes()) + s.Equal(a.GetKey(), acc.GetAccState().Key, "doc issuer key no equal") + s.Equal(a.GetAddress(), acc.GetAccState().Address, "doc issuer address no equal") + s.Equal(a.GetStatus(), acc.GetAccState().Status, "doc issuer status no equal") + } + } + }) + } +} + +func (s *ElectoralIntegrationTestSuite) TestEnrollIDSigner() { + + testSuite := []struct { + d string + iAddress []string + txCreator string + txFee int + oErr error + oRes *types.TxResponse + oAccState []types2.AccState + }{ + { + d: "enroll_id_signer", + iAddress: []string{"shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf"}, + txCreator: netutilts.KeyOperator, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAccState: []types2.AccState{ + { + Key: "idsignershareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + Address: "shareledger1dtd4krk8e69y9pze43qkprsqqpsaxljuus3maf", + Status: "active", + }, + }, + }, + { + d: "enroll_id_signer_but_not_authority", + iAddress: []string{"shareledger18ncqa238qk0xxpgq5v9yz88p79r0mc3tt0yyvx"}, + txCreator: netutilts.KeyAccount1, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err := ExCmdEnrollIdSigner(validatorCtx, tc.iAddress, + netutilts.SHRFee(tc.txFee), + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.d) + } + + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Require().NoError(s.network.WaitForNextBlock()) + if tc.oRes != nil { + s.Equal(tc.oRes.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + + if len(tc.oAccState) != 0 { + for _, a := range tc.oAccState { + accOut, err := ExCmdGetIdSigner(validatorCtx, a.Address, netutilts.JSONFlag) + s.Require().NoError(err, "fail to get doc issuer") + acc := JsonIDSignerUnmarshal(s.T(), accOut.Bytes()) + s.Equal(a.GetKey(), acc.GetAccState().Key, "doc issuer key no equal") + s.Equal(a.GetAddress(), acc.GetAccState().Address, "doc issuer address no equal") + s.Equal(a.GetStatus(), acc.GetAccState().Status, "doc issuer status no equal") + } + } + }) + } +} + +func (s *ElectoralIntegrationTestSuite) TestRevokeIDSigner() { + + testSuite := []struct { + d string + iAddress []string + txCreator string + txFee int + oErr error + oRes *types.TxResponse + oAccState []types2.AccState + }{ + { + d: "revoke_id_signer", + iAddress: []string{"shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5"}, + txCreator: netutilts.KeyOperator, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oAccState: []types2.AccState{ + { + Key: "idsignershareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + Address: "shareledger1sx9dp9289h8lxvg0u9z4g77y93zplvq63stkd5", + Status: "inactive", + }, + }, + }, + { + d: "revoke_id_signer_but_not_authority", + iAddress: []string{"shareledger1kcu0fdn5f07wq9534yqy3t78p3uuc5rawsshe8"}, + txCreator: netutilts.KeyAccount1, + txFee: 2, + oErr: nil, + oRes: &types.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err := ExCmdRevokeIdSigner(validatorCtx, tc.iAddress, + netutilts.SHRFee(tc.txFee), + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + if tc.oErr != nil { + s.NotNilf(err, "case %s require error this step", tc.d) + } + + txnResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Require().NoError(s.network.WaitForNextBlock()) + if tc.oRes != nil { + s.Equal(tc.oRes.Code, txnResponse.Code, fmt.Sprintf("the case %s: raw log :%s", tc.d, txnResponse.String())) + } + + if len(tc.oAccState) != 0 { + for _, a := range tc.oAccState { + accOut, err := ExCmdGetIdSigner(validatorCtx, a.Address, netutilts.JSONFlag) + s.Require().NoError(err, "fail to get doc issuer") + acc := JsonIDSignerUnmarshal(s.T(), accOut.Bytes()) + s.Equal(a.GetKey(), acc.GetAccState().Key, "doc issuer key no equal") + s.Equal(a.GetAddress(), acc.GetAccState().Address, "doc issuer address no equal") + s.Equal(a.GetStatus(), acc.GetAccState().Status, "doc issuer status no equal") + } + } + }) + } +} diff --git a/x/electoral/client/tests/test_helpers.go b/x/electoral/client/tests/test_helpers.go new file mode 100644 index 00000000..4d840d7a --- /dev/null +++ b/x/electoral/client/tests/test_helpers.go @@ -0,0 +1,152 @@ +package tests + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/stretchr/testify/require" + "github.com/tendermint/spm/cosmoscmd" + + "github.com/sharering/shareledger/app" + "github.com/sharering/shareledger/x/electoral/client/cli" + "github.com/sharering/shareledger/x/electoral/types" +) + +func ExCmdEnrollDocIssuer(clientCtx client.Context, address []string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := append(address, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdEnrollDocIssuers(), args) +} +func ExCmdRevokeDocIssuer(clientCtx client.Context, address []string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := append(address, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdRevokeDocIssuers(), args) + +} + +func ExCmdGetDocIssuers(clientCtx client.Context, t *testing.T, additionalFlags ...string) (testutil.BufferWriter, error) { + var args []string + args = append(args, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdDocumentIssuers(), args) +} + +func ExCmdGetDocIssuer(clientCtx client.Context, address string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{address} + args = append(args, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdDocumentIssuer(), args) +} + +func ExCmdEnrollAccountOperator(clientCtx client.Context, address []string, additionalFlags ...string) (testutil.BufferWriter, error) { + + args := append(address, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdEnrollAccountOperators(), args) +} +func ExCmdQueryAccountOperator(clientCtx client.Context, address string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{address} + args = append(args, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdAccountOperator(), args) +} +func ExCmdRevokeAccountOperator(clientCtx client.Context, address []string, additionalFlags ...string) (testutil.BufferWriter, error) { + + args := append(address, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdRevokeAccountOperators(), args) +} + +func ExCmdEnrollIdSigner(clientCtx client.Context, address []string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := append(address, additionalFlags...) + + args = append(args, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdEnrollIdSigners(), args) +} +func ExCmdRevokeIdSigner(clientCtx client.Context, address []string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := append(address, additionalFlags...) + + args = append(args, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdRevokeIdSigners(), args) +} +func ExCmdGetIdSigner(clientCtx client.Context, address string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{address} + args = append(args, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdIdSigner(), args) +} + +func ExCmdEnrollLoader(clientCtx client.Context, t *testing.T, address string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{address} + args = append(args, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdEnrollLoaders(), args) +} +func ExCmdRevokeLoader(clientCtx client.Context, t *testing.T, address string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{address} + args = append(args, additionalFlags...) + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdRevokeLoaders(), args) +} +func ExCmdGetLoader(clientCtx client.Context, t *testing.T, address string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{address} + args = append(args, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdGetLoader(), args) +} + +func ExCmdEnrollVoters(clientCtx client.Context, t *testing.T, address string, additionalFlags ...string) (testutil.BufferWriter, error) { + args := []string{address} + args = append(args, additionalFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdEnrollVoter(), args) +} + +//func ExCmdRevokeVoter(clientCtx client.Context, t *testing.T, address string, additionalFlags ...string) (testutil.BufferWriter, error) { +// args := []string{address} +// args = append(args, additionalFlags...) +// +// return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdRevokeVoter(), args) +//} +//func ExCmdGetVoter(clientCtx client.Context, t *testing.T, address string, additionalFlags ...string) (testutil.BufferWriter, error) { +// args := []string{address} +// args = append(args, additionalFlags...) +// return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdGetVoter(), args) +//} + +//func JsonVoterUnmarshal(t *testing.T, bz []byte) types.QueryGetLoaderResponse { +// var a types.QueryGetLoaderResponse +// encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) +// err := encCfg.Marshaler.UnmarshalJSON(bz, &a) +// require.NoError(t, err) +// return a +//} + +func JsonAccountOperatorUnmarshal(t *testing.T, bz []byte) types.QueryAccountOperatorResponse { + var a types.QueryAccountOperatorResponse + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(bz, &a) + require.NoError(t, err) + return a +} +func JsonDocIssuerUnmarshal(t *testing.T, bz []byte) types.QueryDocumentIssuerResponse { + var a types.QueryDocumentIssuerResponse + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(bz, &a) + require.NoError(t, err) + return a +} +func JsonIDSignerUnmarshal(t *testing.T, bz []byte) types.QueryIdSignerResponse { + var a types.QueryIdSignerResponse + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(bz, &a) + require.NoError(t, err) + return a +} + +//func JsonLoaderUnmarshal(t *testing.T, bz []byte) types.QueryGetLoaderResponse { +// var a types.QueryGetLoaderResponse +// encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) +// err := encCfg.Marshaler.UnmarshalJSON(bz, &a) +// require.NoError(t, err) +// return a +//} diff --git a/x/electoral/events.go b/x/electoral/events.go deleted file mode 100644 index aec508de..00000000 --- a/x/electoral/events.go +++ /dev/null @@ -1,10 +0,0 @@ -package electoral - -const ( - EventTypeBookingStart = "BookingStart" - EventTypeBookingComplete = "BookingComplete" - - AttributeAmount = "Amount" - AttributeBookingID = "BookingId" - AttributeUUID = "UUID" -) diff --git a/x/electoral/genesis.go b/x/electoral/genesis.go index 78891401..8ed11281 100644 --- a/x/electoral/genesis.go +++ b/x/electoral/genesis.go @@ -1,58 +1,45 @@ package electoral import ( - "encoding/json" - - "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/keeper" "github.com/sharering/shareledger/x/electoral/types" ) -type GenesisState struct { - Addresses []sdk.AccAddress `json:"Addresses"` -} - -func NewGenesisState(addrs []sdk.AccAddress) GenesisState { - return GenesisState{ - Addresses: addrs, - } -} - -func ValidateGenesis(data GenesisState) error { - return nil -} - -func DefaultGenesisState() GenesisState { - return GenesisState{} -} - -func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { - for _, addr := range data.Addresses { - voterID := VoterPrefix + addr.String() - keeper.SetVoterAddress(ctx, voterID, addr) - keeper.SetVoterStatus(ctx, voterID, types.StatusVoterEnrolled) +// InitGenesis initializes the capability module's state from a provided genesis +// state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + // Set all the accState + for _, elem := range genState.AccStateList { + k.SetAccState(ctx, elem) } -} - -func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState { - var voterAddresses []sdk.AccAddress - cb := func(voter types.Voter) bool { - if voter.Status == types.StatusVoterEnrolled { - voterAddresses = append(voterAddresses, voter.Address) - } - return false + // Set if defined + if genState.Authority != nil { + k.SetAuthority(ctx, *genState.Authority) } - k.IterateVoters(ctx, cb) - return GenesisState{ - Addresses: voterAddresses, + // Set if defined + if genState.Treasurer != nil { + k.SetTreasurer(ctx, *genState.Treasurer) } + // this line is used by starport scaffolding # genesis/module/init } -func GetGenesisStateFromAppState(cdc *codec.Codec, appState map[string]json.RawMessage) GenesisState { - var genesisState GenesisState - if appState[ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) +// ExportGenesis returns the capability module's exported genesis. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() + + genesis.AccStateList = k.GetAllAccState(ctx) + // Get all authority + authority, found := k.GetAuthority(ctx) + if found { + genesis.Authority = &authority + } + // Get all treasurer + treasurer, found := k.GetTreasurer(ctx) + if found { + genesis.Treasurer = &treasurer } + // this line is used by starport scaffolding # genesis/module/export - return genesisState + return genesis } diff --git a/x/electoral/genesis_test.go b/x/electoral/genesis_test.go new file mode 100644 index 00000000..4f78f18c --- /dev/null +++ b/x/electoral/genesis_test.go @@ -0,0 +1,41 @@ +package electoral_test + +import ( + "testing" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/electoral" + "github.com/sharering/shareledger/x/electoral/types" + "github.com/stretchr/testify/require" +) + +func TestGenesis(t *testing.T) { + genesisState := types.GenesisState{ + AccStateList: []types.AccState{ + { + Key: "0", + }, + { + Key: "1", + }, + }, + Authority: &types.Authority{ + Address: "address", + }, + Treasurer: &types.Treasurer{ + Address: "address", + }, + // this line is used by starport scaffolding # genesis/test/state + } + + k, ctx := keepertest.ElectoralKeeper(t) + electoral.InitGenesis(ctx, *k, genesisState) + got := electoral.ExportGenesis(ctx, *k) + require.NotNil(t, got) + + require.Len(t, got.AccStateList, len(genesisState.AccStateList)) + require.Subset(t, genesisState.AccStateList, got.AccStateList) + require.Equal(t, genesisState.Authority, got.Authority) + require.Equal(t, genesisState.Treasurer, got.Treasurer) + // this line is used by starport scaffolding # genesis/test/assert +} diff --git a/x/electoral/handler.go b/x/electoral/handler.go index 75778ed0..8a4f5d04 100644 --- a/x/electoral/handler.go +++ b/x/electoral/handler.go @@ -5,62 +5,52 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/electoral/keeper" "github.com/sharering/shareledger/x/electoral/types" ) -const ( - VoterPrefix = "voter" -) +// NewHandler ... +func NewHandler(k keeper.Keeper) sdk.Handler { + msgServer := keeper.NewMsgServerImpl(k) -func NewHandler(keeper Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + ctx = ctx.WithEventManager(sdk.NewEventManager()) + switch msg := msg.(type) { - case MsgEnrollVoter: - return handleMsgEnrollVoter(ctx, keeper, msg) - case MsgRevokeVoter: - return handleMsgRevokeVoter(ctx, keeper, msg) + case *types.MsgEnrollVoter: + res, err := msgServer.EnrollVoter(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRevokeVoter: + res, err := msgServer.RevokeVoter(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgEnrollLoaders: + res, err := msgServer.EnrollLoaders(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRevokeLoaders: + res, err := msgServer.RevokeLoaders(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgEnrollIdSigners: + res, err := msgServer.EnrollIdSigners(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRevokeIdSigners: + res, err := msgServer.RevokeIdSigners(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgEnrollDocIssuers: + res, err := msgServer.EnrollDocIssuers(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRevokeDocIssuers: + res, err := msgServer.RevokeDocIssuers(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgEnrollAccountOperators: + res, err := msgServer.EnrollAccountOperators(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRevokeAccountOperators: + res, err := msgServer.RevokeAccountOperators(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + // this line is used by starport scaffolding # 1 default: - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, fmt.Sprintf("Unrecognized booking Msg type: %v", msg.Type())) + errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) + return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } } - -func handleMsgEnrollVoter(ctx sdk.Context, keeper Keeper, msg MsgEnrollVoter) (*sdk.Result, error) { - if !keeper.IsAuthority(ctx, msg.GetSigners()[0]) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not authority") - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - voterKey := VoterPrefix + msg.Voter.String() - keeper.SetVoterAddress(ctx, voterKey, msg.Voter) - keeper.SetVoterStatus(ctx, voterKey, types.StatusVoterEnrolled) - log := fmt.Sprintf("Successfully enroll voter % s", msg.Voter.String()) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgRevokeVoter(ctx sdk.Context, keeper Keeper, msg MsgRevokeVoter) (*sdk.Result, error) { - if !keeper.IsAuthority(ctx, msg.GetSigners()[0]) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not authority") - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - voterKey := VoterPrefix + msg.Voter.String() - if !keeper.IsVoterPresent(ctx, voterKey) { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Voter is not enrolled") - } - keeper.DeleteVoter(ctx, voterKey) - log := fmt.Sprintf("Successfully delete voter %s", msg.Voter.String()) - return &sdk.Result{ - Log: log, - }, nil -} - -func IsEnrolledVoter(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - addr := VoterPrefix + address.String() - status := k.GetVoterStatus(ctx, addr) - return status == types.StatusVoterEnrolled -} diff --git a/x/electoral/keeper/acc_state.go b/x/electoral/keeper/acc_state.go new file mode 100644 index 00000000..36831a8b --- /dev/null +++ b/x/electoral/keeper/acc_state.go @@ -0,0 +1,181 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k Keeper) isActive(ctx sdk.Context, address sdk.AccAddress, keyType types.AccStateKeyType) bool { + key := types.GenAccStateIndexKey(address, keyType) + r, found := k.GetAccState(ctx, key) + return found && r.Status == string(types.StatusActive) +} + +func (k Keeper) activeShrpLoader(ctx sdk.Context, addr sdk.AccAddress) { + key := types.GenAccStateIndexKey(addr, types.AccStateKeyShrpLoaders) + k.SetAccState(ctx, types.AccState{ + Key: string(key), + Address: addr.String(), + Status: string(types.StatusActive), + }) +} + +func (k Keeper) activeIdSigner(ctx sdk.Context, addr sdk.AccAddress) { + key := types.GenAccStateIndexKey(addr, types.AccStateKeyIdSigner) + k.SetAccState(ctx, types.AccState{ + Key: string(key), + Address: addr.String(), + Status: string(types.StatusActive), + }) +} + +func (k Keeper) activeDocIssuer(ctx sdk.Context, addr sdk.AccAddress) { + key := types.GenAccStateIndexKey(addr, types.AccStateKeyDocIssuer) + k.SetAccState(ctx, types.AccState{ + Key: string(key), + Address: addr.String(), + Status: string(types.StatusActive), + }) +} + +func (k Keeper) activeAccOperator(ctx sdk.Context, addr sdk.AccAddress) { + key := types.GenAccStateIndexKey(addr, types.AccStateKeyAccOp) + k.SetAccState(ctx, types.AccState{ + Key: string(key), + Address: addr.String(), + Status: string(types.StatusActive), + }) +} + +func (k Keeper) activeVoter(ctx sdk.Context, addr sdk.AccAddress) { + key := types.GenAccStateIndexKey(addr, types.AccStateKeyVoter) + k.SetAccState(ctx, types.AccState{ + Key: string(key), + Address: addr.String(), + Status: string(types.StatusActive), + }) +} + +func (k Keeper) revokeAccOperator(ctx sdk.Context, addr sdk.AccAddress) (err error) { + return k.revokeAccAccount(ctx, addr, types.AccStateKeyAccOp) +} +func (k Keeper) revokeShrpLoader(ctx sdk.Context, addr sdk.AccAddress) (err error) { + return k.revokeAccAccount(ctx, addr, types.AccStateKeyShrpLoaders) +} + +// revokeDocIssuer set addr doc issuer to inactive +// return err if there is passed addr not found +func (k Keeper) revokeDocIssuer(ctx sdk.Context, addr sdk.AccAddress) (err error) { + return k.revokeAccAccount(ctx, addr, types.AccStateKeyDocIssuer) +} + +// revokeIdSigner set addr signer to inactive +// return err if there is passed addr not found +func (k Keeper) revokeIdSigner(ctx sdk.Context, addr sdk.AccAddress) (err error) { + return k.revokeAccAccount(ctx, addr, types.AccStateKeyIdSigner) +} + +func (k Keeper) revokeVoter(ctx sdk.Context, addr sdk.AccAddress) (err error) { + return k.revokeAccAccount(ctx, addr, types.AccStateKeyVoter) +} + +func (k Keeper) revokeAccAccount(ctx sdk.Context, addr sdk.AccAddress, keyType types.AccStateKeyType) error { + key := types.GenAccStateIndexKey(addr, keyType) + r, found := k.GetAccState(ctx, key) + if !found { + return sdkerrors.ErrNotFound + } + r.Status = string(types.StatusInactive) + k.SetAccState(ctx, r) + return nil +} + +// SetAccState set a specific accState in the store from its index +func (k Keeper) SetAccState(ctx sdk.Context, accState types.AccState) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AccStateKeyPrefix)) + b := k.cdc.MustMarshal(&accState) + store.Set(types.AccStateKey( + types.IndexKeyAccState(accState.Key), + ), b) +} + +func (k Keeper) GetAccStateByAddress( + ctx sdk.Context, + addr sdk.AccAddress, + typeAccState types.AccStateKeyType, +) (val types.AccState, found bool) { + key := types.GenAccStateIndexKey(addr, typeAccState) + return k.GetAccState(ctx, key) +} + +// GetAccState returns a accState from its index +func (k Keeper) GetAccState( + ctx sdk.Context, + key types.IndexKeyAccState, + +) (val types.AccState, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AccStateKeyPrefix)) + + b := store.Get(types.AccStateKey( + key, + )) + if b == nil { + return val, false + } + + k.cdc.MustUnmarshal(b, &val) + return val, true +} + +// RemoveAccState removes a accState from the store +func (k Keeper) RemoveAccState( + ctx sdk.Context, + key types.IndexKeyAccState, + +) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AccStateKeyPrefix)) + store.Delete(types.AccStateKey( + key, + )) +} + +// GetAllAccState returns all accState +func (k Keeper) GetAllAccState(ctx sdk.Context) (list []types.AccState) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AccStateKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer func() { + if err := iterator.Close(); err != nil { + ctx.Logger().Error(err.Error()) + } + }() + + for ; iterator.Valid(); iterator.Next() { + var val types.AccState + k.cdc.MustUnmarshal(iterator.Value(), &val) + list = append(list, val) + } + + return +} + +func (k Keeper) IterateAccState(ctx sdk.Context, accTypeIndex types.AccStateKeyType) (list []types.AccState) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AccStateKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte(accTypeIndex)) + + defer func() { + if err := iterator.Close(); err != nil { + ctx.Logger().Error(err.Error()) + } + }() + + for ; iterator.Valid(); iterator.Next() { + var val types.AccState + k.cdc.MustUnmarshal(iterator.Value(), &val) + list = append(list, val) + } + + return +} diff --git a/x/electoral/keeper/acc_state_test.go b/x/electoral/keeper/acc_state_test.go new file mode 100644 index 00000000..77296db8 --- /dev/null +++ b/x/electoral/keeper/acc_state_test.go @@ -0,0 +1,58 @@ +package keeper_test + +import ( + "github.com/sharering/shareledger/testutil/sample" + "strconv" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/electoral/keeper" + "github.com/sharering/shareledger/x/electoral/types" + "github.com/stretchr/testify/require" +) + +// Prevent strconv unused error +var _ = strconv.IntSize + +func createNAccState(keeper *keeper.Keeper, ctx sdk.Context, n int) []types.AccState { + items := make([]types.AccState, n) + for i := range items { + addr, _ := sdk.AccAddressFromBech32(sample.AccAddress()) + items[i].Key = string(types.GenAccStateIndexKey(addr, types.AccStateKeyIdSigner)) + + keeper.SetAccState(ctx, items[i]) + } + return items +} + +func TestAccStateGet(t *testing.T) { + k, ctx := keepertest.ElectoralKeeper(t) + items := createNAccState(k, ctx, 10) + for _, item := range items { + rst, found := k.GetAccState(ctx, + types.IndexKeyAccState(item.Key), + ) + require.True(t, found) + require.Equal(t, item, rst) + } +} +func TestAccStateRemove(t *testing.T) { + k, ctx := keepertest.ElectoralKeeper(t) + items := createNAccState(k, ctx, 10) + for _, item := range items { + k.RemoveAccState(ctx, + types.IndexKeyAccState(item.Key), + ) + _, found := k.GetAccState(ctx, + types.IndexKeyAccState(item.Key), + ) + require.False(t, found) + } +} + +func TestAccStateGetAll(t *testing.T) { + k, ctx := keepertest.ElectoralKeeper(t) + items := createNAccState(k, ctx, 10) + require.ElementsMatch(t, items, k.GetAllAccState(ctx)) +} diff --git a/x/electoral/keeper/authority.go b/x/electoral/keeper/authority.go new file mode 100644 index 00000000..1ea0049b --- /dev/null +++ b/x/electoral/keeper/authority.go @@ -0,0 +1,33 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +// SetAuthority set authority in the store +func (k Keeper) SetAuthority(ctx sdk.Context, authority types.Authority) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AuthorityKey)) + b := k.cdc.MustMarshal(&authority) + store.Set([]byte{0}, b) +} + +// GetAuthority returns authority +func (k Keeper) GetAuthority(ctx sdk.Context) (val types.Authority, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AuthorityKey)) + + b := store.Get([]byte{0}) + if b == nil { + return val, false + } + + k.cdc.MustUnmarshal(b, &val) + return val, true +} + +// RemoveAuthority removes authority from the store +func (k Keeper) RemoveAuthority(ctx sdk.Context) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AuthorityKey)) + store.Delete([]byte{0}) +} diff --git a/x/electoral/keeper/authority_test.go b/x/electoral/keeper/authority_test.go new file mode 100644 index 00000000..4ddf12cb --- /dev/null +++ b/x/electoral/keeper/authority_test.go @@ -0,0 +1,33 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/electoral/keeper" + "github.com/sharering/shareledger/x/electoral/types" +) + +func createTestAuthority(keeper *keeper.Keeper, ctx sdk.Context) types.Authority { + item := types.Authority{} + keeper.SetAuthority(ctx, item) + return item +} + +func TestAuthorityGet(t *testing.T) { + keeper, ctx := keepertest.ElectoralKeeper(t) + item := createTestAuthority(keeper, ctx) + rst, found := keeper.GetAuthority(ctx) + require.True(t, found) + require.Equal(t, item, rst) +} +func TestAuthorityRemove(t *testing.T) { + keeper, ctx := keepertest.ElectoralKeeper(t) + createTestAuthority(keeper, ctx) + keeper.RemoveAuthority(ctx) + _, found := keeper.GetAuthority(ctx) + require.False(t, found) +} diff --git a/x/electoral/keeper/dependency.go b/x/electoral/keeper/dependency.go new file mode 100644 index 00000000..6fa621b2 --- /dev/null +++ b/x/electoral/keeper/dependency.go @@ -0,0 +1,7 @@ +package keeper + +import sdk "github.com/cosmos/cosmos-sdk/types" + +type GentlemintKeeper interface { + LoadAllowanceLoader(ctx sdk.Context, addr sdk.AccAddress) error +} diff --git a/x/electoral/keeper/grpc_query.go b/x/electoral/keeper/grpc_query.go new file mode 100644 index 00000000..2efdd69d --- /dev/null +++ b/x/electoral/keeper/grpc_query.go @@ -0,0 +1,7 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/electoral/types" +) + +var _ types.QueryServer = Keeper{} diff --git a/x/electoral/keeper/grpc_query_acc_state.go b/x/electoral/keeper/grpc_query_acc_state.go new file mode 100644 index 00000000..9d26f017 --- /dev/null +++ b/x/electoral/keeper/grpc_query_acc_state.go @@ -0,0 +1,57 @@ +package keeper + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) AccStates(c context.Context, req *types.QueryAccStatesRequest) (*types.QueryAccStatesResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + var accStates []types.AccState + ctx := sdk.UnwrapSDKContext(c) + + store := ctx.KVStore(k.storeKey) + accStateStore := prefix.NewStore(store, types.KeyPrefix(types.AccStateKeyPrefix)) + + pageRes, err := query.Paginate(accStateStore, req.Pagination, func(key []byte, value []byte) error { + var accState types.AccState + if err := k.cdc.Unmarshal(value, &accState); err != nil { + return err + } + + accStates = append(accStates, accState) + return nil + }) + + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return &types.QueryAccStatesResponse{AccState: accStates, Pagination: pageRes}, nil +} + +func (k Keeper) AccState(c context.Context, req *types.QueryAccStateRequest) (*types.QueryAccStateResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(c) + + val, found := k.GetAccState( + ctx, + types.IndexKeyAccState(req.Key), + ) + if !found { + return nil, status.Error(codes.InvalidArgument, "not found") + } + + return &types.QueryAccStateResponse{AccState: val}, nil +} diff --git a/x/electoral/keeper/grpc_query_acc_state_test.go b/x/electoral/keeper/grpc_query_acc_state_test.go new file mode 100644 index 00000000..883c7f08 --- /dev/null +++ b/x/electoral/keeper/grpc_query_acc_state_test.go @@ -0,0 +1,111 @@ +package keeper_test + +import ( + "strconv" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/electoral/types" +) + +// Prevent strconv unused error +var _ = strconv.IntSize + +func TestAccStateQuerySingle(t *testing.T) { + keeper, ctx := keepertest.ElectoralKeeper(t) + wctx := sdk.WrapSDKContext(ctx) + msgs := createNAccState(keeper, ctx, 2) + for _, tc := range []struct { + desc string + request *types.QueryAccStateRequest + response *types.QueryAccStateResponse + err error + }{ + { + desc: "First", + request: &types.QueryAccStateRequest{ + Key: msgs[0].Key, + }, + response: &types.QueryAccStateResponse{AccState: msgs[0]}, + }, + { + desc: "Second", + request: &types.QueryAccStateRequest{ + Key: msgs[1].Key, + }, + response: &types.QueryAccStateResponse{AccState: msgs[1]}, + }, + { + desc: "KeyNotFound", + request: &types.QueryAccStateRequest{ + Key: strconv.Itoa(100000), + }, + err: status.Error(codes.InvalidArgument, "not found"), + }, + { + desc: "InvalidRequest", + err: status.Error(codes.InvalidArgument, "invalid request"), + }, + } { + t.Run(tc.desc, func(t *testing.T) { + response, err := keeper.AccState(wctx, tc.request) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.Equal(t, tc.response, response) + } + }) + } +} + +func TestAccStateQueryPaginated(t *testing.T) { + keeper, ctx := keepertest.ElectoralKeeper(t) + wctx := sdk.WrapSDKContext(ctx) + msgs := createNAccState(keeper, ctx, 5) + + request := func(next []byte, offset, limit uint64, total bool) *types.QueryAccStatesRequest { + return &types.QueryAccStatesRequest{ + Pagination: &query.PageRequest{ + Key: next, + Offset: offset, + Limit: limit, + CountTotal: total, + }, + } + } + t.Run("ByOffset", func(t *testing.T) { + step := 2 + for i := 0; i < len(msgs); i += step { + resp, err := keeper.AccStates(wctx, request(nil, uint64(i), uint64(step), false)) + require.NoError(t, err) + require.LessOrEqual(t, len(resp.AccState), step) + require.Subset(t, msgs, resp.AccState) + } + }) + t.Run("ByKey", func(t *testing.T) { + step := 2 + var next []byte + for i := 0; i < len(msgs); i += step { + resp, err := keeper.AccStates(wctx, request(next, 0, uint64(step), false)) + require.NoError(t, err) + require.LessOrEqual(t, len(resp.AccState), step) + require.Subset(t, msgs, resp.AccState) + next = resp.Pagination.NextKey + } + }) + t.Run("Total", func(t *testing.T) { + resp, err := keeper.AccStates(wctx, request(nil, 0, 0, true)) + require.NoError(t, err) + require.Equal(t, len(msgs), int(resp.Pagination.Total)) + }) + t.Run("InvalidRequest", func(t *testing.T) { + _, err := keeper.AccStates(wctx, nil) + require.ErrorIs(t, err, status.Error(codes.InvalidArgument, "invalid request")) + }) +} diff --git a/x/electoral/keeper/grpc_query_account_operator.go b/x/electoral/keeper/grpc_query_account_operator.go new file mode 100644 index 00000000..3bdc9ce5 --- /dev/null +++ b/x/electoral/keeper/grpc_query_account_operator.go @@ -0,0 +1,35 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) AccountOperator(goCtx context.Context, req *types.QueryAccountOperatorRequest) (*types.QueryAccountOperatorResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + addr, err := sdk.AccAddressFromBech32(req.Address) + if err != nil { + return nil, err + } + key := types.GenAccStateIndexKey(addr, types.AccStateKeyAccOp) + v, f := k.GetAccState(ctx, key) + if !f { + return nil, status.Error(codes.InvalidArgument, "not found") + } + return &types.QueryAccountOperatorResponse{ + AccState: &types.AccState{ + Address: v.Address, + Key: v.Key, + Status: v.Status, + }, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_account_operators.go b/x/electoral/keeper/grpc_query_account_operators.go new file mode 100644 index 00000000..c98f46d6 --- /dev/null +++ b/x/electoral/keeper/grpc_query_account_operators.go @@ -0,0 +1,32 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) AccountOperators(goCtx context.Context, req *types.QueryAccountOperatorsRequest) (*types.QueryAccountOperatorsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + list := k.IterateAccState(ctx, types.AccStateKeyAccOp) + res := make([]*types.AccState, 0, len(list)) + for _, i := range list { + res = append(res, &types.AccState{ + Key: i.Key, + Address: i.Address, + Status: i.Status, + }) + } + + return &types.QueryAccountOperatorsResponse{ + AccStates: res, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_document_issuer.go b/x/electoral/keeper/grpc_query_document_issuer.go new file mode 100644 index 00000000..17a51abf --- /dev/null +++ b/x/electoral/keeper/grpc_query_document_issuer.go @@ -0,0 +1,36 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) DocumentIssuer(goCtx context.Context, req *types.QueryDocumentIssuerRequest) (*types.QueryDocumentIssuerResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + addr, err := sdk.AccAddressFromBech32(req.Address) + if err != nil { + return nil, err + } + key := types.GenAccStateIndexKey(addr, types.AccStateKeyDocIssuer) + v, f := k.GetAccState(ctx, key) + if !f { + return nil, status.Error(codes.InvalidArgument, "not found") + } + + return &types.QueryDocumentIssuerResponse{ + AccState: &types.AccState{ + Address: v.Address, + Key: v.Key, + Status: v.Status, + }, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_document_issuers.go b/x/electoral/keeper/grpc_query_document_issuers.go new file mode 100644 index 00000000..d4d72c46 --- /dev/null +++ b/x/electoral/keeper/grpc_query_document_issuers.go @@ -0,0 +1,31 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) DocumentIssuers(goCtx context.Context, req *types.QueryDocumentIssuersRequest) (*types.QueryDocumentIssuersResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + list := k.IterateAccState(ctx, types.AccStateKeyDocIssuer) + res := make([]*types.AccState, 0, len(list)) + for _, i := range list { + res = append(res, &types.AccState{ + Key: i.Key, + Address: i.Address, + Status: i.Status, + }) + } + + return &types.QueryDocumentIssuersResponse{ + AccStates: res, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_id_signer.go b/x/electoral/keeper/grpc_query_id_signer.go new file mode 100644 index 00000000..d3721bcb --- /dev/null +++ b/x/electoral/keeper/grpc_query_id_signer.go @@ -0,0 +1,35 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) IdSigner(goCtx context.Context, req *types.QueryIdSignerRequest) (*types.QueryIdSignerResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + addr, err := sdk.AccAddressFromBech32(req.Address) + if err != nil { + return nil, err + } + key := types.GenAccStateIndexKey(addr, types.AccStateKeyIdSigner) + v, f := k.GetAccState(ctx, key) + if !f { + return nil, status.Error(codes.InvalidArgument, "not found") + } + return &types.QueryIdSignerResponse{ + AccState: &types.AccState{ + Address: v.Address, + Key: v.Key, + Status: v.Status, + }, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_id_signers.go b/x/electoral/keeper/grpc_query_id_signers.go new file mode 100644 index 00000000..e273a798 --- /dev/null +++ b/x/electoral/keeper/grpc_query_id_signers.go @@ -0,0 +1,31 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) IdSigners(goCtx context.Context, req *types.QueryIdSignersRequest) (*types.QueryIdSignersResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + list := k.IterateAccState(ctx, types.AccStateKeyIdSigner) + res := make([]*types.AccState, 0, len(list)) + for _, i := range list { + res = append(res, &types.AccState{ + Key: i.Key, + Address: i.Address, + Status: i.Status, + }) + } + + return &types.QueryIdSignersResponse{ + AccStates: res, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_loader.go b/x/electoral/keeper/grpc_query_loader.go new file mode 100644 index 00000000..1c30364f --- /dev/null +++ b/x/electoral/keeper/grpc_query_loader.go @@ -0,0 +1,35 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) Loader(goCtx context.Context, req *types.QueryLoaderRequest) (*types.QueryLoaderResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + addr, err := sdk.AccAddressFromBech32(req.Address) + if err != nil { + return nil, err + } + key := types.GenAccStateIndexKey(addr, types.AccStateKeyShrpLoaders) + m, f := k.GetAccState(ctx, key) + if !f { + return nil, status.Error(codes.InvalidArgument, "not found") + } + + return &types.QueryLoaderResponse{ + AccState: &types.AccState{ + Key: m.Key, + Address: m.Address, + Status: m.Status, + }, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_loaders.go b/x/electoral/keeper/grpc_query_loaders.go new file mode 100644 index 00000000..0329015f --- /dev/null +++ b/x/electoral/keeper/grpc_query_loaders.go @@ -0,0 +1,32 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) Loaders(goCtx context.Context, req *types.QueryLoadersRequest) (*types.QueryLoadersResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + list := k.IterateAccState(ctx, types.AccStateKeyShrpLoaders) + res := make([]*types.AccState, 0, len(list)) + for _, i := range list { + res = append(res, &types.AccState{ + Key: i.Key, + Address: i.Address, + Status: i.Status, + }) + } + + return &types.QueryLoadersResponse{ + Loaders: res, + }, nil +} diff --git a/x/electoral/keeper/grpc_query_voter.go b/x/electoral/keeper/grpc_query_voter.go new file mode 100644 index 00000000..a103963b --- /dev/null +++ b/x/electoral/keeper/grpc_query_voter.go @@ -0,0 +1,37 @@ +package keeper + +import ( + "context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) Voter(goCtx context.Context, req *types.QueryVoterRequest) (result *types.QueryVoterResponse, err error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + addr, err := sdk.AccAddressFromBech32(req.Address) + if err != nil { + return nil, err + } + result = &types.QueryVoterResponse{ + Voter: types.AccState{ + Status: string(types.StatusInactive), + }, + } + + voter, found := k.GetAccStateByAddress(ctx, addr, types.AccStateKeyVoter) + if !found { + return + } + result = &types.QueryVoterResponse{ + Voter: voter, + } + + return +} diff --git a/x/electoral/keeper/grpc_query_voters.go b/x/electoral/keeper/grpc_query_voters.go new file mode 100644 index 00000000..973ef7c2 --- /dev/null +++ b/x/electoral/keeper/grpc_query_voters.go @@ -0,0 +1,32 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) Voters(goCtx context.Context, req *types.QueryVotersRequest) (*types.QueryVotersResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + list := k.IterateAccState(ctx, types.AccStateKeyVoter) + res := make([]*types.AccState, 0, len(list)) + for _, i := range list { + res = append(res, &types.AccState{ + Key: i.Key, + Address: i.Address, + Status: i.Status, + }) + } + + return &types.QueryVotersResponse{ + Voters: res, + }, nil +} diff --git a/x/electoral/keeper/keeper.go b/x/electoral/keeper/keeper.go index 8706d3a3..1e2a53ae 100644 --- a/x/electoral/keeper/keeper.go +++ b/x/electoral/keeper/keeper.go @@ -1,99 +1,37 @@ package keeper import ( + "fmt" + "github.com/tendermint/tendermint/libs/log" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/sharering/shareledger/x/electoral/types" - "github.com/sharering/shareledger/x/gentlemint" ) -type Keeper struct { - storeKey sdk.StoreKey - cdc *codec.Codec - gmKeeper gentlemint.Keeper -} +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey sdk.StoreKey + memKey sdk.StoreKey + gk GentlemintKeeper + } +) -func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey, gmKeeper gentlemint.Keeper) Keeper { - return Keeper{ +func NewKeeper( + cdc codec.BinaryCodec, + storeKey, + memKey sdk.StoreKey, + gk GentlemintKeeper, +) *Keeper { + return &Keeper{ cdc: cdc, storeKey: storeKey, - gmKeeper: gmKeeper, - } -} - -func (k Keeper) GetVoter(ctx sdk.Context, voterID string) types.Voter { - store := ctx.KVStore(k.storeKey) - - if !k.IsVoterPresent(ctx, voterID) { - return types.NewVoter() - } - - bz := store.Get([]byte(voterID)) - - var result types.Voter - - k.cdc.MustUnmarshalBinaryBare(bz, &result) - - return result -} - -func (k Keeper) SetVoter(ctx sdk.Context, voterID string, v types.Voter) { - if v.Address.Empty() { - return - } - - store := ctx.KVStore(k.storeKey) - - store.Set([]byte(voterID), k.cdc.MustMarshalBinaryBare(v)) -} - -func (k Keeper) GetVoterStatus(ctx sdk.Context, voterID string) string { - voter := k.GetVoter(ctx, voterID) - return voter.Status -} - -func (k Keeper) SetVoterAddress(ctx sdk.Context, voterID string, addr sdk.AccAddress) { - voter := k.GetVoter(ctx, voterID) - voter.Address = addr - k.SetVoter(ctx, voterID, voter) -} - -func (k Keeper) SetVoterStatus(ctx sdk.Context, voterID string, status string) { - voter := k.GetVoter(ctx, voterID) - voter.Status = status - k.SetVoter(ctx, voterID, voter) -} - -func (k Keeper) DeleteVoter(ctx sdk.Context, voterID string) { - store := ctx.KVStore(k.storeKey) - store.Delete([]byte(voterID)) -} - -func (k Keeper) GetVotersIterator(ctx sdk.Context) sdk.Iterator { - store := ctx.KVStore(k.storeKey) - return sdk.KVStorePrefixIterator(store, nil) -} - -func (k Keeper) IterateVoters(ctx sdk.Context, cb func(voter types.Voter) (stop bool)) { - iterator := k.GetVotersIterator(ctx) - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - var voter types.Voter - k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &voter) - - if cb(voter) { - break - } + memKey: memKey, + gk: gk, } } -func (k Keeper) IsVoterPresent(ctx sdk.Context, voterID string) bool { - store := ctx.KVStore(k.storeKey) - return store.Has([]byte(voterID)) -} - -func (k Keeper) IsAuthority(ctx sdk.Context, addr sdk.AccAddress) bool { - authAddr := k.gmKeeper.GetAuthorityAccount(ctx) - - return authAddr == addr.String() +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } diff --git a/x/electoral/keeper/msg_server.go b/x/electoral/keeper/msg_server.go new file mode 100644 index 00000000..4d23f909 --- /dev/null +++ b/x/electoral/keeper/msg_server.go @@ -0,0 +1,17 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/electoral/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} diff --git a/x/electoral/keeper/msg_server_enroll_account_operator.go b/x/electoral/keeper/msg_server_enroll_account_operator.go new file mode 100644 index 00000000..d68c6d33 --- /dev/null +++ b/x/electoral/keeper/msg_server_enroll_account_operator.go @@ -0,0 +1,40 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) EnrollAccountOperators(goCtx context.Context, msg *types.MsgEnrollAccountOperators) (*types.MsgEnrollAccountOperatorsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + event := sdk.NewEvent( + types.EventTypeEnrollAccOp, + ) + for _, a := range msg.Addresses { + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + k.activeAccOperator(ctx, addr) + event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, a)) + } + ctx.EventManager().EmitEvents([]sdk.Event{ + event, + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeEnrollAccOp), + ), + }, + ) + + return &types.MsgEnrollAccountOperatorsResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_enroll_doc_issuer.go b/x/electoral/keeper/msg_server_enroll_doc_issuer.go new file mode 100644 index 00000000..1071b7d2 --- /dev/null +++ b/x/electoral/keeper/msg_server_enroll_doc_issuer.go @@ -0,0 +1,36 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) EnrollDocIssuers(goCtx context.Context, msg *types.MsgEnrollDocIssuers) (*types.MsgEnrollDocIssuersResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + event := sdk.NewEvent(types.EventTypeEnrollDocIssuer) + + for _, a := range msg.Addresses { + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + k.activeDocIssuer(ctx, addr) + event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) + } + ctx.EventManager().EmitEvents([]sdk.Event{ + event, + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeEnrollDocIssuer), + ), + }) + return &types.MsgEnrollDocIssuersResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_enroll_id_signer.go b/x/electoral/keeper/msg_server_enroll_id_signer.go new file mode 100644 index 00000000..21b052f8 --- /dev/null +++ b/x/electoral/keeper/msg_server_enroll_id_signer.go @@ -0,0 +1,38 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) EnrollIdSigners(goCtx context.Context, msg *types.MsgEnrollIdSigners) (*types.MsgEnrollIdSignersResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + event := sdk.NewEvent(types.EventTypeEnrollIdSigner) + + for _, a := range msg.Addresses { + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + k.activeIdSigner(ctx, addr) + event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) + } + events := []sdk.Event{ + event, + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeEnrollIdSigner), + ), + } + ctx.EventManager().EmitEvents(events) + return &types.MsgEnrollIdSignersResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_enroll_loaders.go b/x/electoral/keeper/msg_server_enroll_loaders.go new file mode 100644 index 00000000..d7f30c89 --- /dev/null +++ b/x/electoral/keeper/msg_server_enroll_loaders.go @@ -0,0 +1,31 @@ +package keeper + +import ( + "context" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) EnrollLoaders(goCtx context.Context, msg *types.MsgEnrollLoaders) (*types.MsgEnrollLoadersResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + log := "SHRP loaders' addresses: " + for _, a := range msg.Addresses { + log = fmt.Sprintf("%s %s", log, a) + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + k.activeShrpLoader(ctx, addr) + if err := k.gk.LoadAllowanceLoader(ctx, addr); err != nil { + return nil, err + } + } + + return &types.MsgEnrollLoadersResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_enroll_voter.go b/x/electoral/keeper/msg_server_enroll_voter.go new file mode 100644 index 00000000..00502a43 --- /dev/null +++ b/x/electoral/keeper/msg_server_enroll_voter.go @@ -0,0 +1,20 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) EnrollVoter(goCtx context.Context, msg *types.MsgEnrollVoter) (*types.MsgEnrollVoterResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + addr, _ := sdk.AccAddressFromBech32(msg.Address) + k.activeVoter(ctx, addr) + return &types.MsgEnrollVoterResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_revoke_account_operator.go b/x/electoral/keeper/msg_server_revoke_account_operator.go new file mode 100644 index 00000000..a64e612f --- /dev/null +++ b/x/electoral/keeper/msg_server_revoke_account_operator.go @@ -0,0 +1,41 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) RevokeAccountOperators(goCtx context.Context, msg *types.MsgRevokeAccountOperators) (*types.MsgRevokeAccountOperatorsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + event := sdk.NewEvent(types.EventTypeRevokeAccOp) + for _, a := range msg.Addresses { + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + if err := k.revokeAccOperator(ctx, addr); err != nil { + return nil, err + } + event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) + } + + ctx.EventManager().EmitEvents( + []sdk.Event{ + event, + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeRevokeAccOp), + ), + }, + ) + return &types.MsgRevokeAccountOperatorsResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_revoke_doc_issuer.go b/x/electoral/keeper/msg_server_revoke_doc_issuer.go new file mode 100644 index 00000000..d10c692b --- /dev/null +++ b/x/electoral/keeper/msg_server_revoke_doc_issuer.go @@ -0,0 +1,40 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) RevokeDocIssuers(goCtx context.Context, msg *types.MsgRevokeDocIssuers) (*types.MsgRevokeDocIssuersResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + event := sdk.NewEvent(types.EventTypeRevokeDocIssuer) + for _, a := range msg.Addresses { + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + if err := k.revokeDocIssuer(ctx, addr); err != nil { + return nil, err + } + event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) + } + ctx.EventManager().EmitEvents( + []sdk.Event{ + event, + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeRevokeDocIssuer), + ), + }, + ) + + return &types.MsgRevokeDocIssuersResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_revoke_id_signer.go b/x/electoral/keeper/msg_server_revoke_id_signer.go new file mode 100644 index 00000000..2c0bf306 --- /dev/null +++ b/x/electoral/keeper/msg_server_revoke_id_signer.go @@ -0,0 +1,39 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) RevokeIdSigners(goCtx context.Context, msg *types.MsgRevokeIdSigners) (*types.MsgRevokeIdSignersResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + event := sdk.NewEvent(types.EventTypeRevokeIdSigner) + for _, a := range msg.Addresses { + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + if err := k.revokeIdSigner(ctx, addr); err != nil { + return nil, err + } + event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, a)) + } + events := []sdk.Event{ + event, + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeRevokeIdSigner), + ), + } + ctx.EventManager().EmitEvents(events) + + return &types.MsgRevokeIdSignersResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_revoke_loaders.go b/x/electoral/keeper/msg_server_revoke_loaders.go new file mode 100644 index 00000000..b1fbddc1 --- /dev/null +++ b/x/electoral/keeper/msg_server_revoke_loaders.go @@ -0,0 +1,31 @@ +package keeper + +import ( + "context" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) RevokeLoaders(goCtx context.Context, msg *types.MsgRevokeLoaders) (*types.MsgRevokeLoadersResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + log := "SHRP loaders' addresses: " + for _, a := range msg.Addresses { + log = fmt.Sprintf("%s %s", log, a) + addr, err := sdk.AccAddressFromBech32(a) + if err != nil { + return nil, err + } + if err := k.revokeShrpLoader(ctx, addr); err != nil { + return nil, err + } + } + + return &types.MsgRevokeLoadersResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_revoke_voter.go b/x/electoral/keeper/msg_server_revoke_voter.go new file mode 100644 index 00000000..6b5930a8 --- /dev/null +++ b/x/electoral/keeper/msg_server_revoke_voter.go @@ -0,0 +1,23 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k msgServer) RevokeVoter(goCtx context.Context, msg *types.MsgRevokeVoter) (*types.MsgRevokeVoterResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + addr, _ := sdk.AccAddressFromBech32(msg.Address) + if err := k.revokeVoter(ctx, addr); err != nil { + return nil, err + } + + return &types.MsgRevokeVoterResponse{}, nil +} diff --git a/x/electoral/keeper/msg_server_test.go b/x/electoral/keeper/msg_server_test.go new file mode 100644 index 00000000..2ba2df30 --- /dev/null +++ b/x/electoral/keeper/msg_server_test.go @@ -0,0 +1,16 @@ +package keeper_test + +import ( + "context" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/electoral/keeper" + "github.com/sharering/shareledger/x/electoral/types" +) + +func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) { + k, ctx := keepertest.ElectoralKeeper(t) + return keeper.NewMsgServerImpl(*k), sdk.WrapSDKContext(ctx) +} diff --git a/x/electoral/keeper/querier.go b/x/electoral/keeper/querier.go deleted file mode 100644 index d8e37a2b..00000000 --- a/x/electoral/keeper/querier.go +++ /dev/null @@ -1,31 +0,0 @@ -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - abci "github.com/tendermint/tendermint/abci/types" -) - -const QueryVoter = "voter" - -func NewQuerier(keeper Keeper) sdk.Querier { - return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err error) { - switch path[0] { - case QueryVoter: - return queryVoter(ctx, path[1:], req, keeper) - default: - return nil, sdkerrors.ErrInvalidRequest - } - } -} - -func queryVoter(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - Booking := keeper.GetVoter(ctx, path[0]) - res, err := codec.MarshalJSONIndent(keeper.cdc, Booking) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} diff --git a/x/electoral/keeper/role_keeper.go b/x/electoral/keeper/role_keeper.go new file mode 100644 index 00000000..81254271 --- /dev/null +++ b/x/electoral/keeper/role_keeper.go @@ -0,0 +1,34 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +func (k Keeper) IsAuthority(ctx sdk.Context, address sdk.AccAddress) bool { + value, found := k.GetAuthority(ctx) + return found && value.Address == address.String() +} + +func (k Keeper) IsTreasurer(ctx sdk.Context, address sdk.AccAddress) bool { + value, found := k.GetTreasurer(ctx) + return found && value.Address == address.String() +} + +func (k Keeper) IsAccountOperator(ctx sdk.Context, address sdk.AccAddress) bool { + return k.isActive(ctx, address, types.AccStateKeyAccOp) +} +func (k Keeper) IsVoter(ctx sdk.Context, address sdk.AccAddress) bool { + return k.isActive(ctx, address, types.AccStateKeyVoter) +} +func (k Keeper) IsSHRPLoader(ctx sdk.Context, address sdk.AccAddress) bool { + return k.isActive(ctx, address, types.AccStateKeyShrpLoaders) +} + +func (k Keeper) IsIDSigner(ctx sdk.Context, address sdk.AccAddress) bool { + return k.isActive(ctx, address, types.AccStateKeyIdSigner) +} + +func (k Keeper) IsDocIssuer(ctx sdk.Context, address sdk.AccAddress) bool { + return k.isActive(ctx, address, types.AccStateKeyDocIssuer) +} diff --git a/x/electoral/keeper/treasurer.go b/x/electoral/keeper/treasurer.go new file mode 100644 index 00000000..32df8d22 --- /dev/null +++ b/x/electoral/keeper/treasurer.go @@ -0,0 +1,33 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/electoral/types" +) + +// SetTreasurer set treasurer in the store +func (k Keeper) SetTreasurer(ctx sdk.Context, treasurer types.Treasurer) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.TreasurerKey)) + b := k.cdc.MustMarshal(&treasurer) + store.Set([]byte{0}, b) +} + +// GetTreasurer returns treasurer +func (k Keeper) GetTreasurer(ctx sdk.Context) (val types.Treasurer, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.TreasurerKey)) + + b := store.Get([]byte{0}) + if b == nil { + return val, false + } + + k.cdc.MustUnmarshal(b, &val) + return val, true +} + +// RemoveTreasurer removes treasurer from the store +func (k Keeper) RemoveTreasurer(ctx sdk.Context) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.TreasurerKey)) + store.Delete([]byte{0}) +} diff --git a/x/electoral/keeper/treasurer_test.go b/x/electoral/keeper/treasurer_test.go new file mode 100644 index 00000000..38f1d689 --- /dev/null +++ b/x/electoral/keeper/treasurer_test.go @@ -0,0 +1,33 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/electoral/keeper" + "github.com/sharering/shareledger/x/electoral/types" +) + +func createTestTreasurer(keeper *keeper.Keeper, ctx sdk.Context) types.Treasurer { + item := types.Treasurer{} + keeper.SetTreasurer(ctx, item) + return item +} + +func TestTreasurerGet(t *testing.T) { + keeper, ctx := keepertest.ElectoralKeeper(t) + item := createTestTreasurer(keeper, ctx) + rst, found := keeper.GetTreasurer(ctx) + require.True(t, found) + require.Equal(t, item, rst) +} +func TestTreasurerRemove(t *testing.T) { + keeper, ctx := keepertest.ElectoralKeeper(t) + createTestTreasurer(keeper, ctx) + keeper.RemoveTreasurer(ctx) + _, found := keeper.GetTreasurer(ctx) + require.False(t, found) +} diff --git a/x/electoral/module.go b/x/electoral/module.go index 6b8fec17..a2372079 100644 --- a/x/electoral/module.go +++ b/x/electoral/module.go @@ -1,116 +1,166 @@ package electoral import ( + "context" "encoding/json" + "fmt" "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/sharering/shareledger/x/electoral/client/cli" - "github.com/sharering/shareledger/x/electoral/client/rest" - - "github.com/cosmos/cosmos-sdk/client/context" - sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" + "github.com/sharering/shareledger/x/electoral/keeper" + "github.com/sharering/shareledger/x/electoral/types" ) -// type check to ensure the interface is properly implemented var ( _ module.AppModule = AppModule{} _ module.AppModuleBasic = AppModuleBasic{} ) -// app module Basics object -type AppModuleBasic struct{} +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- + +// AppModuleBasic implements the AppModuleBasic interface for the capability module. +type AppModuleBasic struct { + cdc codec.BinaryCodec +} +func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the capability module's name. func (AppModuleBasic) Name() string { - return ModuleName + return types.ModuleName +} + +func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) } -func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { - RegisterCodec(cdc) +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) } -func (AppModuleBasic) DefaultGenesis() json.RawMessage { - return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) +// RegisterInterfaces registers the module's interface types +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) } -// Validation check of the Genesis -func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { - var data GenesisState - err := ModuleCdc.UnmarshalJSON(bz, &data) - if err != nil { - return err +// DefaultGenesis returns the capability module's default genesis state. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) +} + +// ValidateGenesis performs genesis state validation for the capability module. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - // Once json successfully marshalled, passes along to genesis.go - return ValidateGenesis(data) + return genState.Validate() } -// Register rest routes -func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { - rest.RegisterRoutes(ctx, rtr, StoreKey) +// RegisterRESTRoutes registers the capability module's REST service handlers. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { } -// Get the root query command of this module -func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { - return cli.QueryCmd(StoreKey, cdc) +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) } -// Get the root tx command of this module -func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetTxCmd(StoreKey, cdc) +// GetTxCmd returns the capability module's root tx command. +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() } +// GetQueryCmd returns the capability module's root query command. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(types.StoreKey) +} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- + +// AppModule implements the AppModule interface for the capability module. type AppModule struct { AppModuleBasic - keeper Keeper + + keeper keeper.Keeper } -// NewAppModule creates a new AppModule Object -func NewAppModule(k Keeper) AppModule { +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, } } -func (AppModule) Name() string { - return ModuleName +// Name returns the capability module's name. +func (am AppModule) Name() string { + return am.AppModuleBasic.Name() } -func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} - -func (am AppModule) Route() string { - return RouterKey +// Route returns the capability module's message routing key. +func (am AppModule) Route() sdk.Route { + return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) } -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(am.keeper) -} -func (am AppModule) QuerierRoute() string { - return QuerierRoute +// QuerierRoute returns the capability module's query routing key. +func (AppModule) QuerierRoute() string { return types.QuerierRoute } + +// LegacyQuerierHandler returns the capability module's Querier. +func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { + return nil } -func (am AppModule) NewQuerierHandler() sdk.Querier { - return NewQuerier(am.keeper) +// RegisterServices registers a GRPC query service to respond to the +// module-specific GRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) } -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} +// RegisterInvariants registers the capability module's invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the capability module's genesis initialization It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, am.keeper, genState) -func (am AppModule) EndBlock(sdk.Context, abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } -func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState GenesisState - ModuleCdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} +// ExportGenesis returns the capability 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) + return cdc.MustMarshalJSON(genState) } -func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return ModuleCdc.MustMarshalJSON(gs) +// ConsensusVersion implements ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 2 } + +// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. +func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} + +// EndBlock executes all ABCI EndBlock logic respective to the capability module. It +// returns no validator updates. +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} } diff --git a/x/electoral/types/acc_state.pb.go b/x/electoral/types/acc_state.pb.go new file mode 100644 index 00000000..85d4f39a --- /dev/null +++ b/x/electoral/types/acc_state.pb.go @@ -0,0 +1,418 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: electoral/acc_state.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type AccState struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` +} + +func (m *AccState) Reset() { *m = AccState{} } +func (m *AccState) String() string { return proto.CompactTextString(m) } +func (*AccState) ProtoMessage() {} +func (*AccState) Descriptor() ([]byte, []int) { + return fileDescriptor_5e87653b79e0d371, []int{0} +} +func (m *AccState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AccState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AccState) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccState.Merge(m, src) +} +func (m *AccState) XXX_Size() int { + return m.Size() +} +func (m *AccState) XXX_DiscardUnknown() { + xxx_messageInfo_AccState.DiscardUnknown(m) +} + +var xxx_messageInfo_AccState proto.InternalMessageInfo + +func (m *AccState) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *AccState) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *AccState) GetStatus() string { + if m != nil { + return m.Status + } + return "" +} + +func init() { + proto.RegisterType((*AccState)(nil), "shareledger.electoral.AccState") +} + +func init() { proto.RegisterFile("electoral/acc_state.proto", fileDescriptor_5e87653b79e0d371) } + +var fileDescriptor_5e87653b79e0d371 = []byte{ + // 189 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcd, 0x49, 0x4d, + 0x2e, 0xc9, 0x2f, 0x4a, 0xcc, 0xd1, 0x4f, 0x4c, 0x4e, 0x8e, 0x2f, 0x2e, 0x49, 0x2c, 0x49, 0xd5, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2d, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, + 0x4f, 0x2d, 0xd2, 0x83, 0x2b, 0x53, 0xf2, 0xe3, 0xe2, 0x70, 0x4c, 0x4e, 0x0e, 0x06, 0x29, 0x14, + 0x12, 0xe0, 0x62, 0xce, 0x4e, 0xad, 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0x31, 0x85, + 0x24, 0xb8, 0xd8, 0x13, 0x53, 0x52, 0x8a, 0x52, 0x8b, 0x8b, 0x25, 0x98, 0xc0, 0xa2, 0x30, 0xae, + 0x90, 0x18, 0x17, 0x1b, 0xc8, 0xf4, 0xd2, 0x62, 0x09, 0x66, 0xb0, 0x04, 0x94, 0xe7, 0xe4, 0x73, + 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, + 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x46, 0xe9, 0x99, 0x25, 0x19, 0xa5, + 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x60, 0xb7, 0x14, 0x65, 0xe6, 0xa5, 0xeb, 0x23, 0xb9, 0x4a, + 0xbf, 0x42, 0x1f, 0xe1, 0xfc, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0xdb, 0x8d, 0x01, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x13, 0x1a, 0xd7, 0x08, 0xd8, 0x00, 0x00, 0x00, +} + +func (m *AccState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AccState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintAccState(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x1a + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintAccState(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintAccState(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintAccState(dAtA []byte, offset int, v uint64) int { + offset -= sovAccState(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *AccState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovAccState(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovAccState(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovAccState(uint64(l)) + } + return n +} + +func sovAccState(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozAccState(x uint64) (n int) { + return sovAccState(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *AccState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAccState + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: AccState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAccState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAccState + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAccState + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAccState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAccState + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAccState + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAccState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAccState + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAccState + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAccState(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAccState + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAccState(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAccState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAccState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAccState + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthAccState + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupAccState + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthAccState + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthAccState = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAccState = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupAccState = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/electoral/types/authority.pb.go b/x/electoral/types/authority.pb.go new file mode 100644 index 00000000..a63ea3a1 --- /dev/null +++ b/x/electoral/types/authority.pb.go @@ -0,0 +1,316 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: electoral/authority.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Authority struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *Authority) Reset() { *m = Authority{} } +func (m *Authority) String() string { return proto.CompactTextString(m) } +func (*Authority) ProtoMessage() {} +func (*Authority) Descriptor() ([]byte, []int) { + return fileDescriptor_874785030f090172, []int{0} +} +func (m *Authority) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Authority) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Authority.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Authority) XXX_Merge(src proto.Message) { + xxx_messageInfo_Authority.Merge(m, src) +} +func (m *Authority) XXX_Size() int { + return m.Size() +} +func (m *Authority) XXX_DiscardUnknown() { + xxx_messageInfo_Authority.DiscardUnknown(m) +} + +var xxx_messageInfo_Authority proto.InternalMessageInfo + +func (m *Authority) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func init() { + proto.RegisterType((*Authority)(nil), "shareledger.electoral.Authority") +} + +func init() { proto.RegisterFile("electoral/authority.proto", fileDescriptor_874785030f090172) } + +var fileDescriptor_874785030f090172 = []byte{ + // 172 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcd, 0x49, 0x4d, + 0x2e, 0xc9, 0x2f, 0x4a, 0xcc, 0xd1, 0x4f, 0x2c, 0x2d, 0xc9, 0xc8, 0x2f, 0xca, 0x2c, 0xa9, 0xd4, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2d, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, + 0x4f, 0x2d, 0xd2, 0x83, 0x2b, 0x93, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd0, 0x07, 0xb1, + 0x20, 0x8a, 0x95, 0x54, 0xb9, 0x38, 0x1d, 0x61, 0xfa, 0x85, 0x24, 0xb8, 0xd8, 0x13, 0x53, 0x52, + 0x8a, 0x52, 0x8b, 0x8b, 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x60, 0x5c, 0x27, 0x9f, 0x13, + 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, + 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x4a, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, + 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x07, 0x5b, 0x5c, 0x94, 0x99, 0x97, 0xae, 0x8f, 0xe4, 0x04, 0xfd, + 0x0a, 0x7d, 0x84, 0x5b, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x76, 0x1b, 0x03, 0x02, + 0x00, 0x00, 0xff, 0xff, 0xee, 0x16, 0xaa, 0xc7, 0xc5, 0x00, 0x00, 0x00, +} + +func (m *Authority) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Authority) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Authority) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintAuthority(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintAuthority(dAtA []byte, offset int, v uint64) int { + offset -= sovAuthority(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Authority) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovAuthority(uint64(l)) + } + return n +} + +func sovAuthority(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozAuthority(x uint64) (n int) { + return sovAuthority(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Authority) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthority + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: Authority: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Authority: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthority + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAuthority + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthority + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthority(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthority + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAuthority(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAuthority + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAuthority + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAuthority + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthAuthority + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupAuthority + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthAuthority + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthAuthority = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAuthority = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupAuthority = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/electoral/types/codec.go b/x/electoral/types/codec.go index fb3265cd..082e2187 100644 --- a/x/electoral/types/codec.go +++ b/x/electoral/types/codec.go @@ -2,17 +2,62 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" ) -// ModuleCdc is the codec for the module -var ModuleCdc = codec.New() - -func init() { - RegisterCodec(ModuleCdc) +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgEnrollVoter{}, "electoral/EnrollVoter", nil) + cdc.RegisterConcrete(&MsgRevokeVoter{}, "electoral/RevokeVoter", nil) + cdc.RegisterConcrete(&MsgEnrollLoaders{}, "electoral/EnrollLoaders", nil) + cdc.RegisterConcrete(&MsgRevokeLoaders{}, "electoral/RevokeLoaders", nil) + cdc.RegisterConcrete(&MsgEnrollIdSigners{}, "electoral/EnrollIdSigners", nil) + cdc.RegisterConcrete(&MsgRevokeIdSigners{}, "electoral/RevokeIdSigners", nil) + cdc.RegisterConcrete(&MsgEnrollDocIssuers{}, "electoral/EnrollDocIssuers", nil) + cdc.RegisterConcrete(&MsgRevokeDocIssuers{}, "electoral/RevokeDocIssuers", nil) + cdc.RegisterConcrete(&MsgEnrollAccountOperators{}, "electoral/EnrollAccountOperators", nil) + cdc.RegisterConcrete(&MsgRevokeAccountOperators{}, "electoral/RevokeAccountOperators", nil) + // this line is used by starport scaffolding # 2 } -// RegisterCodec registers concrete types on the Amino codec -func RegisterCodec(cdc *codec.Codec) { - cdc.RegisterConcrete(MsgEnrollVoter{}, "electoral/EnrollVoter", nil) - cdc.RegisterConcrete(MsgRevokeVoter{}, "electoral/RevokeVoter", nil) +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgEnrollVoter{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgRevokeVoter{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgEnrollLoaders{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgRevokeLoaders{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgEnrollIdSigners{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgRevokeIdSigners{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgEnrollDocIssuers{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgRevokeDocIssuers{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgEnrollAccountOperators{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgRevokeAccountOperators{}, + ) + // this line is used by starport scaffolding # 3 + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } + +var ( + amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) +) diff --git a/x/electoral/types/errors.go b/x/electoral/types/errors.go new file mode 100644 index 00000000..50b94cf9 --- /dev/null +++ b/x/electoral/types/errors.go @@ -0,0 +1,12 @@ +package types + +// DONTCOVER + +import ( + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +// x/electoral module sentinel errors +var ( + ErrSample = sdkerrors.Register(ModuleName, 1100, "sample error") +) diff --git a/x/electoral/types/expected_keepers.go b/x/electoral/types/expected_keepers.go new file mode 100644 index 00000000..ab1254f4 --- /dev/null +++ b/x/electoral/types/expected_keepers.go @@ -0,0 +1 @@ +package types diff --git a/x/electoral/types/genesis.go b/x/electoral/types/genesis.go new file mode 100644 index 00000000..5c063352 --- /dev/null +++ b/x/electoral/types/genesis.go @@ -0,0 +1,36 @@ +package types + +import ( + "fmt" +) + +// DefaultIndex is the default capability global index +const DefaultIndex uint64 = 1 + +// DefaultGenesis returns the default Capability genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{ + AccStateList: []AccState{}, + Authority: nil, + Treasurer: nil, + // this line is used by starport scaffolding # genesis/types/default + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + // Check for duplicated index in accState + accStateIndexMap := make(map[string]struct{}) + + for _, elem := range gs.AccStateList { + index := string(AccStateKey(IndexKeyAccState(elem.Key))) + if _, ok := accStateIndexMap[index]; ok { + return fmt.Errorf("duplicated index for accState") + } + accStateIndexMap[index] = struct{}{} + } + // this line is used by starport scaffolding # genesis/types/validate + + return nil +} diff --git a/x/electoral/types/genesis.pb.go b/x/electoral/types/genesis.pb.go new file mode 100644 index 00000000..75aa748a --- /dev/null +++ b/x/electoral/types/genesis.pb.go @@ -0,0 +1,454 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: electoral/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the electoral module's genesis state. +type GenesisState struct { + AccStateList []AccState `protobuf:"bytes,1,rep,name=accStateList,proto3" json:"accStateList"` + Authority *Authority `protobuf:"bytes,2,opt,name=authority,proto3" json:"authority,omitempty"` + Treasurer *Treasurer `protobuf:"bytes,3,opt,name=treasurer,proto3" json:"treasurer,omitempty"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_9741b9e3c3b3a5be, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetAccStateList() []AccState { + if m != nil { + return m.AccStateList + } + return nil +} + +func (m *GenesisState) GetAuthority() *Authority { + if m != nil { + return m.Authority + } + return nil +} + +func (m *GenesisState) GetTreasurer() *Treasurer { + if m != nil { + return m.Treasurer + } + return nil +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "shareledger.electoral.GenesisState") +} + +func init() { proto.RegisterFile("electoral/genesis.proto", fileDescriptor_9741b9e3c3b3a5be) } + +var fileDescriptor_9741b9e3c3b3a5be = []byte{ + // 264 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4f, 0xcd, 0x49, 0x4d, + 0x2e, 0xc9, 0x2f, 0x4a, 0xcc, 0xd1, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, + 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2d, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, + 0xd2, 0x83, 0x2b, 0x92, 0x92, 0x44, 0xa8, 0x4f, 0x4c, 0x4e, 0x8e, 0x2f, 0x2e, 0x49, 0x2c, 0x49, + 0x85, 0xe8, 0x40, 0x91, 0x2a, 0x2d, 0xc9, 0xc8, 0x2f, 0xca, 0x2c, 0xa9, 0xc4, 0x94, 0x2a, 0x29, + 0x4a, 0x4d, 0x2c, 0x2e, 0x2d, 0x4a, 0x2d, 0x82, 0x4a, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x99, + 0xfa, 0x20, 0x16, 0x44, 0x54, 0xe9, 0x26, 0x23, 0x17, 0x8f, 0x3b, 0xc4, 0x3d, 0xc1, 0x20, 0x2b, + 0x84, 0x3c, 0xb9, 0x78, 0x12, 0x93, 0x93, 0xc1, 0x6c, 0x9f, 0xcc, 0xe2, 0x12, 0x09, 0x46, 0x05, + 0x66, 0x0d, 0x6e, 0x23, 0x79, 0x3d, 0xac, 0xae, 0xd4, 0x73, 0x84, 0x2a, 0x75, 0x62, 0x39, 0x71, + 0x4f, 0x9e, 0x21, 0x08, 0x45, 0xab, 0x90, 0x1d, 0x17, 0x27, 0xdc, 0x7d, 0x12, 0x4c, 0x0a, 0x8c, + 0x1a, 0xdc, 0x46, 0x0a, 0xb8, 0xcc, 0x81, 0xa9, 0x0b, 0x42, 0x68, 0x01, 0xe9, 0x87, 0x7b, 0x42, + 0x82, 0x19, 0xaf, 0xfe, 0x10, 0x98, 0xba, 0x20, 0x84, 0x16, 0x27, 0x9f, 0x13, 0x8f, 0xe4, 0x18, + 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, + 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x4a, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, + 0xcf, 0xd5, 0x07, 0x1b, 0x58, 0x94, 0x99, 0x97, 0xae, 0x8f, 0x64, 0xb4, 0x7e, 0x85, 0x3e, 0x52, + 0x48, 0x56, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0x03, 0xcc, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, + 0x10, 0xf8, 0x23, 0x1b, 0xc9, 0x01, 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Treasurer != nil { + { + size, err := m.Treasurer.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Authority != nil { + { + size, err := m.Authority.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.AccStateList) > 0 { + for iNdEx := len(m.AccStateList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AccStateList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AccStateList) > 0 { + for _, e := range m.AccStateList { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if m.Authority != nil { + l = m.Authority.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + if m.Treasurer != nil { + l = m.Treasurer.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccStateList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccStateList = append(m.AccStateList, AccState{}) + if err := m.AccStateList[len(m.AccStateList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Authority == nil { + m.Authority = &Authority{} + } + if err := m.Authority.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Treasurer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Treasurer == nil { + m.Treasurer = &Treasurer{} + } + if err := m.Treasurer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/electoral/types/genesis_test.go b/x/electoral/types/genesis_test.go new file mode 100644 index 00000000..a3084fd1 --- /dev/null +++ b/x/electoral/types/genesis_test.go @@ -0,0 +1,67 @@ +package types_test + +import ( + "testing" + + "github.com/sharering/shareledger/x/electoral/types" + "github.com/stretchr/testify/require" +) + +func TestGenesisState_Validate(t *testing.T) { + for _, tc := range []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + { + desc: "valid genesis state", + genState: &types.GenesisState{ + AccStateList: []types.AccState{ + { + Key: "0", + }, + { + Key: "1", + }, + }, + Authority: &types.Authority{ + Address: "address", + }, + Treasurer: &types.Treasurer{ + Address: "address", + }, + // this line is used by starport scaffolding # types/genesis/validField + }, + valid: true, + }, + { + desc: "duplicated accState", + genState: &types.GenesisState{ + AccStateList: []types.AccState{ + { + Key: "0", + }, + { + Key: "0", + }, + }, + }, + valid: false, + }, + // this line is used by starport scaffolding # types/genesis/testcase + } { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/x/electoral/types/key.go b/x/electoral/types/key.go deleted file mode 100644 index bc6ff3c7..00000000 --- a/x/electoral/types/key.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -const ( - // ModuleName is the name of the module - ModuleName = "electoral" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey is the module name router key - RouterKey = ModuleName - - // QuerierRoute to be used for querierer msgs - QuerierRoute = ModuleName -) diff --git a/x/electoral/types/key_acc_state.go b/x/electoral/types/key_acc_state.go new file mode 100644 index 00000000..60d5b71b --- /dev/null +++ b/x/electoral/types/key_acc_state.go @@ -0,0 +1,43 @@ +package types + +import ( + "encoding/binary" + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +var _ binary.ByteOrder + +const ( + // AccStateKeyPrefix is the prefix to retrieve all AccState + AccStateKeyPrefix = "AccState/value/" +) + +type AccStateKeyType string + +const ( + AccStateKeyIdSigner AccStateKeyType = "idsigner" + AccStateKeyDocIssuer AccStateKeyType = "docIssuer" + AccStateKeyAccOp AccStateKeyType = "accop" + AccStateKeyShrpLoaders AccStateKeyType = "shrploader" + AccStateKeyVoter AccStateKeyType = "voter" +) + +type IndexKeyAccState string + +// AccStateKey returns the store key to retrieve a AccState from the index fields +func AccStateKey( + k IndexKeyAccState, +) []byte { + var key []byte + + keyBytes := []byte(string(k)) + key = append(key, keyBytes...) + key = append(key, []byte("/")...) + + return key +} + +func GenAccStateIndexKey(addr sdk.AccAddress, key AccStateKeyType) IndexKeyAccState { + return IndexKeyAccState(fmt.Sprintf("%s%s", key, addr)) +} diff --git a/x/electoral/types/keys.go b/x/electoral/types/keys.go new file mode 100644 index 00000000..7b7de1e2 --- /dev/null +++ b/x/electoral/types/keys.go @@ -0,0 +1,51 @@ +package types + +const ( + // ModuleName defines the module name + ModuleName = "electoral" + + // StoreKey defines the primary module store key + StoreKey = ModuleName + + // RouterKey is the message route for slashing + RouterKey = ModuleName + + // QuerierRoute defines the module's query routing key + QuerierRoute = ModuleName + + // MemStoreKey defines the in-memory store key + MemStoreKey = "mem_electoral" +) + +type Status string + +var ( + StatusActive Status = "active" + StatusInactive Status = "inactive" +) + +var ( + // Event enroll acc op + EventTypeEnrollAccOp = "enroll_account_operator" + EventTypeRevokeAccOp = "revoke_account_operator" + // Event Type + EventTypeEnrollIdSigner = "enroll_id_signer" + EventTypeRevokeIdSigner = "revoke_id_signer" + + EventTypeRevokeDocIssuer = "revoke_doc_issuer" + EventTypeEnrollDocIssuer = "enroll_doc_issuer" + // Attr + EventAttrAddress = "address" +) + +func KeyPrefix(p string) []byte { + return []byte(p) +} + +const ( + AuthorityKey = "Authority-value-" +) + +const ( + TreasurerKey = "Treasurer-value-" +) diff --git a/x/electoral/types/message_enroll_account_operators.go b/x/electoral/types/message_enroll_account_operators.go new file mode 100644 index 00000000..7c5c9085 --- /dev/null +++ b/x/electoral/types/message_enroll_account_operators.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgEnrollAccountOperators{} + +func NewMsgEnrollAccountOperators(creator string, addresses []string) *MsgEnrollAccountOperators { + return &MsgEnrollAccountOperators{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgEnrollAccountOperators) Route() string { + return RouterKey +} + +func (msg *MsgEnrollAccountOperators) Type() string { + return "EnrollAccountOperators" +} + +func (msg *MsgEnrollAccountOperators) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgEnrollAccountOperators) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgEnrollAccountOperators) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_enroll_account_operators_test.go b/x/electoral/types/message_enroll_account_operators_test.go new file mode 100644 index 00000000..4fa92529 --- /dev/null +++ b/x/electoral/types/message_enroll_account_operators_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgEnrollAccountOperator_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgEnrollAccountOperators + err error + }{ + { + name: "invalid address", + msg: MsgEnrollAccountOperators{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgEnrollAccountOperators{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_enroll_doc_issuers.go b/x/electoral/types/message_enroll_doc_issuers.go new file mode 100644 index 00000000..252b7679 --- /dev/null +++ b/x/electoral/types/message_enroll_doc_issuers.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgEnrollDocIssuers{} + +func NewMsgEnrollDocIssuers(creator string, addresses []string) *MsgEnrollDocIssuers { + return &MsgEnrollDocIssuers{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgEnrollDocIssuers) Route() string { + return RouterKey +} + +func (msg *MsgEnrollDocIssuers) Type() string { + return "EnrollDocIssuers" +} + +func (msg *MsgEnrollDocIssuers) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgEnrollDocIssuers) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgEnrollDocIssuers) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_enroll_doc_issuers_test.go b/x/electoral/types/message_enroll_doc_issuers_test.go new file mode 100644 index 00000000..0f6cb107 --- /dev/null +++ b/x/electoral/types/message_enroll_doc_issuers_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgEnrollDocIssuer_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgEnrollDocIssuers + err error + }{ + { + name: "invalid address", + msg: MsgEnrollDocIssuers{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgEnrollDocIssuers{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_enroll_id_signers.go b/x/electoral/types/message_enroll_id_signers.go new file mode 100644 index 00000000..b3259289 --- /dev/null +++ b/x/electoral/types/message_enroll_id_signers.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgEnrollIdSigners{} + +func NewMsgEnrollIdSigners(creator string, addresses []string) *MsgEnrollIdSigners { + return &MsgEnrollIdSigners{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgEnrollIdSigners) Route() string { + return RouterKey +} + +func (msg *MsgEnrollIdSigners) Type() string { + return "EnrollIdSigners" +} + +func (msg *MsgEnrollIdSigners) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgEnrollIdSigners) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgEnrollIdSigners) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_enroll_id_signers_test.go b/x/electoral/types/message_enroll_id_signers_test.go new file mode 100644 index 00000000..01636991 --- /dev/null +++ b/x/electoral/types/message_enroll_id_signers_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgEnrollIdSigner_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgEnrollIdSigners + err error + }{ + { + name: "invalid address", + msg: MsgEnrollIdSigners{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgEnrollIdSigners{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_enroll_loaders.go b/x/electoral/types/message_enroll_loaders.go new file mode 100644 index 00000000..6d736765 --- /dev/null +++ b/x/electoral/types/message_enroll_loaders.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgEnrollLoaders{} + +func NewMsgEnrollLoaders(creator string, addresses []string) *MsgEnrollLoaders { + return &MsgEnrollLoaders{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgEnrollLoaders) Route() string { + return RouterKey +} + +func (msg *MsgEnrollLoaders) Type() string { + return "EnrollLoaders" +} + +func (msg *MsgEnrollLoaders) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgEnrollLoaders) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgEnrollLoaders) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_enroll_loaders_test.go b/x/electoral/types/message_enroll_loaders_test.go new file mode 100644 index 00000000..5be52b34 --- /dev/null +++ b/x/electoral/types/message_enroll_loaders_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgEnrollLoaders_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgEnrollLoaders + err error + }{ + { + name: "invalid address", + msg: MsgEnrollLoaders{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgEnrollLoaders{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_enroll_voter.go b/x/electoral/types/message_enroll_voter.go new file mode 100644 index 00000000..4e1c60bc --- /dev/null +++ b/x/electoral/types/message_enroll_voter.go @@ -0,0 +1,47 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgEnrollVoter{} + +func NewMsgEnrollVoter(creator string, address string) *MsgEnrollVoter { + return &MsgEnrollVoter{ + Creator: creator, + Address: address, + } +} + +func (msg *MsgEnrollVoter) Route() string { + return RouterKey +} + +func (msg *MsgEnrollVoter) Type() string { + return "EnrollVoter" +} + +func (msg *MsgEnrollVoter) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgEnrollVoter) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgEnrollVoter) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if _, err := sdk.AccAddressFromBech32(msg.Address); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + return nil +} diff --git a/x/electoral/types/message_enroll_voter_test.go b/x/electoral/types/message_enroll_voter_test.go new file mode 100644 index 00000000..325b64b6 --- /dev/null +++ b/x/electoral/types/message_enroll_voter_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgEnrollVoter_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgEnrollVoter + err error + }{ + { + name: "invalid address", + msg: MsgEnrollVoter{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgEnrollVoter{ + Creator: sample.AccAddress(), + Address: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_revoke_account_operators.go b/x/electoral/types/message_revoke_account_operators.go new file mode 100644 index 00000000..2fd4aa67 --- /dev/null +++ b/x/electoral/types/message_revoke_account_operators.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgRevokeAccountOperators{} + +func NewMsgRevokeAccountOperators(creator string, addresses []string) *MsgRevokeAccountOperators { + return &MsgRevokeAccountOperators{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgRevokeAccountOperators) Route() string { + return RouterKey +} + +func (msg *MsgRevokeAccountOperators) Type() string { + return "RevokeAccountOperators" +} + +func (msg *MsgRevokeAccountOperators) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgRevokeAccountOperators) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgRevokeAccountOperators) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_revoke_account_operators_test.go b/x/electoral/types/message_revoke_account_operators_test.go new file mode 100644 index 00000000..b439bf22 --- /dev/null +++ b/x/electoral/types/message_revoke_account_operators_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgRevokeAccountOperator_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgRevokeAccountOperators + err error + }{ + { + name: "invalid address", + msg: MsgRevokeAccountOperators{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgRevokeAccountOperators{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_revoke_doc_issuers.go b/x/electoral/types/message_revoke_doc_issuers.go new file mode 100644 index 00000000..b0887edf --- /dev/null +++ b/x/electoral/types/message_revoke_doc_issuers.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgRevokeDocIssuers{} + +func NewMsgRevokeDocIssuers(creator string, addresses []string) *MsgRevokeDocIssuers { + return &MsgRevokeDocIssuers{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgRevokeDocIssuers) Route() string { + return RouterKey +} + +func (msg *MsgRevokeDocIssuers) Type() string { + return "RevokeDocIssuers" +} + +func (msg *MsgRevokeDocIssuers) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgRevokeDocIssuers) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgRevokeDocIssuers) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_revoke_doc_issuers_test.go b/x/electoral/types/message_revoke_doc_issuers_test.go new file mode 100644 index 00000000..08f88927 --- /dev/null +++ b/x/electoral/types/message_revoke_doc_issuers_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgRevokeDocIssuer_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgRevokeDocIssuers + err error + }{ + { + name: "invalid address", + msg: MsgRevokeDocIssuers{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgRevokeDocIssuers{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_revoke_id_signers.go b/x/electoral/types/message_revoke_id_signers.go new file mode 100644 index 00000000..d28b351b --- /dev/null +++ b/x/electoral/types/message_revoke_id_signers.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgRevokeIdSigners{} + +func NewMsgRevokeIdSigners(creator string, addresses []string) *MsgRevokeIdSigners { + return &MsgRevokeIdSigners{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgRevokeIdSigners) Route() string { + return RouterKey +} + +func (msg *MsgRevokeIdSigners) Type() string { + return "RevokeIdSigners" +} + +func (msg *MsgRevokeIdSigners) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgRevokeIdSigners) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgRevokeIdSigners) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_revoke_id_signers_test.go b/x/electoral/types/message_revoke_id_signers_test.go new file mode 100644 index 00000000..5b445e81 --- /dev/null +++ b/x/electoral/types/message_revoke_id_signers_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgRevokeIdSigner_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgRevokeIdSigners + err error + }{ + { + name: "invalid address", + msg: MsgRevokeIdSigners{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgRevokeIdSigners{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_revoke_loaders.go b/x/electoral/types/message_revoke_loaders.go new file mode 100644 index 00000000..d9c1e184 --- /dev/null +++ b/x/electoral/types/message_revoke_loaders.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgRevokeLoaders{} + +func NewMsgRevokeLoaders(creator string, addresses []string) *MsgRevokeLoaders { + return &MsgRevokeLoaders{ + Creator: creator, + Addresses: addresses, + } +} + +func (msg *MsgRevokeLoaders) Route() string { + return RouterKey +} + +func (msg *MsgRevokeLoaders) Type() string { + return "RevokeLoaders" +} + +func (msg *MsgRevokeLoaders) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgRevokeLoaders) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgRevokeLoaders) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if len(msg.Addresses) == 0 { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "addresses should not be empty") + } + for _, a := range msg.Addresses { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + } + return nil +} diff --git a/x/electoral/types/message_revoke_loaders_test.go b/x/electoral/types/message_revoke_loaders_test.go new file mode 100644 index 00000000..c0f9c402 --- /dev/null +++ b/x/electoral/types/message_revoke_loaders_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgRevokeLoaders_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgRevokeLoaders + err error + }{ + { + name: "invalid address", + msg: MsgRevokeLoaders{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgRevokeLoaders{ + Creator: sample.AccAddress(), + Addresses: []string{sample.AccAddress()}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/message_revoke_voter.go b/x/electoral/types/message_revoke_voter.go new file mode 100644 index 00000000..901a299c --- /dev/null +++ b/x/electoral/types/message_revoke_voter.go @@ -0,0 +1,48 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgRevokeVoter{} + +func NewMsgRevokeVoter(creator string, address string) *MsgRevokeVoter { + return &MsgRevokeVoter{ + Creator: creator, + Address: address, + } +} + +func (msg *MsgRevokeVoter) Route() string { + return RouterKey +} + +func (msg *MsgRevokeVoter) Type() string { + return "RevokeVoter" +} + +func (msg *MsgRevokeVoter) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgRevokeVoter) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgRevokeVoter) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if _, err := sdk.AccAddressFromBech32(msg.Address); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid address (%s)", err) + } + + return nil +} diff --git a/x/electoral/types/message_revoke_voter_test.go b/x/electoral/types/message_revoke_voter_test.go new file mode 100644 index 00000000..eebe7a8e --- /dev/null +++ b/x/electoral/types/message_revoke_voter_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgRevokeVoter_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgRevokeVoter + err error + }{ + { + name: "invalid address", + msg: MsgRevokeVoter{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgRevokeVoter{ + Creator: sample.AccAddress(), + Address: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/electoral/types/msgs.go b/x/electoral/types/msgs.go deleted file mode 100644 index fe4c77db..00000000 --- a/x/electoral/types/msgs.go +++ /dev/null @@ -1,87 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeEnrollVoterMsg = "enroll_voter" - TypeRevokeVoterMsg = "revoke_voter" -) - -type MsgEnrollVoter struct { - Approver sdk.AccAddress `json:"approver"` - Voter sdk.AccAddress `json:"voters"` -} - -func NewMsgEnrollVoter(approver sdk.AccAddress, voter sdk.AccAddress) MsgEnrollVoter { - return MsgEnrollVoter{ - Approver: approver, - Voter: voter, - } -} - -func (msg MsgEnrollVoter) Route() string { - return RouterKey -} - -func (msg MsgEnrollVoter) Type() string { - return TypeEnrollVoterMsg -} - -func (msg MsgEnrollVoter) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if msg.Voter.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - return nil -} - -func (msg MsgEnrollVoter) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgEnrollVoter) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgRevokeVoter struct { - Approver sdk.AccAddress `json:"approver"` - Voter sdk.AccAddress `json:"voters"` -} - -func NewMsgRevokeVoter(approver sdk.AccAddress, voter sdk.AccAddress) MsgRevokeVoter { - return MsgRevokeVoter{ - Approver: approver, - Voter: voter, - } -} - -func (msg MsgRevokeVoter) Route() string { - return RouterKey -} - -func (msg MsgRevokeVoter) Type() string { - return TypeRevokeVoterMsg -} - -func (msg MsgRevokeVoter) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if msg.Voter.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - return nil -} - -func (msg MsgRevokeVoter) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgRevokeVoter) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} diff --git a/x/electoral/types/querier.go b/x/electoral/types/querier.go deleted file mode 100644 index f7a63a33..00000000 --- a/x/electoral/types/querier.go +++ /dev/null @@ -1,21 +0,0 @@ -package types - -import "strings" - -// QueryResResolve Queries Result Payload for a resolve query -type QueryResResolve struct { - Value string `json:"value"` -} - -// implement fmt.Stringer -func (r QueryResResolve) String() string { - return r.Value -} - -// QueryResNames Queries Result Payload for a names query -type QueryResNames []string - -// implement fmt.Stringer -func (n QueryResNames) String() string { - return strings.Join(n[:], "\n") -} diff --git a/x/electoral/types/query.pb.go b/x/electoral/types/query.pb.go new file mode 100644 index 00000000..43666a8f --- /dev/null +++ b/x/electoral/types/query.pb.go @@ -0,0 +1,4702 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: electoral/query.proto + +package types + +import ( + context "context" + fmt "fmt" + query "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryAccStateRequest struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *QueryAccStateRequest) Reset() { *m = QueryAccStateRequest{} } +func (m *QueryAccStateRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAccStateRequest) ProtoMessage() {} +func (*QueryAccStateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{0} +} +func (m *QueryAccStateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccStateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccStateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccStateRequest.Merge(m, src) +} +func (m *QueryAccStateRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAccStateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccStateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccStateRequest proto.InternalMessageInfo + +func (m *QueryAccStateRequest) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +type QueryAccStateResponse struct { + AccState AccState `protobuf:"bytes,1,opt,name=accState,proto3" json:"accState"` +} + +func (m *QueryAccStateResponse) Reset() { *m = QueryAccStateResponse{} } +func (m *QueryAccStateResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAccStateResponse) ProtoMessage() {} +func (*QueryAccStateResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{1} +} +func (m *QueryAccStateResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccStateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccStateResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccStateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccStateResponse.Merge(m, src) +} +func (m *QueryAccStateResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAccStateResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccStateResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccStateResponse proto.InternalMessageInfo + +func (m *QueryAccStateResponse) GetAccState() AccState { + if m != nil { + return m.AccState + } + return AccState{} +} + +type QueryAccStatesRequest struct { + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryAccStatesRequest) Reset() { *m = QueryAccStatesRequest{} } +func (m *QueryAccStatesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAccStatesRequest) ProtoMessage() {} +func (*QueryAccStatesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{2} +} +func (m *QueryAccStatesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccStatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccStatesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccStatesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccStatesRequest.Merge(m, src) +} +func (m *QueryAccStatesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAccStatesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccStatesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccStatesRequest proto.InternalMessageInfo + +func (m *QueryAccStatesRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +type QueryAccStatesResponse struct { + AccState []AccState `protobuf:"bytes,1,rep,name=accState,proto3" json:"accState"` + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryAccStatesResponse) Reset() { *m = QueryAccStatesResponse{} } +func (m *QueryAccStatesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAccStatesResponse) ProtoMessage() {} +func (*QueryAccStatesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{3} +} +func (m *QueryAccStatesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccStatesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccStatesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccStatesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccStatesResponse.Merge(m, src) +} +func (m *QueryAccStatesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAccStatesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccStatesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccStatesResponse proto.InternalMessageInfo + +func (m *QueryAccStatesResponse) GetAccState() []AccState { + if m != nil { + return m.AccState + } + return nil +} + +func (m *QueryAccStatesResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + +type QueryVoterRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryVoterRequest) Reset() { *m = QueryVoterRequest{} } +func (m *QueryVoterRequest) String() string { return proto.CompactTextString(m) } +func (*QueryVoterRequest) ProtoMessage() {} +func (*QueryVoterRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{4} +} +func (m *QueryVoterRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVoterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVoterRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVoterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVoterRequest.Merge(m, src) +} +func (m *QueryVoterRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryVoterRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVoterRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVoterRequest proto.InternalMessageInfo + +func (m *QueryVoterRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type QueryVoterResponse struct { + Voter AccState `protobuf:"bytes,1,opt,name=voter,proto3" json:"voter"` +} + +func (m *QueryVoterResponse) Reset() { *m = QueryVoterResponse{} } +func (m *QueryVoterResponse) String() string { return proto.CompactTextString(m) } +func (*QueryVoterResponse) ProtoMessage() {} +func (*QueryVoterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{5} +} +func (m *QueryVoterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVoterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVoterResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVoterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVoterResponse.Merge(m, src) +} +func (m *QueryVoterResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryVoterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVoterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVoterResponse proto.InternalMessageInfo + +func (m *QueryVoterResponse) GetVoter() AccState { + if m != nil { + return m.Voter + } + return AccState{} +} + +type QueryLoaderRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryLoaderRequest) Reset() { *m = QueryLoaderRequest{} } +func (m *QueryLoaderRequest) String() string { return proto.CompactTextString(m) } +func (*QueryLoaderRequest) ProtoMessage() {} +func (*QueryLoaderRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{6} +} +func (m *QueryLoaderRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLoaderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLoaderRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLoaderRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLoaderRequest.Merge(m, src) +} +func (m *QueryLoaderRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryLoaderRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLoaderRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLoaderRequest proto.InternalMessageInfo + +func (m *QueryLoaderRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type QueryLoaderResponse struct { + AccState *AccState `protobuf:"bytes,1,opt,name=accState,proto3" json:"accState,omitempty"` +} + +func (m *QueryLoaderResponse) Reset() { *m = QueryLoaderResponse{} } +func (m *QueryLoaderResponse) String() string { return proto.CompactTextString(m) } +func (*QueryLoaderResponse) ProtoMessage() {} +func (*QueryLoaderResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{7} +} +func (m *QueryLoaderResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLoaderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLoaderResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLoaderResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLoaderResponse.Merge(m, src) +} +func (m *QueryLoaderResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryLoaderResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLoaderResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLoaderResponse proto.InternalMessageInfo + +func (m *QueryLoaderResponse) GetAccState() *AccState { + if m != nil { + return m.AccState + } + return nil +} + +type QueryIdSignerRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryIdSignerRequest) Reset() { *m = QueryIdSignerRequest{} } +func (m *QueryIdSignerRequest) String() string { return proto.CompactTextString(m) } +func (*QueryIdSignerRequest) ProtoMessage() {} +func (*QueryIdSignerRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{8} +} +func (m *QueryIdSignerRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdSignerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdSignerRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdSignerRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdSignerRequest.Merge(m, src) +} +func (m *QueryIdSignerRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryIdSignerRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdSignerRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdSignerRequest proto.InternalMessageInfo + +func (m *QueryIdSignerRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type QueryIdSignerResponse struct { + AccState *AccState `protobuf:"bytes,1,opt,name=accState,proto3" json:"accState,omitempty"` +} + +func (m *QueryIdSignerResponse) Reset() { *m = QueryIdSignerResponse{} } +func (m *QueryIdSignerResponse) String() string { return proto.CompactTextString(m) } +func (*QueryIdSignerResponse) ProtoMessage() {} +func (*QueryIdSignerResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{9} +} +func (m *QueryIdSignerResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdSignerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdSignerResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdSignerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdSignerResponse.Merge(m, src) +} +func (m *QueryIdSignerResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryIdSignerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdSignerResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdSignerResponse proto.InternalMessageInfo + +func (m *QueryIdSignerResponse) GetAccState() *AccState { + if m != nil { + return m.AccState + } + return nil +} + +type QueryIdSignersRequest struct { +} + +func (m *QueryIdSignersRequest) Reset() { *m = QueryIdSignersRequest{} } +func (m *QueryIdSignersRequest) String() string { return proto.CompactTextString(m) } +func (*QueryIdSignersRequest) ProtoMessage() {} +func (*QueryIdSignersRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{10} +} +func (m *QueryIdSignersRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdSignersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdSignersRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdSignersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdSignersRequest.Merge(m, src) +} +func (m *QueryIdSignersRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryIdSignersRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdSignersRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdSignersRequest proto.InternalMessageInfo + +type QueryIdSignersResponse struct { + AccStates []*AccState `protobuf:"bytes,1,rep,name=accStates,proto3" json:"accStates,omitempty"` +} + +func (m *QueryIdSignersResponse) Reset() { *m = QueryIdSignersResponse{} } +func (m *QueryIdSignersResponse) String() string { return proto.CompactTextString(m) } +func (*QueryIdSignersResponse) ProtoMessage() {} +func (*QueryIdSignersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{11} +} +func (m *QueryIdSignersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdSignersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdSignersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdSignersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdSignersResponse.Merge(m, src) +} +func (m *QueryIdSignersResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryIdSignersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdSignersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdSignersResponse proto.InternalMessageInfo + +func (m *QueryIdSignersResponse) GetAccStates() []*AccState { + if m != nil { + return m.AccStates + } + return nil +} + +type QueryAccountOperatorRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryAccountOperatorRequest) Reset() { *m = QueryAccountOperatorRequest{} } +func (m *QueryAccountOperatorRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAccountOperatorRequest) ProtoMessage() {} +func (*QueryAccountOperatorRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{12} +} +func (m *QueryAccountOperatorRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccountOperatorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccountOperatorRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccountOperatorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccountOperatorRequest.Merge(m, src) +} +func (m *QueryAccountOperatorRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAccountOperatorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccountOperatorRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccountOperatorRequest proto.InternalMessageInfo + +func (m *QueryAccountOperatorRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type QueryAccountOperatorResponse struct { + AccState *AccState `protobuf:"bytes,1,opt,name=accState,proto3" json:"accState,omitempty"` +} + +func (m *QueryAccountOperatorResponse) Reset() { *m = QueryAccountOperatorResponse{} } +func (m *QueryAccountOperatorResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAccountOperatorResponse) ProtoMessage() {} +func (*QueryAccountOperatorResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{13} +} +func (m *QueryAccountOperatorResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccountOperatorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccountOperatorResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccountOperatorResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccountOperatorResponse.Merge(m, src) +} +func (m *QueryAccountOperatorResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAccountOperatorResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccountOperatorResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccountOperatorResponse proto.InternalMessageInfo + +func (m *QueryAccountOperatorResponse) GetAccState() *AccState { + if m != nil { + return m.AccState + } + return nil +} + +type QueryAccountOperatorsRequest struct { +} + +func (m *QueryAccountOperatorsRequest) Reset() { *m = QueryAccountOperatorsRequest{} } +func (m *QueryAccountOperatorsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAccountOperatorsRequest) ProtoMessage() {} +func (*QueryAccountOperatorsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{14} +} +func (m *QueryAccountOperatorsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccountOperatorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccountOperatorsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccountOperatorsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccountOperatorsRequest.Merge(m, src) +} +func (m *QueryAccountOperatorsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAccountOperatorsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccountOperatorsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccountOperatorsRequest proto.InternalMessageInfo + +type QueryAccountOperatorsResponse struct { + AccStates []*AccState `protobuf:"bytes,1,rep,name=accStates,proto3" json:"accStates,omitempty"` +} + +func (m *QueryAccountOperatorsResponse) Reset() { *m = QueryAccountOperatorsResponse{} } +func (m *QueryAccountOperatorsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAccountOperatorsResponse) ProtoMessage() {} +func (*QueryAccountOperatorsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{15} +} +func (m *QueryAccountOperatorsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAccountOperatorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAccountOperatorsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAccountOperatorsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAccountOperatorsResponse.Merge(m, src) +} +func (m *QueryAccountOperatorsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAccountOperatorsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAccountOperatorsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAccountOperatorsResponse proto.InternalMessageInfo + +func (m *QueryAccountOperatorsResponse) GetAccStates() []*AccState { + if m != nil { + return m.AccStates + } + return nil +} + +type QueryDocumentIssuerRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryDocumentIssuerRequest) Reset() { *m = QueryDocumentIssuerRequest{} } +func (m *QueryDocumentIssuerRequest) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentIssuerRequest) ProtoMessage() {} +func (*QueryDocumentIssuerRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{16} +} +func (m *QueryDocumentIssuerRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentIssuerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentIssuerRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentIssuerRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentIssuerRequest.Merge(m, src) +} +func (m *QueryDocumentIssuerRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentIssuerRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentIssuerRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentIssuerRequest proto.InternalMessageInfo + +func (m *QueryDocumentIssuerRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type QueryDocumentIssuerResponse struct { + AccState *AccState `protobuf:"bytes,1,opt,name=accState,proto3" json:"accState,omitempty"` +} + +func (m *QueryDocumentIssuerResponse) Reset() { *m = QueryDocumentIssuerResponse{} } +func (m *QueryDocumentIssuerResponse) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentIssuerResponse) ProtoMessage() {} +func (*QueryDocumentIssuerResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{17} +} +func (m *QueryDocumentIssuerResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentIssuerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentIssuerResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentIssuerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentIssuerResponse.Merge(m, src) +} +func (m *QueryDocumentIssuerResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentIssuerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentIssuerResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentIssuerResponse proto.InternalMessageInfo + +func (m *QueryDocumentIssuerResponse) GetAccState() *AccState { + if m != nil { + return m.AccState + } + return nil +} + +type QueryDocumentIssuersRequest struct { +} + +func (m *QueryDocumentIssuersRequest) Reset() { *m = QueryDocumentIssuersRequest{} } +func (m *QueryDocumentIssuersRequest) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentIssuersRequest) ProtoMessage() {} +func (*QueryDocumentIssuersRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{18} +} +func (m *QueryDocumentIssuersRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentIssuersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentIssuersRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentIssuersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentIssuersRequest.Merge(m, src) +} +func (m *QueryDocumentIssuersRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentIssuersRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentIssuersRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentIssuersRequest proto.InternalMessageInfo + +type QueryDocumentIssuersResponse struct { + AccStates []*AccState `protobuf:"bytes,1,rep,name=accStates,proto3" json:"accStates,omitempty"` +} + +func (m *QueryDocumentIssuersResponse) Reset() { *m = QueryDocumentIssuersResponse{} } +func (m *QueryDocumentIssuersResponse) String() string { return proto.CompactTextString(m) } +func (*QueryDocumentIssuersResponse) ProtoMessage() {} +func (*QueryDocumentIssuersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{19} +} +func (m *QueryDocumentIssuersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryDocumentIssuersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryDocumentIssuersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryDocumentIssuersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryDocumentIssuersResponse.Merge(m, src) +} +func (m *QueryDocumentIssuersResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryDocumentIssuersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryDocumentIssuersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryDocumentIssuersResponse proto.InternalMessageInfo + +func (m *QueryDocumentIssuersResponse) GetAccStates() []*AccState { + if m != nil { + return m.AccStates + } + return nil +} + +type QueryVotersRequest struct { +} + +func (m *QueryVotersRequest) Reset() { *m = QueryVotersRequest{} } +func (m *QueryVotersRequest) String() string { return proto.CompactTextString(m) } +func (*QueryVotersRequest) ProtoMessage() {} +func (*QueryVotersRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{20} +} +func (m *QueryVotersRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVotersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVotersRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVotersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVotersRequest.Merge(m, src) +} +func (m *QueryVotersRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryVotersRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVotersRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVotersRequest proto.InternalMessageInfo + +type QueryVotersResponse struct { + Voters []*AccState `protobuf:"bytes,1,rep,name=voters,proto3" json:"voters,omitempty"` +} + +func (m *QueryVotersResponse) Reset() { *m = QueryVotersResponse{} } +func (m *QueryVotersResponse) String() string { return proto.CompactTextString(m) } +func (*QueryVotersResponse) ProtoMessage() {} +func (*QueryVotersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{21} +} +func (m *QueryVotersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVotersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVotersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVotersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVotersResponse.Merge(m, src) +} +func (m *QueryVotersResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryVotersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVotersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVotersResponse proto.InternalMessageInfo + +func (m *QueryVotersResponse) GetVoters() []*AccState { + if m != nil { + return m.Voters + } + return nil +} + +type QueryLoadersRequest struct { +} + +func (m *QueryLoadersRequest) Reset() { *m = QueryLoadersRequest{} } +func (m *QueryLoadersRequest) String() string { return proto.CompactTextString(m) } +func (*QueryLoadersRequest) ProtoMessage() {} +func (*QueryLoadersRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{22} +} +func (m *QueryLoadersRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLoadersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLoadersRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLoadersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLoadersRequest.Merge(m, src) +} +func (m *QueryLoadersRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryLoadersRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLoadersRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLoadersRequest proto.InternalMessageInfo + +type QueryLoadersResponse struct { + Loaders []*AccState `protobuf:"bytes,1,rep,name=loaders,proto3" json:"loaders,omitempty"` +} + +func (m *QueryLoadersResponse) Reset() { *m = QueryLoadersResponse{} } +func (m *QueryLoadersResponse) String() string { return proto.CompactTextString(m) } +func (*QueryLoadersResponse) ProtoMessage() {} +func (*QueryLoadersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e9c721b48ee5d4ec, []int{23} +} +func (m *QueryLoadersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLoadersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLoadersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLoadersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLoadersResponse.Merge(m, src) +} +func (m *QueryLoadersResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryLoadersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLoadersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLoadersResponse proto.InternalMessageInfo + +func (m *QueryLoadersResponse) GetLoaders() []*AccState { + if m != nil { + return m.Loaders + } + return nil +} + +func init() { + proto.RegisterType((*QueryAccStateRequest)(nil), "shareledger.electoral.QueryAccStateRequest") + proto.RegisterType((*QueryAccStateResponse)(nil), "shareledger.electoral.QueryAccStateResponse") + proto.RegisterType((*QueryAccStatesRequest)(nil), "shareledger.electoral.QueryAccStatesRequest") + proto.RegisterType((*QueryAccStatesResponse)(nil), "shareledger.electoral.QueryAccStatesResponse") + proto.RegisterType((*QueryVoterRequest)(nil), "shareledger.electoral.QueryVoterRequest") + proto.RegisterType((*QueryVoterResponse)(nil), "shareledger.electoral.QueryVoterResponse") + proto.RegisterType((*QueryLoaderRequest)(nil), "shareledger.electoral.QueryLoaderRequest") + proto.RegisterType((*QueryLoaderResponse)(nil), "shareledger.electoral.QueryLoaderResponse") + proto.RegisterType((*QueryIdSignerRequest)(nil), "shareledger.electoral.QueryIdSignerRequest") + proto.RegisterType((*QueryIdSignerResponse)(nil), "shareledger.electoral.QueryIdSignerResponse") + proto.RegisterType((*QueryIdSignersRequest)(nil), "shareledger.electoral.QueryIdSignersRequest") + proto.RegisterType((*QueryIdSignersResponse)(nil), "shareledger.electoral.QueryIdSignersResponse") + proto.RegisterType((*QueryAccountOperatorRequest)(nil), "shareledger.electoral.QueryAccountOperatorRequest") + proto.RegisterType((*QueryAccountOperatorResponse)(nil), "shareledger.electoral.QueryAccountOperatorResponse") + proto.RegisterType((*QueryAccountOperatorsRequest)(nil), "shareledger.electoral.QueryAccountOperatorsRequest") + proto.RegisterType((*QueryAccountOperatorsResponse)(nil), "shareledger.electoral.QueryAccountOperatorsResponse") + proto.RegisterType((*QueryDocumentIssuerRequest)(nil), "shareledger.electoral.QueryDocumentIssuerRequest") + proto.RegisterType((*QueryDocumentIssuerResponse)(nil), "shareledger.electoral.QueryDocumentIssuerResponse") + proto.RegisterType((*QueryDocumentIssuersRequest)(nil), "shareledger.electoral.QueryDocumentIssuersRequest") + proto.RegisterType((*QueryDocumentIssuersResponse)(nil), "shareledger.electoral.QueryDocumentIssuersResponse") + proto.RegisterType((*QueryVotersRequest)(nil), "shareledger.electoral.QueryVotersRequest") + proto.RegisterType((*QueryVotersResponse)(nil), "shareledger.electoral.QueryVotersResponse") + proto.RegisterType((*QueryLoadersRequest)(nil), "shareledger.electoral.QueryLoadersRequest") + proto.RegisterType((*QueryLoadersResponse)(nil), "shareledger.electoral.QueryLoadersResponse") +} + +func init() { proto.RegisterFile("electoral/query.proto", fileDescriptor_e9c721b48ee5d4ec) } + +var fileDescriptor_e9c721b48ee5d4ec = []byte{ + // 950 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x97, 0x4d, 0x6f, 0xdc, 0x44, + 0x18, 0xc7, 0x33, 0x2d, 0x79, 0x7b, 0x90, 0xda, 0xf2, 0x90, 0x40, 0x31, 0x8d, 0x13, 0x59, 0x22, + 0xdd, 0xa6, 0xad, 0x9d, 0x6c, 0x10, 0xa5, 0x42, 0x1c, 0x5a, 0x21, 0x50, 0xa5, 0x0a, 0xc8, 0x16, + 0x81, 0x14, 0x04, 0xd5, 0xc4, 0x3b, 0x72, 0xac, 0x6e, 0x3c, 0x5b, 0xcf, 0xb8, 0x62, 0x55, 0xf5, + 0xc2, 0x81, 0x03, 0x12, 0x12, 0x2f, 0xe2, 0xc0, 0x9d, 0x13, 0x07, 0x24, 0x0e, 0x7c, 0x87, 0x1e, + 0x2b, 0x71, 0xe1, 0x84, 0x50, 0xc2, 0x85, 0x6f, 0x81, 0x76, 0x3c, 0xf6, 0xda, 0x8e, 0xbd, 0x3b, + 0x8b, 0xf6, 0xe6, 0xcc, 0x3c, 0x2f, 0xbf, 0x7d, 0xe6, 0x3f, 0xf3, 0x57, 0x60, 0x95, 0xf5, 0x98, + 0x2f, 0x79, 0x4c, 0x7b, 0xde, 0xc3, 0x84, 0xc5, 0x03, 0xb7, 0x1f, 0x73, 0xc9, 0x71, 0x55, 0x1c, + 0xd2, 0x98, 0xf5, 0x58, 0x37, 0x60, 0xb1, 0x9b, 0x87, 0x58, 0x97, 0x02, 0xce, 0x83, 0x1e, 0xf3, + 0x68, 0x3f, 0xf4, 0x68, 0x14, 0x71, 0x49, 0x65, 0xc8, 0x23, 0x91, 0x26, 0x59, 0x5b, 0x3e, 0x17, + 0x47, 0x5c, 0x78, 0x07, 0x54, 0xb0, 0xb4, 0x9a, 0xf7, 0x68, 0xe7, 0x80, 0x49, 0xba, 0xe3, 0xf5, + 0x69, 0x10, 0x46, 0x2a, 0x58, 0xc7, 0xbe, 0x32, 0xea, 0x4b, 0x7d, 0xff, 0xbe, 0x90, 0x54, 0xb2, + 0x9a, 0xad, 0x44, 0x1e, 0xf2, 0x38, 0x94, 0x83, 0xd3, 0x5b, 0x32, 0x66, 0x54, 0x24, 0x31, 0x8b, + 0xf5, 0xd6, 0x4a, 0xc0, 0x03, 0xae, 0x3e, 0xbd, 0xe1, 0x57, 0xba, 0xea, 0xb4, 0x60, 0x65, 0x6f, + 0x08, 0x72, 0xcb, 0xf7, 0xef, 0x0d, 0x5b, 0x74, 0xd8, 0xc3, 0x84, 0x09, 0x89, 0x17, 0xe0, 0xec, + 0x03, 0x36, 0xb8, 0x48, 0x36, 0x48, 0x6b, 0xb9, 0x33, 0xfc, 0x74, 0xf6, 0x61, 0xb5, 0x12, 0x29, + 0xfa, 0x3c, 0x12, 0x0c, 0x6f, 0xc1, 0x12, 0xd5, 0x6b, 0x2a, 0xfe, 0xf9, 0xf6, 0xba, 0x5b, 0x3b, + 0x1d, 0x37, 0x4b, 0xbd, 0xfd, 0xdc, 0xd3, 0xbf, 0xd6, 0xe7, 0x3a, 0x79, 0x9a, 0x73, 0xbf, 0x52, + 0x5b, 0x64, 0x18, 0xef, 0x02, 0x8c, 0x26, 0xa3, 0xab, 0x6f, 0xba, 0xe9, 0x18, 0xdd, 0xe1, 0x18, + 0xdd, 0xf4, 0x50, 0xf4, 0x18, 0xdd, 0x0f, 0x69, 0x90, 0xfd, 0x84, 0x4e, 0x21, 0xd3, 0xf9, 0x99, + 0xc0, 0x4b, 0xd5, 0x0e, 0xb5, 0xf8, 0x67, 0xff, 0x07, 0x3e, 0xbe, 0x57, 0xa2, 0x3c, 0xa3, 0x28, + 0x2f, 0x4f, 0xa4, 0x4c, 0xfb, 0x97, 0x30, 0xaf, 0xc3, 0x0b, 0x8a, 0xf2, 0x63, 0x2e, 0x59, 0x9c, + 0xcd, 0xe0, 0x22, 0x2c, 0xd2, 0x6e, 0x37, 0x66, 0x42, 0xe8, 0xe3, 0xc8, 0xfe, 0x74, 0xf6, 0x00, + 0x8b, 0xe1, 0xfa, 0x07, 0xbd, 0x05, 0xf3, 0x8f, 0x86, 0x0b, 0xd3, 0x1d, 0x46, 0x9a, 0xe3, 0xb8, + 0xba, 0xe4, 0x5d, 0x4e, 0xbb, 0x26, 0x08, 0x1d, 0x78, 0xb1, 0x14, 0x9f, 0x33, 0x4c, 0xab, 0x89, + 0x82, 0x1a, 0xb6, 0xb5, 0x26, 0xef, 0x74, 0xef, 0x85, 0x41, 0x64, 0x42, 0xf1, 0x91, 0xd6, 0xcf, + 0x28, 0x63, 0x16, 0x1c, 0x2f, 0x57, 0xaa, 0x66, 0xaa, 0x74, 0x3e, 0xd1, 0x62, 0x2a, 0x6c, 0xe8, + 0x7e, 0x6f, 0xc3, 0x72, 0x96, 0x2e, 0x0c, 0xd5, 0xd4, 0x19, 0x65, 0x38, 0x37, 0xe0, 0xd5, 0x4c, + 0xa5, 0x3c, 0x89, 0xe4, 0x07, 0x7d, 0x16, 0x53, 0xc9, 0x0d, 0x06, 0xf0, 0x29, 0x5c, 0xaa, 0x4f, + 0x9c, 0xc5, 0x1c, 0xec, 0xfa, 0xe2, 0xf9, 0x38, 0x3e, 0x87, 0xb5, 0x86, 0xfd, 0xd9, 0x4c, 0xe5, + 0x0d, 0xb0, 0x54, 0xfd, 0x77, 0xb8, 0x9f, 0x1c, 0xb1, 0x48, 0xde, 0x11, 0x22, 0x31, 0x51, 0xc5, + 0xbe, 0x9e, 0x66, 0x35, 0x6f, 0x16, 0x33, 0x59, 0xab, 0xad, 0x9d, 0x8f, 0xe4, 0x33, 0x3d, 0xb2, + 0x53, 0xdb, 0xb3, 0x99, 0xc8, 0x4a, 0xf1, 0xe2, 0xe7, 0x4d, 0xdf, 0xd7, 0x77, 0x31, 0x5b, 0xd5, + 0xbd, 0x6e, 0xc0, 0x82, 0xba, 0xdb, 0xc6, 0x8d, 0x74, 0xb8, 0xb3, 0x5a, 0xba, 0xdb, 0x79, 0x9b, + 0x3d, 0x7d, 0x3d, 0xf3, 0x65, 0xdd, 0xe7, 0x26, 0x2c, 0xf6, 0xd2, 0x25, 0xd3, 0x46, 0x59, 0x7c, + 0xfb, 0xdf, 0x73, 0x30, 0xaf, 0x6a, 0xe2, 0x8f, 0x04, 0x96, 0xb2, 0x7d, 0xbc, 0xda, 0x50, 0xa0, + 0xce, 0xb1, 0xac, 0x6b, 0x66, 0xc1, 0x29, 0xac, 0xe3, 0x7e, 0xf9, 0xc7, 0x3f, 0x3f, 0x9c, 0x69, + 0xe1, 0xa6, 0x57, 0xc8, 0xf2, 0x4a, 0x9e, 0x9b, 0xce, 0xda, 0x7b, 0xfc, 0x80, 0x0d, 0x9e, 0xe0, + 0xf7, 0x04, 0x96, 0x73, 0xef, 0x40, 0xa3, 0x5e, 0xd9, 0xc0, 0xac, 0xeb, 0x86, 0xd1, 0x1a, 0xad, + 0xa5, 0xd0, 0x1c, 0xdc, 0x98, 0x84, 0x86, 0xdf, 0x10, 0x98, 0x57, 0x87, 0x8d, 0xad, 0x71, 0x2d, + 0x8a, 0x6e, 0x62, 0x5d, 0x31, 0x88, 0xd4, 0x20, 0x9e, 0x02, 0xb9, 0x82, 0x97, 0x1b, 0x40, 0x52, + 0x99, 0x78, 0x8f, 0xf5, 0x7d, 0x7b, 0x82, 0xdf, 0x11, 0x58, 0x48, 0x55, 0x81, 0x63, 0xdb, 0x94, + 0xcc, 0xc5, 0xda, 0x32, 0x09, 0xd5, 0x48, 0xdb, 0x0a, 0x69, 0x0b, 0x5b, 0x0d, 0x48, 0x5a, 0x50, + 0x05, 0xa6, 0x9f, 0x08, 0x2c, 0x65, 0xef, 0xf4, 0x78, 0x41, 0x55, 0xec, 0x66, 0xbc, 0xa0, 0xaa, + 0x4e, 0xe3, 0xb4, 0x15, 0xd9, 0x35, 0xdc, 0x6a, 0x20, 0x0b, 0x33, 0xaf, 0x28, 0xb0, 0x0d, 0x45, + 0x95, 0x7b, 0x08, 0x1a, 0xf5, 0x33, 0x13, 0xd5, 0x29, 0x63, 0x9a, 0x28, 0xaa, 0x1c, 0x0f, 0x7f, + 0x27, 0x70, 0xbe, 0xf2, 0x92, 0x63, 0x7b, 0x82, 0x82, 0x6b, 0xcc, 0xca, 0xda, 0x9d, 0x2a, 0x47, + 0x63, 0xde, 0x54, 0x98, 0xbb, 0xb8, 0xd3, 0xac, 0xfd, 0x92, 0xc5, 0x14, 0x86, 0xf9, 0x2b, 0x81, + 0x0b, 0x55, 0x07, 0xc2, 0x69, 0x20, 0xf2, 0xd1, 0xbe, 0x3e, 0x5d, 0x92, 0xe1, 0x6d, 0xa9, 0xa2, + 0xe3, 0x6f, 0x04, 0xce, 0x95, 0xfd, 0x01, 0x77, 0xc6, 0x75, 0xae, 0xb5, 0x3f, 0xab, 0x3d, 0x4d, + 0x8a, 0x46, 0x7d, 0x53, 0xa1, 0xb6, 0x71, 0xbb, 0x01, 0xb5, 0x5b, 0x76, 0xad, 0xc2, 0x90, 0x7f, + 0x21, 0x70, 0xbe, 0xe2, 0x69, 0x38, 0x05, 0x81, 0x30, 0x12, 0x47, 0x83, 0x69, 0x4e, 0x7c, 0xb3, + 0x2b, 0xd8, 0xf8, 0x15, 0x81, 0x85, 0xd4, 0x0b, 0x71, 0xf2, 0xab, 0x27, 0x8c, 0x9e, 0xa3, 0xb2, + 0xb5, 0x3a, 0xaf, 0x29, 0xa2, 0x75, 0x5c, 0x1b, 0xfb, 0x42, 0xe2, 0xd7, 0x04, 0x16, 0xb5, 0x5b, + 0xa2, 0xc1, 0x6b, 0x97, 0xa3, 0x5c, 0x35, 0x8a, 0xd5, 0x2c, 0x9b, 0x8a, 0x65, 0x03, 0xed, 0xf1, + 0x4f, 0xe3, 0xed, 0xbb, 0x4f, 0x8f, 0x6d, 0xf2, 0xec, 0xd8, 0x26, 0x7f, 0x1f, 0xdb, 0xe4, 0xdb, + 0x13, 0x7b, 0xee, 0xd9, 0x89, 0x3d, 0xf7, 0xe7, 0x89, 0x3d, 0xb7, 0xdf, 0x0e, 0x42, 0x79, 0x98, + 0x1c, 0xb8, 0x3e, 0x3f, 0x4a, 0x6b, 0xc4, 0x61, 0x14, 0x94, 0xaa, 0x7d, 0x51, 0xa8, 0x27, 0x07, + 0x7d, 0x26, 0x0e, 0x16, 0xd4, 0xbf, 0x91, 0xbb, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x26, 0xee, + 0xd4, 0x48, 0x27, 0x0f, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Queries a accState by index. + AccState(ctx context.Context, in *QueryAccStateRequest, opts ...grpc.CallOption) (*QueryAccStateResponse, error) + // Queries a list of accState items. + AccStates(ctx context.Context, in *QueryAccStatesRequest, opts ...grpc.CallOption) (*QueryAccStatesResponse, error) + // Queries a list of Voter items. + Voter(ctx context.Context, in *QueryVoterRequest, opts ...grpc.CallOption) (*QueryVoterResponse, error) + // Queries a list of Loader items. + Loader(ctx context.Context, in *QueryLoaderRequest, opts ...grpc.CallOption) (*QueryLoaderResponse, error) + // Queries a list of idSigner items. + IdSigner(ctx context.Context, in *QueryIdSignerRequest, opts ...grpc.CallOption) (*QueryIdSignerResponse, error) + // Queries a list of idSigners items. + IdSigners(ctx context.Context, in *QueryIdSignersRequest, opts ...grpc.CallOption) (*QueryIdSignersResponse, error) + // Queries a list of accountOperator items. + AccountOperator(ctx context.Context, in *QueryAccountOperatorRequest, opts ...grpc.CallOption) (*QueryAccountOperatorResponse, error) + // Queries a list of accountOperators items. + AccountOperators(ctx context.Context, in *QueryAccountOperatorsRequest, opts ...grpc.CallOption) (*QueryAccountOperatorsResponse, error) + // Queries a list of documentIssuer items. + DocumentIssuer(ctx context.Context, in *QueryDocumentIssuerRequest, opts ...grpc.CallOption) (*QueryDocumentIssuerResponse, error) + // Queries a list of documentIssuers items. + DocumentIssuers(ctx context.Context, in *QueryDocumentIssuersRequest, opts ...grpc.CallOption) (*QueryDocumentIssuersResponse, error) + // Queries a list of Voters items. + Voters(ctx context.Context, in *QueryVotersRequest, opts ...grpc.CallOption) (*QueryVotersResponse, error) + // Queries a list of Loaders items. + Loaders(ctx context.Context, in *QueryLoadersRequest, opts ...grpc.CallOption) (*QueryLoadersResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) AccState(ctx context.Context, in *QueryAccStateRequest, opts ...grpc.CallOption) (*QueryAccStateResponse, error) { + out := new(QueryAccStateResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/AccState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) AccStates(ctx context.Context, in *QueryAccStatesRequest, opts ...grpc.CallOption) (*QueryAccStatesResponse, error) { + out := new(QueryAccStatesResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/AccStates", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Voter(ctx context.Context, in *QueryVoterRequest, opts ...grpc.CallOption) (*QueryVoterResponse, error) { + out := new(QueryVoterResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/Voter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Loader(ctx context.Context, in *QueryLoaderRequest, opts ...grpc.CallOption) (*QueryLoaderResponse, error) { + out := new(QueryLoaderResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/Loader", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) IdSigner(ctx context.Context, in *QueryIdSignerRequest, opts ...grpc.CallOption) (*QueryIdSignerResponse, error) { + out := new(QueryIdSignerResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/IdSigner", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) IdSigners(ctx context.Context, in *QueryIdSignersRequest, opts ...grpc.CallOption) (*QueryIdSignersResponse, error) { + out := new(QueryIdSignersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/IdSigners", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) AccountOperator(ctx context.Context, in *QueryAccountOperatorRequest, opts ...grpc.CallOption) (*QueryAccountOperatorResponse, error) { + out := new(QueryAccountOperatorResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/AccountOperator", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) AccountOperators(ctx context.Context, in *QueryAccountOperatorsRequest, opts ...grpc.CallOption) (*QueryAccountOperatorsResponse, error) { + out := new(QueryAccountOperatorsResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/AccountOperators", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) DocumentIssuer(ctx context.Context, in *QueryDocumentIssuerRequest, opts ...grpc.CallOption) (*QueryDocumentIssuerResponse, error) { + out := new(QueryDocumentIssuerResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/DocumentIssuer", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) DocumentIssuers(ctx context.Context, in *QueryDocumentIssuersRequest, opts ...grpc.CallOption) (*QueryDocumentIssuersResponse, error) { + out := new(QueryDocumentIssuersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/DocumentIssuers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Voters(ctx context.Context, in *QueryVotersRequest, opts ...grpc.CallOption) (*QueryVotersResponse, error) { + out := new(QueryVotersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/Voters", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Loaders(ctx context.Context, in *QueryLoadersRequest, opts ...grpc.CallOption) (*QueryLoadersResponse, error) { + out := new(QueryLoadersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Query/Loaders", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Queries a accState by index. + AccState(context.Context, *QueryAccStateRequest) (*QueryAccStateResponse, error) + // Queries a list of accState items. + AccStates(context.Context, *QueryAccStatesRequest) (*QueryAccStatesResponse, error) + // Queries a list of Voter items. + Voter(context.Context, *QueryVoterRequest) (*QueryVoterResponse, error) + // Queries a list of Loader items. + Loader(context.Context, *QueryLoaderRequest) (*QueryLoaderResponse, error) + // Queries a list of idSigner items. + IdSigner(context.Context, *QueryIdSignerRequest) (*QueryIdSignerResponse, error) + // Queries a list of idSigners items. + IdSigners(context.Context, *QueryIdSignersRequest) (*QueryIdSignersResponse, error) + // Queries a list of accountOperator items. + AccountOperator(context.Context, *QueryAccountOperatorRequest) (*QueryAccountOperatorResponse, error) + // Queries a list of accountOperators items. + AccountOperators(context.Context, *QueryAccountOperatorsRequest) (*QueryAccountOperatorsResponse, error) + // Queries a list of documentIssuer items. + DocumentIssuer(context.Context, *QueryDocumentIssuerRequest) (*QueryDocumentIssuerResponse, error) + // Queries a list of documentIssuers items. + DocumentIssuers(context.Context, *QueryDocumentIssuersRequest) (*QueryDocumentIssuersResponse, error) + // Queries a list of Voters items. + Voters(context.Context, *QueryVotersRequest) (*QueryVotersResponse, error) + // Queries a list of Loaders items. + Loaders(context.Context, *QueryLoadersRequest) (*QueryLoadersResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) AccState(ctx context.Context, req *QueryAccStateRequest) (*QueryAccStateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AccState not implemented") +} +func (*UnimplementedQueryServer) AccStates(ctx context.Context, req *QueryAccStatesRequest) (*QueryAccStatesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AccStates not implemented") +} +func (*UnimplementedQueryServer) Voter(ctx context.Context, req *QueryVoterRequest) (*QueryVoterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Voter not implemented") +} +func (*UnimplementedQueryServer) Loader(ctx context.Context, req *QueryLoaderRequest) (*QueryLoaderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Loader not implemented") +} +func (*UnimplementedQueryServer) IdSigner(ctx context.Context, req *QueryIdSignerRequest) (*QueryIdSignerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IdSigner not implemented") +} +func (*UnimplementedQueryServer) IdSigners(ctx context.Context, req *QueryIdSignersRequest) (*QueryIdSignersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IdSigners not implemented") +} +func (*UnimplementedQueryServer) AccountOperator(ctx context.Context, req *QueryAccountOperatorRequest) (*QueryAccountOperatorResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AccountOperator not implemented") +} +func (*UnimplementedQueryServer) AccountOperators(ctx context.Context, req *QueryAccountOperatorsRequest) (*QueryAccountOperatorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AccountOperators not implemented") +} +func (*UnimplementedQueryServer) DocumentIssuer(ctx context.Context, req *QueryDocumentIssuerRequest) (*QueryDocumentIssuerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentIssuer not implemented") +} +func (*UnimplementedQueryServer) DocumentIssuers(ctx context.Context, req *QueryDocumentIssuersRequest) (*QueryDocumentIssuersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentIssuers not implemented") +} +func (*UnimplementedQueryServer) Voters(ctx context.Context, req *QueryVotersRequest) (*QueryVotersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Voters not implemented") +} +func (*UnimplementedQueryServer) Loaders(ctx context.Context, req *QueryLoadersRequest) (*QueryLoadersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Loaders not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_AccState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAccStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AccState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/AccState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AccState(ctx, req.(*QueryAccStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_AccStates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAccStatesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AccStates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/AccStates", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AccStates(ctx, req.(*QueryAccStatesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Voter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryVoterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Voter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/Voter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Voter(ctx, req.(*QueryVoterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Loader_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryLoaderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Loader(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/Loader", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Loader(ctx, req.(*QueryLoaderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_IdSigner_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryIdSignerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).IdSigner(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/IdSigner", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).IdSigner(ctx, req.(*QueryIdSignerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_IdSigners_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryIdSignersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).IdSigners(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/IdSigners", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).IdSigners(ctx, req.(*QueryIdSignersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_AccountOperator_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAccountOperatorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AccountOperator(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/AccountOperator", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AccountOperator(ctx, req.(*QueryAccountOperatorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_AccountOperators_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAccountOperatorsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AccountOperators(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/AccountOperators", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AccountOperators(ctx, req.(*QueryAccountOperatorsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_DocumentIssuer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryDocumentIssuerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).DocumentIssuer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/DocumentIssuer", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).DocumentIssuer(ctx, req.(*QueryDocumentIssuerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_DocumentIssuers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryDocumentIssuersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).DocumentIssuers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/DocumentIssuers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).DocumentIssuers(ctx, req.(*QueryDocumentIssuersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Voters_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryVotersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Voters(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/Voters", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Voters(ctx, req.(*QueryVotersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Loaders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryLoadersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Loaders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Query/Loaders", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Loaders(ctx, req.(*QueryLoadersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.electoral.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "AccState", + Handler: _Query_AccState_Handler, + }, + { + MethodName: "AccStates", + Handler: _Query_AccStates_Handler, + }, + { + MethodName: "Voter", + Handler: _Query_Voter_Handler, + }, + { + MethodName: "Loader", + Handler: _Query_Loader_Handler, + }, + { + MethodName: "IdSigner", + Handler: _Query_IdSigner_Handler, + }, + { + MethodName: "IdSigners", + Handler: _Query_IdSigners_Handler, + }, + { + MethodName: "AccountOperator", + Handler: _Query_AccountOperator_Handler, + }, + { + MethodName: "AccountOperators", + Handler: _Query_AccountOperators_Handler, + }, + { + MethodName: "DocumentIssuer", + Handler: _Query_DocumentIssuer_Handler, + }, + { + MethodName: "DocumentIssuers", + Handler: _Query_DocumentIssuers_Handler, + }, + { + MethodName: "Voters", + Handler: _Query_Voters_Handler, + }, + { + MethodName: "Loaders", + Handler: _Query_Loaders_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "electoral/query.proto", +} + +func (m *QueryAccStateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccStateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryAccStateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccStateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccStateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.AccState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryAccStatesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccStatesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccStatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryAccStatesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccStatesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccStatesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.AccState) > 0 { + for iNdEx := len(m.AccState) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AccState[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryVoterRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVoterRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVoterRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryVoterResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVoterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVoterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Voter.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryLoaderRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLoaderRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLoaderRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryLoaderResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLoaderResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLoaderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AccState != nil { + { + size, err := m.AccState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryIdSignerRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdSignerRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdSignerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryIdSignerResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdSignerResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdSignerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AccState != nil { + { + size, err := m.AccState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryIdSignersRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdSignersRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdSignersRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryIdSignersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdSignersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdSignersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AccStates) > 0 { + for iNdEx := len(m.AccStates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AccStates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryAccountOperatorRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccountOperatorRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccountOperatorRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryAccountOperatorResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccountOperatorResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccountOperatorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AccState != nil { + { + size, err := m.AccState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryAccountOperatorsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccountOperatorsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccountOperatorsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryAccountOperatorsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAccountOperatorsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAccountOperatorsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AccStates) > 0 { + for iNdEx := len(m.AccStates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AccStates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentIssuerRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentIssuerRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentIssuerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentIssuerResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentIssuerResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentIssuerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AccState != nil { + { + size, err := m.AccState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryDocumentIssuersRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentIssuersRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentIssuersRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryDocumentIssuersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryDocumentIssuersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryDocumentIssuersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AccStates) > 0 { + for iNdEx := len(m.AccStates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AccStates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryVotersRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVotersRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVotersRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryVotersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVotersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVotersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Voters) > 0 { + for iNdEx := len(m.Voters) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Voters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryLoadersRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLoadersRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLoadersRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryLoadersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLoadersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLoadersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Loaders) > 0 { + for iNdEx := len(m.Loaders) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Loaders[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryAccStateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryAccStateResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.AccState.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryAccStatesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryAccStatesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AccState) > 0 { + for _, e := range m.AccState { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryVoterRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryVoterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Voter.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryLoaderRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryLoaderResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AccState != nil { + l = m.AccState.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryIdSignerRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryIdSignerResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AccState != nil { + l = m.AccState.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryIdSignersRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryIdSignersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AccStates) > 0 { + for _, e := range m.AccStates { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryAccountOperatorRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryAccountOperatorResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AccState != nil { + l = m.AccState.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryAccountOperatorsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryAccountOperatorsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AccStates) > 0 { + for _, e := range m.AccStates { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryDocumentIssuerRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryDocumentIssuerResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AccState != nil { + l = m.AccState.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryDocumentIssuersRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryDocumentIssuersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AccStates) > 0 { + for _, e := range m.AccStates { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryVotersRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryVotersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Voters) > 0 { + for _, e := range m.Voters { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryLoadersRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryLoadersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Loaders) > 0 { + for _, e := range m.Loaders { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryAccStateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccStateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAccStateResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccStateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccStateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AccState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAccStatesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccStatesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccStatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAccStatesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccStatesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccStatesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccState = append(m.AccState, AccState{}) + if err := m.AccState[len(m.AccState)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryVoterRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryVoterRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVoterRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryVoterResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryVoterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVoterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Voter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Voter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLoaderRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLoaderRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLoaderRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLoaderResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLoaderResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLoaderResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AccState == nil { + m.AccState = &AccState{} + } + if err := m.AccState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryIdSignerRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdSignerRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdSignerRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryIdSignerResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdSignerResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdSignerResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AccState == nil { + m.AccState = &AccState{} + } + if err := m.AccState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryIdSignersRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdSignersRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdSignersRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryIdSignersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdSignersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdSignersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccStates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccStates = append(m.AccStates, &AccState{}) + if err := m.AccStates[len(m.AccStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAccountOperatorRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccountOperatorRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccountOperatorRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAccountOperatorResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccountOperatorResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccountOperatorResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AccState == nil { + m.AccState = &AccState{} + } + if err := m.AccState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAccountOperatorsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccountOperatorsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccountOperatorsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAccountOperatorsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryAccountOperatorsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAccountOperatorsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccStates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccStates = append(m.AccStates, &AccState{}) + if err := m.AccStates[len(m.AccStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentIssuerRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentIssuerRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentIssuerRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentIssuerResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentIssuerResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentIssuerResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AccState == nil { + m.AccState = &AccState{} + } + if err := m.AccState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentIssuersRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentIssuersRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentIssuersRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryDocumentIssuersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryDocumentIssuersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryDocumentIssuersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccStates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccStates = append(m.AccStates, &AccState{}) + if err := m.AccStates[len(m.AccStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryVotersRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryVotersRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVotersRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryVotersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryVotersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVotersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Voters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Voters = append(m.Voters, &AccState{}) + if err := m.Voters[len(m.Voters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLoadersRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLoadersRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLoadersRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLoadersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLoadersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLoadersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Loaders", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Loaders = append(m.Loaders, &AccState{}) + if err := m.Loaders[len(m.Loaders)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/electoral/types/query.pb.gw.go b/x/electoral/types/query.pb.gw.go new file mode 100644 index 00000000..e71a7eda --- /dev/null +++ b/x/electoral/types/query.pb.gw.go @@ -0,0 +1,1102 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: electoral/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_AccState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccStateRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + + protoReq.Key, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + + msg, err := client.AccState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_AccState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccStateRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + + protoReq.Key, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + + msg, err := server.AccState(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_AccStates_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_AccStates_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccStatesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AccStates_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.AccStates(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_AccStates_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccStatesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AccStates_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AccStates(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_Voter_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVoterRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := client.Voter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Voter_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVoterRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.Voter(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_Loader_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLoaderRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := client.Loader(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Loader_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLoaderRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.Loader(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_IdSigner_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdSignerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := client.IdSigner(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_IdSigner_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdSignerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.IdSigner(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_IdSigners_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdSignersRequest + var metadata runtime.ServerMetadata + + msg, err := client.IdSigners(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_IdSigners_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdSignersRequest + var metadata runtime.ServerMetadata + + msg, err := server.IdSigners(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_AccountOperator_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccountOperatorRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := client.AccountOperator(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_AccountOperator_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccountOperatorRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.AccountOperator(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_AccountOperators_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccountOperatorsRequest + var metadata runtime.ServerMetadata + + msg, err := client.AccountOperators(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_AccountOperators_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccountOperatorsRequest + var metadata runtime.ServerMetadata + + msg, err := server.AccountOperators(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_DocumentIssuer_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentIssuerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := client.DocumentIssuer(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_DocumentIssuer_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentIssuerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.DocumentIssuer(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_DocumentIssuers_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentIssuersRequest + var metadata runtime.ServerMetadata + + msg, err := client.DocumentIssuers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_DocumentIssuers_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDocumentIssuersRequest + var metadata runtime.ServerMetadata + + msg, err := server.DocumentIssuers(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_Voters_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVotersRequest + var metadata runtime.ServerMetadata + + msg, err := client.Voters(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Voters_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVotersRequest + var metadata runtime.ServerMetadata + + msg, err := server.Voters(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_Loaders_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLoadersRequest + var metadata runtime.ServerMetadata + + msg, err := client.Loaders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Loaders_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLoadersRequest + var metadata runtime.ServerMetadata + + msg, err := server.Loaders(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_AccState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AccState_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AccStates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AccStates_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccStates_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Voter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Voter_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Voter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Loader_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Loader_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Loader_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_IdSigner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_IdSigner_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdSigner_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_IdSigners_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_IdSigners_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdSigners_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AccountOperator_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AccountOperator_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccountOperator_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AccountOperators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AccountOperators_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccountOperators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentIssuer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DocumentIssuer_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentIssuer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentIssuers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DocumentIssuers_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentIssuers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Voters_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Voters_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Voters_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Loaders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Loaders_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Loaders_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_AccState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_AccState_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AccStates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_AccStates_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccStates_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Voter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Voter_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Voter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Loader_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Loader_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Loader_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_IdSigner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_IdSigner_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdSigner_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_IdSigners_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_IdSigners_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdSigners_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AccountOperator_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_AccountOperator_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccountOperator_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AccountOperators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_AccountOperators_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AccountOperators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentIssuer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_DocumentIssuer_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentIssuer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DocumentIssuers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_DocumentIssuers_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DocumentIssuers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Voters_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Voters_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Voters_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Loaders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Loaders_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Loaders_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_AccState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "electoral", "accStates", "key"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_AccStates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "electoral", "accStates"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_Voter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "electoral", "voters", "address"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_Loader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "electoral", "loaders", "address"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_IdSigner_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "electoral", "idSigners", "address"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_IdSigners_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "electoral", "idSigners"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_AccountOperator_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "electoral", "accountOperators", "address"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_AccountOperators_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "electoral", "accountOperators"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_DocumentIssuer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "electoral", "documentIssuers", "address"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_DocumentIssuers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "electoral", "documentIssuers"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_Voters_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "electoral", "voters"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_Loaders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "electoral", "loaders"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Query_AccState_0 = runtime.ForwardResponseMessage + + forward_Query_AccStates_0 = runtime.ForwardResponseMessage + + forward_Query_Voter_0 = runtime.ForwardResponseMessage + + forward_Query_Loader_0 = runtime.ForwardResponseMessage + + forward_Query_IdSigner_0 = runtime.ForwardResponseMessage + + forward_Query_IdSigners_0 = runtime.ForwardResponseMessage + + forward_Query_AccountOperator_0 = runtime.ForwardResponseMessage + + forward_Query_AccountOperators_0 = runtime.ForwardResponseMessage + + forward_Query_DocumentIssuer_0 = runtime.ForwardResponseMessage + + forward_Query_DocumentIssuers_0 = runtime.ForwardResponseMessage + + forward_Query_Voters_0 = runtime.ForwardResponseMessage + + forward_Query_Loaders_0 = runtime.ForwardResponseMessage +) diff --git a/x/electoral/types/treasurer.pb.go b/x/electoral/types/treasurer.pb.go new file mode 100644 index 00000000..2dd9edc5 --- /dev/null +++ b/x/electoral/types/treasurer.pb.go @@ -0,0 +1,316 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: electoral/treasurer.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Treasurer struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *Treasurer) Reset() { *m = Treasurer{} } +func (m *Treasurer) String() string { return proto.CompactTextString(m) } +func (*Treasurer) ProtoMessage() {} +func (*Treasurer) Descriptor() ([]byte, []int) { + return fileDescriptor_25fecdfa589cfa12, []int{0} +} +func (m *Treasurer) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Treasurer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Treasurer.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Treasurer) XXX_Merge(src proto.Message) { + xxx_messageInfo_Treasurer.Merge(m, src) +} +func (m *Treasurer) XXX_Size() int { + return m.Size() +} +func (m *Treasurer) XXX_DiscardUnknown() { + xxx_messageInfo_Treasurer.DiscardUnknown(m) +} + +var xxx_messageInfo_Treasurer proto.InternalMessageInfo + +func (m *Treasurer) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func init() { + proto.RegisterType((*Treasurer)(nil), "shareledger.electoral.Treasurer") +} + +func init() { proto.RegisterFile("electoral/treasurer.proto", fileDescriptor_25fecdfa589cfa12) } + +var fileDescriptor_25fecdfa589cfa12 = []byte{ + // 171 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcd, 0x49, 0x4d, + 0x2e, 0xc9, 0x2f, 0x4a, 0xcc, 0xd1, 0x2f, 0x29, 0x4a, 0x4d, 0x2c, 0x2e, 0x2d, 0x4a, 0x2d, 0xd2, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2d, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, + 0x4f, 0x2d, 0xd2, 0x83, 0x2b, 0x93, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd0, 0x07, 0xb1, + 0x20, 0x8a, 0x95, 0x54, 0xb9, 0x38, 0x43, 0x60, 0xfa, 0x85, 0x24, 0xb8, 0xd8, 0x13, 0x53, 0x52, + 0x8a, 0x52, 0x8b, 0x8b, 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x60, 0x5c, 0x27, 0x9f, 0x13, + 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, + 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x4a, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, + 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x07, 0x5b, 0x5c, 0x94, 0x99, 0x97, 0xae, 0x8f, 0xe4, 0x04, 0xfd, + 0x0a, 0x7d, 0x24, 0xb7, 0x56, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0xed, 0x36, 0x06, 0x04, 0x00, + 0x00, 0xff, 0xff, 0x31, 0xd3, 0x6e, 0x93, 0xc5, 0x00, 0x00, 0x00, +} + +func (m *Treasurer) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Treasurer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Treasurer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTreasurer(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintTreasurer(dAtA []byte, offset int, v uint64) int { + offset -= sovTreasurer(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Treasurer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTreasurer(uint64(l)) + } + return n +} + +func sovTreasurer(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTreasurer(x uint64) (n int) { + return sovTreasurer(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Treasurer) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreasurer + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: Treasurer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Treasurer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreasurer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTreasurer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreasurer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreasurer(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreasurer + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTreasurer(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTreasurer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTreasurer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTreasurer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTreasurer + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTreasurer + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTreasurer + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTreasurer = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTreasurer = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTreasurer = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/electoral/types/tx.pb.go b/x/electoral/types/tx.pb.go new file mode 100644 index 00000000..a2ac7e33 --- /dev/null +++ b/x/electoral/types/tx.pb.go @@ -0,0 +1,4008 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: electoral/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgEnrollVoter struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *MsgEnrollVoter) Reset() { *m = MsgEnrollVoter{} } +func (m *MsgEnrollVoter) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollVoter) ProtoMessage() {} +func (*MsgEnrollVoter) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{0} +} +func (m *MsgEnrollVoter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollVoter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollVoter.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollVoter) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollVoter.Merge(m, src) +} +func (m *MsgEnrollVoter) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollVoter) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollVoter.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollVoter proto.InternalMessageInfo + +func (m *MsgEnrollVoter) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgEnrollVoter) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type MsgEnrollVoterResponse struct { +} + +func (m *MsgEnrollVoterResponse) Reset() { *m = MsgEnrollVoterResponse{} } +func (m *MsgEnrollVoterResponse) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollVoterResponse) ProtoMessage() {} +func (*MsgEnrollVoterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{1} +} +func (m *MsgEnrollVoterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollVoterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollVoterResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollVoterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollVoterResponse.Merge(m, src) +} +func (m *MsgEnrollVoterResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollVoterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollVoterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollVoterResponse proto.InternalMessageInfo + +type MsgRevokeVoter struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *MsgRevokeVoter) Reset() { *m = MsgRevokeVoter{} } +func (m *MsgRevokeVoter) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeVoter) ProtoMessage() {} +func (*MsgRevokeVoter) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{2} +} +func (m *MsgRevokeVoter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeVoter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeVoter.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeVoter) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeVoter.Merge(m, src) +} +func (m *MsgRevokeVoter) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeVoter) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeVoter.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeVoter proto.InternalMessageInfo + +func (m *MsgRevokeVoter) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgRevokeVoter) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type MsgRevokeVoterResponse struct { +} + +func (m *MsgRevokeVoterResponse) Reset() { *m = MsgRevokeVoterResponse{} } +func (m *MsgRevokeVoterResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeVoterResponse) ProtoMessage() {} +func (*MsgRevokeVoterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{3} +} +func (m *MsgRevokeVoterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeVoterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeVoterResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeVoterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeVoterResponse.Merge(m, src) +} +func (m *MsgRevokeVoterResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeVoterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeVoterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeVoterResponse proto.InternalMessageInfo + +type MsgEnrollLoaders struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgEnrollLoaders) Reset() { *m = MsgEnrollLoaders{} } +func (m *MsgEnrollLoaders) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollLoaders) ProtoMessage() {} +func (*MsgEnrollLoaders) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{4} +} +func (m *MsgEnrollLoaders) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollLoaders) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollLoaders.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollLoaders) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollLoaders.Merge(m, src) +} +func (m *MsgEnrollLoaders) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollLoaders) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollLoaders.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollLoaders proto.InternalMessageInfo + +func (m *MsgEnrollLoaders) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgEnrollLoaders) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgEnrollLoadersResponse struct { +} + +func (m *MsgEnrollLoadersResponse) Reset() { *m = MsgEnrollLoadersResponse{} } +func (m *MsgEnrollLoadersResponse) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollLoadersResponse) ProtoMessage() {} +func (*MsgEnrollLoadersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{5} +} +func (m *MsgEnrollLoadersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollLoadersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollLoadersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollLoadersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollLoadersResponse.Merge(m, src) +} +func (m *MsgEnrollLoadersResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollLoadersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollLoadersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollLoadersResponse proto.InternalMessageInfo + +type MsgRevokeLoaders struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgRevokeLoaders) Reset() { *m = MsgRevokeLoaders{} } +func (m *MsgRevokeLoaders) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeLoaders) ProtoMessage() {} +func (*MsgRevokeLoaders) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{6} +} +func (m *MsgRevokeLoaders) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeLoaders) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeLoaders.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeLoaders) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeLoaders.Merge(m, src) +} +func (m *MsgRevokeLoaders) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeLoaders) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeLoaders.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeLoaders proto.InternalMessageInfo + +func (m *MsgRevokeLoaders) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgRevokeLoaders) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgRevokeLoadersResponse struct { +} + +func (m *MsgRevokeLoadersResponse) Reset() { *m = MsgRevokeLoadersResponse{} } +func (m *MsgRevokeLoadersResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeLoadersResponse) ProtoMessage() {} +func (*MsgRevokeLoadersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{7} +} +func (m *MsgRevokeLoadersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeLoadersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeLoadersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeLoadersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeLoadersResponse.Merge(m, src) +} +func (m *MsgRevokeLoadersResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeLoadersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeLoadersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeLoadersResponse proto.InternalMessageInfo + +type MsgEnrollIdSigners struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgEnrollIdSigners) Reset() { *m = MsgEnrollIdSigners{} } +func (m *MsgEnrollIdSigners) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollIdSigners) ProtoMessage() {} +func (*MsgEnrollIdSigners) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{8} +} +func (m *MsgEnrollIdSigners) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollIdSigners) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollIdSigners.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollIdSigners) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollIdSigners.Merge(m, src) +} +func (m *MsgEnrollIdSigners) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollIdSigners) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollIdSigners.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollIdSigners proto.InternalMessageInfo + +func (m *MsgEnrollIdSigners) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgEnrollIdSigners) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgEnrollIdSignersResponse struct { +} + +func (m *MsgEnrollIdSignersResponse) Reset() { *m = MsgEnrollIdSignersResponse{} } +func (m *MsgEnrollIdSignersResponse) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollIdSignersResponse) ProtoMessage() {} +func (*MsgEnrollIdSignersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{9} +} +func (m *MsgEnrollIdSignersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollIdSignersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollIdSignersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollIdSignersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollIdSignersResponse.Merge(m, src) +} +func (m *MsgEnrollIdSignersResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollIdSignersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollIdSignersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollIdSignersResponse proto.InternalMessageInfo + +type MsgRevokeIdSigners struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgRevokeIdSigners) Reset() { *m = MsgRevokeIdSigners{} } +func (m *MsgRevokeIdSigners) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeIdSigners) ProtoMessage() {} +func (*MsgRevokeIdSigners) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{10} +} +func (m *MsgRevokeIdSigners) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeIdSigners) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeIdSigners.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeIdSigners) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeIdSigners.Merge(m, src) +} +func (m *MsgRevokeIdSigners) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeIdSigners) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeIdSigners.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeIdSigners proto.InternalMessageInfo + +func (m *MsgRevokeIdSigners) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgRevokeIdSigners) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgRevokeIdSignersResponse struct { +} + +func (m *MsgRevokeIdSignersResponse) Reset() { *m = MsgRevokeIdSignersResponse{} } +func (m *MsgRevokeIdSignersResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeIdSignersResponse) ProtoMessage() {} +func (*MsgRevokeIdSignersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{11} +} +func (m *MsgRevokeIdSignersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeIdSignersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeIdSignersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeIdSignersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeIdSignersResponse.Merge(m, src) +} +func (m *MsgRevokeIdSignersResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeIdSignersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeIdSignersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeIdSignersResponse proto.InternalMessageInfo + +type MsgEnrollDocIssuers struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgEnrollDocIssuers) Reset() { *m = MsgEnrollDocIssuers{} } +func (m *MsgEnrollDocIssuers) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollDocIssuers) ProtoMessage() {} +func (*MsgEnrollDocIssuers) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{12} +} +func (m *MsgEnrollDocIssuers) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollDocIssuers) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollDocIssuers.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollDocIssuers) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollDocIssuers.Merge(m, src) +} +func (m *MsgEnrollDocIssuers) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollDocIssuers) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollDocIssuers.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollDocIssuers proto.InternalMessageInfo + +func (m *MsgEnrollDocIssuers) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgEnrollDocIssuers) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgEnrollDocIssuersResponse struct { +} + +func (m *MsgEnrollDocIssuersResponse) Reset() { *m = MsgEnrollDocIssuersResponse{} } +func (m *MsgEnrollDocIssuersResponse) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollDocIssuersResponse) ProtoMessage() {} +func (*MsgEnrollDocIssuersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{13} +} +func (m *MsgEnrollDocIssuersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollDocIssuersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollDocIssuersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollDocIssuersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollDocIssuersResponse.Merge(m, src) +} +func (m *MsgEnrollDocIssuersResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollDocIssuersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollDocIssuersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollDocIssuersResponse proto.InternalMessageInfo + +type MsgRevokeDocIssuers struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgRevokeDocIssuers) Reset() { *m = MsgRevokeDocIssuers{} } +func (m *MsgRevokeDocIssuers) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeDocIssuers) ProtoMessage() {} +func (*MsgRevokeDocIssuers) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{14} +} +func (m *MsgRevokeDocIssuers) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeDocIssuers) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeDocIssuers.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeDocIssuers) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeDocIssuers.Merge(m, src) +} +func (m *MsgRevokeDocIssuers) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeDocIssuers) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeDocIssuers.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeDocIssuers proto.InternalMessageInfo + +func (m *MsgRevokeDocIssuers) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgRevokeDocIssuers) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgRevokeDocIssuersResponse struct { +} + +func (m *MsgRevokeDocIssuersResponse) Reset() { *m = MsgRevokeDocIssuersResponse{} } +func (m *MsgRevokeDocIssuersResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeDocIssuersResponse) ProtoMessage() {} +func (*MsgRevokeDocIssuersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{15} +} +func (m *MsgRevokeDocIssuersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeDocIssuersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeDocIssuersResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeDocIssuersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeDocIssuersResponse.Merge(m, src) +} +func (m *MsgRevokeDocIssuersResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeDocIssuersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeDocIssuersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeDocIssuersResponse proto.InternalMessageInfo + +type MsgEnrollAccountOperators struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgEnrollAccountOperators) Reset() { *m = MsgEnrollAccountOperators{} } +func (m *MsgEnrollAccountOperators) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollAccountOperators) ProtoMessage() {} +func (*MsgEnrollAccountOperators) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{16} +} +func (m *MsgEnrollAccountOperators) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollAccountOperators) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollAccountOperators.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollAccountOperators) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollAccountOperators.Merge(m, src) +} +func (m *MsgEnrollAccountOperators) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollAccountOperators) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollAccountOperators.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollAccountOperators proto.InternalMessageInfo + +func (m *MsgEnrollAccountOperators) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgEnrollAccountOperators) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgEnrollAccountOperatorsResponse struct { +} + +func (m *MsgEnrollAccountOperatorsResponse) Reset() { *m = MsgEnrollAccountOperatorsResponse{} } +func (m *MsgEnrollAccountOperatorsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgEnrollAccountOperatorsResponse) ProtoMessage() {} +func (*MsgEnrollAccountOperatorsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{17} +} +func (m *MsgEnrollAccountOperatorsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEnrollAccountOperatorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEnrollAccountOperatorsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEnrollAccountOperatorsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEnrollAccountOperatorsResponse.Merge(m, src) +} +func (m *MsgEnrollAccountOperatorsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgEnrollAccountOperatorsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEnrollAccountOperatorsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEnrollAccountOperatorsResponse proto.InternalMessageInfo + +type MsgRevokeAccountOperators struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *MsgRevokeAccountOperators) Reset() { *m = MsgRevokeAccountOperators{} } +func (m *MsgRevokeAccountOperators) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeAccountOperators) ProtoMessage() {} +func (*MsgRevokeAccountOperators) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{18} +} +func (m *MsgRevokeAccountOperators) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeAccountOperators) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeAccountOperators.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeAccountOperators) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeAccountOperators.Merge(m, src) +} +func (m *MsgRevokeAccountOperators) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeAccountOperators) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeAccountOperators.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeAccountOperators proto.InternalMessageInfo + +func (m *MsgRevokeAccountOperators) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgRevokeAccountOperators) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +type MsgRevokeAccountOperatorsResponse struct { +} + +func (m *MsgRevokeAccountOperatorsResponse) Reset() { *m = MsgRevokeAccountOperatorsResponse{} } +func (m *MsgRevokeAccountOperatorsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRevokeAccountOperatorsResponse) ProtoMessage() {} +func (*MsgRevokeAccountOperatorsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_10832aea077e441f, []int{19} +} +func (m *MsgRevokeAccountOperatorsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRevokeAccountOperatorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRevokeAccountOperatorsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRevokeAccountOperatorsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRevokeAccountOperatorsResponse.Merge(m, src) +} +func (m *MsgRevokeAccountOperatorsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRevokeAccountOperatorsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRevokeAccountOperatorsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRevokeAccountOperatorsResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgEnrollVoter)(nil), "shareledger.electoral.MsgEnrollVoter") + proto.RegisterType((*MsgEnrollVoterResponse)(nil), "shareledger.electoral.MsgEnrollVoterResponse") + proto.RegisterType((*MsgRevokeVoter)(nil), "shareledger.electoral.MsgRevokeVoter") + proto.RegisterType((*MsgRevokeVoterResponse)(nil), "shareledger.electoral.MsgRevokeVoterResponse") + proto.RegisterType((*MsgEnrollLoaders)(nil), "shareledger.electoral.MsgEnrollLoaders") + proto.RegisterType((*MsgEnrollLoadersResponse)(nil), "shareledger.electoral.MsgEnrollLoadersResponse") + proto.RegisterType((*MsgRevokeLoaders)(nil), "shareledger.electoral.MsgRevokeLoaders") + proto.RegisterType((*MsgRevokeLoadersResponse)(nil), "shareledger.electoral.MsgRevokeLoadersResponse") + proto.RegisterType((*MsgEnrollIdSigners)(nil), "shareledger.electoral.MsgEnrollIdSigners") + proto.RegisterType((*MsgEnrollIdSignersResponse)(nil), "shareledger.electoral.MsgEnrollIdSignersResponse") + proto.RegisterType((*MsgRevokeIdSigners)(nil), "shareledger.electoral.MsgRevokeIdSigners") + proto.RegisterType((*MsgRevokeIdSignersResponse)(nil), "shareledger.electoral.MsgRevokeIdSignersResponse") + proto.RegisterType((*MsgEnrollDocIssuers)(nil), "shareledger.electoral.MsgEnrollDocIssuers") + proto.RegisterType((*MsgEnrollDocIssuersResponse)(nil), "shareledger.electoral.MsgEnrollDocIssuersResponse") + proto.RegisterType((*MsgRevokeDocIssuers)(nil), "shareledger.electoral.MsgRevokeDocIssuers") + proto.RegisterType((*MsgRevokeDocIssuersResponse)(nil), "shareledger.electoral.MsgRevokeDocIssuersResponse") + proto.RegisterType((*MsgEnrollAccountOperators)(nil), "shareledger.electoral.MsgEnrollAccountOperators") + proto.RegisterType((*MsgEnrollAccountOperatorsResponse)(nil), "shareledger.electoral.MsgEnrollAccountOperatorsResponse") + proto.RegisterType((*MsgRevokeAccountOperators)(nil), "shareledger.electoral.MsgRevokeAccountOperators") + proto.RegisterType((*MsgRevokeAccountOperatorsResponse)(nil), "shareledger.electoral.MsgRevokeAccountOperatorsResponse") +} + +func init() { proto.RegisterFile("electoral/tx.proto", fileDescriptor_10832aea077e441f) } + +var fileDescriptor_10832aea077e441f = []byte{ + // 513 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x4f, 0x8b, 0xd3, 0x40, + 0x18, 0xc6, 0x1b, 0x17, 0xd4, 0xbe, 0xa2, 0x2e, 0x23, 0x2e, 0xd9, 0xb8, 0x06, 0xad, 0xc8, 0xfe, + 0x01, 0x93, 0xb5, 0x5e, 0xbc, 0x2a, 0xeb, 0x61, 0xa5, 0x45, 0xe8, 0x82, 0x07, 0x2f, 0x92, 0x9d, + 0xbc, 0x64, 0x8b, 0x31, 0x53, 0x66, 0xa6, 0xb2, 0xde, 0xfd, 0x00, 0x7e, 0x2c, 0x8f, 0x7b, 0xf4, + 0x28, 0xed, 0xe7, 0x10, 0xa4, 0x9b, 0x76, 0x3a, 0x99, 0x26, 0x9d, 0xd4, 0xf6, 0x98, 0xcc, 0x33, + 0xcf, 0xef, 0xc9, 0xe5, 0x47, 0x80, 0x60, 0x8a, 0x54, 0x32, 0x1e, 0xa5, 0xa1, 0xbc, 0x0c, 0x06, + 0x9c, 0x49, 0x46, 0x1e, 0x8a, 0x8b, 0x88, 0x63, 0x8a, 0x71, 0x82, 0x3c, 0x50, 0xe7, 0xde, 0xee, + 0x3c, 0x1a, 0x51, 0xfa, 0x59, 0xc8, 0x48, 0x62, 0x7e, 0xa3, 0x75, 0x02, 0xf7, 0xba, 0x22, 0x79, + 0x97, 0x71, 0x96, 0xa6, 0x1f, 0x99, 0x44, 0x4e, 0x5c, 0xb8, 0x45, 0x39, 0x46, 0x92, 0x71, 0xd7, + 0x79, 0xe2, 0x1c, 0x34, 0x7b, 0xb3, 0xc7, 0xc9, 0x49, 0x14, 0xc7, 0x1c, 0x85, 0x70, 0x6f, 0xe4, + 0x27, 0xd3, 0xc7, 0x96, 0x0b, 0x3b, 0xc5, 0x96, 0x1e, 0x8a, 0x01, 0xcb, 0x04, 0x4e, 0xfb, 0x7b, + 0xf8, 0x8d, 0x7d, 0xc1, 0x75, 0xfb, 0xb5, 0x16, 0xd5, 0xff, 0x1e, 0xb6, 0x15, 0xb9, 0xc3, 0xa2, + 0x18, 0xb9, 0x58, 0x42, 0xd8, 0x83, 0xe6, 0xb4, 0x12, 0x27, 0x8c, 0xad, 0x83, 0x66, 0x6f, 0xfe, + 0xa2, 0xe5, 0x81, 0x6b, 0x76, 0x19, 0x9c, 0x7c, 0xc1, 0x66, 0x38, 0x85, 0x2e, 0xc5, 0xe9, 0x00, + 0x51, 0x1b, 0x4e, 0xe3, 0xb3, 0x7e, 0x92, 0xad, 0x43, 0xda, 0x03, 0x6f, 0xb1, 0xcd, 0x60, 0xe5, + 0x3b, 0x36, 0xc5, 0x32, 0xda, 0x14, 0xab, 0x0b, 0x0f, 0xd4, 0x92, 0x13, 0x46, 0x4f, 0x85, 0x18, + 0xae, 0x03, 0x7b, 0x0c, 0x8f, 0x4a, 0xea, 0x0c, 0x5a, 0xbe, 0x65, 0x63, 0x34, 0xb3, 0x4e, 0xd1, + 0xce, 0x60, 0x57, 0x8d, 0x79, 0x43, 0x29, 0x1b, 0x66, 0xf2, 0xc3, 0x00, 0xf9, 0xa4, 0xf8, 0xff, + 0x99, 0xcf, 0xe0, 0x69, 0x65, 0xa9, 0x41, 0xce, 0x87, 0x6d, 0x98, 0x5c, 0x5e, 0x3a, 0x23, 0xb7, + 0xff, 0xde, 0x86, 0xad, 0xae, 0x48, 0x08, 0x85, 0x3b, 0xba, 0x3c, 0x9e, 0x07, 0xa5, 0x06, 0x0a, + 0x8a, 0x76, 0xf0, 0x5e, 0xd4, 0x8a, 0xcd, 0x60, 0x13, 0x88, 0x6e, 0x90, 0x25, 0x10, 0x2d, 0xb6, + 0x0c, 0x52, 0x62, 0x12, 0xd2, 0x87, 0xbb, 0x45, 0x8d, 0xec, 0xdb, 0x46, 0x4e, 0x83, 0x5e, 0x58, + 0x33, 0xa8, 0xa3, 0x8a, 0x26, 0xd9, 0xb7, 0x4d, 0xad, 0x81, 0x2a, 0xf5, 0x09, 0x61, 0x70, 0xdf, + 0x94, 0xc9, 0xa1, 0x6d, 0xae, 0x8a, 0x7a, 0x2f, 0x6b, 0x47, 0x75, 0xa0, 0x69, 0x94, 0x43, 0xdb, + 0xe8, 0x5a, 0xc0, 0x0a, 0xb3, 0x10, 0x0e, 0xdb, 0x0b, 0x5a, 0x39, 0xb2, 0xed, 0x9e, 0x67, 0xbd, + 0x76, 0xfd, 0xac, 0xce, 0x5c, 0x90, 0xcb, 0x91, 0x6d, 0x7a, 0x3d, 0x66, 0x95, 0x65, 0xc8, 0x0f, + 0x07, 0x76, 0x2a, 0x1c, 0x73, 0x6c, 0xfb, 0x04, 0xf3, 0x86, 0xf7, 0x7a, 0xd5, 0x1b, 0x85, 0x19, + 0x15, 0xc2, 0x39, 0xb6, 0x7d, 0xd5, 0x2a, 0x33, 0x96, 0xfb, 0xe7, 0x6d, 0xe7, 0xd7, 0xc8, 0x77, + 0xae, 0x46, 0xbe, 0xf3, 0x67, 0xe4, 0x3b, 0x3f, 0xc7, 0x7e, 0xe3, 0x6a, 0xec, 0x37, 0x7e, 0x8f, + 0xfd, 0xc6, 0xa7, 0x76, 0xd2, 0x97, 0x17, 0xc3, 0xf3, 0x80, 0xb2, 0xaf, 0xe1, 0x75, 0x3b, 0xef, + 0x67, 0x49, 0xa8, 0x71, 0xc2, 0xcb, 0x50, 0xfb, 0x75, 0xfa, 0x3e, 0x40, 0x71, 0x7e, 0xf3, 0xfa, + 0x67, 0xe8, 0xd5, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, 0xae, 0xf2, 0xaa, 0x54, 0x09, 0x00, + 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + EnrollVoter(ctx context.Context, in *MsgEnrollVoter, opts ...grpc.CallOption) (*MsgEnrollVoterResponse, error) + RevokeVoter(ctx context.Context, in *MsgRevokeVoter, opts ...grpc.CallOption) (*MsgRevokeVoterResponse, error) + EnrollLoaders(ctx context.Context, in *MsgEnrollLoaders, opts ...grpc.CallOption) (*MsgEnrollLoadersResponse, error) + RevokeLoaders(ctx context.Context, in *MsgRevokeLoaders, opts ...grpc.CallOption) (*MsgRevokeLoadersResponse, error) + EnrollIdSigners(ctx context.Context, in *MsgEnrollIdSigners, opts ...grpc.CallOption) (*MsgEnrollIdSignersResponse, error) + RevokeIdSigners(ctx context.Context, in *MsgRevokeIdSigners, opts ...grpc.CallOption) (*MsgRevokeIdSignersResponse, error) + EnrollDocIssuers(ctx context.Context, in *MsgEnrollDocIssuers, opts ...grpc.CallOption) (*MsgEnrollDocIssuersResponse, error) + RevokeDocIssuers(ctx context.Context, in *MsgRevokeDocIssuers, opts ...grpc.CallOption) (*MsgRevokeDocIssuersResponse, error) + EnrollAccountOperators(ctx context.Context, in *MsgEnrollAccountOperators, opts ...grpc.CallOption) (*MsgEnrollAccountOperatorsResponse, error) + RevokeAccountOperators(ctx context.Context, in *MsgRevokeAccountOperators, opts ...grpc.CallOption) (*MsgRevokeAccountOperatorsResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) EnrollVoter(ctx context.Context, in *MsgEnrollVoter, opts ...grpc.CallOption) (*MsgEnrollVoterResponse, error) { + out := new(MsgEnrollVoterResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/EnrollVoter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RevokeVoter(ctx context.Context, in *MsgRevokeVoter, opts ...grpc.CallOption) (*MsgRevokeVoterResponse, error) { + out := new(MsgRevokeVoterResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/RevokeVoter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) EnrollLoaders(ctx context.Context, in *MsgEnrollLoaders, opts ...grpc.CallOption) (*MsgEnrollLoadersResponse, error) { + out := new(MsgEnrollLoadersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/EnrollLoaders", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RevokeLoaders(ctx context.Context, in *MsgRevokeLoaders, opts ...grpc.CallOption) (*MsgRevokeLoadersResponse, error) { + out := new(MsgRevokeLoadersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/RevokeLoaders", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) EnrollIdSigners(ctx context.Context, in *MsgEnrollIdSigners, opts ...grpc.CallOption) (*MsgEnrollIdSignersResponse, error) { + out := new(MsgEnrollIdSignersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/EnrollIdSigners", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RevokeIdSigners(ctx context.Context, in *MsgRevokeIdSigners, opts ...grpc.CallOption) (*MsgRevokeIdSignersResponse, error) { + out := new(MsgRevokeIdSignersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/RevokeIdSigners", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) EnrollDocIssuers(ctx context.Context, in *MsgEnrollDocIssuers, opts ...grpc.CallOption) (*MsgEnrollDocIssuersResponse, error) { + out := new(MsgEnrollDocIssuersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/EnrollDocIssuers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RevokeDocIssuers(ctx context.Context, in *MsgRevokeDocIssuers, opts ...grpc.CallOption) (*MsgRevokeDocIssuersResponse, error) { + out := new(MsgRevokeDocIssuersResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/RevokeDocIssuers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) EnrollAccountOperators(ctx context.Context, in *MsgEnrollAccountOperators, opts ...grpc.CallOption) (*MsgEnrollAccountOperatorsResponse, error) { + out := new(MsgEnrollAccountOperatorsResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/EnrollAccountOperators", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RevokeAccountOperators(ctx context.Context, in *MsgRevokeAccountOperators, opts ...grpc.CallOption) (*MsgRevokeAccountOperatorsResponse, error) { + out := new(MsgRevokeAccountOperatorsResponse) + err := c.cc.Invoke(ctx, "/shareledger.electoral.Msg/RevokeAccountOperators", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + EnrollVoter(context.Context, *MsgEnrollVoter) (*MsgEnrollVoterResponse, error) + RevokeVoter(context.Context, *MsgRevokeVoter) (*MsgRevokeVoterResponse, error) + EnrollLoaders(context.Context, *MsgEnrollLoaders) (*MsgEnrollLoadersResponse, error) + RevokeLoaders(context.Context, *MsgRevokeLoaders) (*MsgRevokeLoadersResponse, error) + EnrollIdSigners(context.Context, *MsgEnrollIdSigners) (*MsgEnrollIdSignersResponse, error) + RevokeIdSigners(context.Context, *MsgRevokeIdSigners) (*MsgRevokeIdSignersResponse, error) + EnrollDocIssuers(context.Context, *MsgEnrollDocIssuers) (*MsgEnrollDocIssuersResponse, error) + RevokeDocIssuers(context.Context, *MsgRevokeDocIssuers) (*MsgRevokeDocIssuersResponse, error) + EnrollAccountOperators(context.Context, *MsgEnrollAccountOperators) (*MsgEnrollAccountOperatorsResponse, error) + RevokeAccountOperators(context.Context, *MsgRevokeAccountOperators) (*MsgRevokeAccountOperatorsResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) EnrollVoter(ctx context.Context, req *MsgEnrollVoter) (*MsgEnrollVoterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnrollVoter not implemented") +} +func (*UnimplementedMsgServer) RevokeVoter(ctx context.Context, req *MsgRevokeVoter) (*MsgRevokeVoterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeVoter not implemented") +} +func (*UnimplementedMsgServer) EnrollLoaders(ctx context.Context, req *MsgEnrollLoaders) (*MsgEnrollLoadersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnrollLoaders not implemented") +} +func (*UnimplementedMsgServer) RevokeLoaders(ctx context.Context, req *MsgRevokeLoaders) (*MsgRevokeLoadersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeLoaders not implemented") +} +func (*UnimplementedMsgServer) EnrollIdSigners(ctx context.Context, req *MsgEnrollIdSigners) (*MsgEnrollIdSignersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnrollIdSigners not implemented") +} +func (*UnimplementedMsgServer) RevokeIdSigners(ctx context.Context, req *MsgRevokeIdSigners) (*MsgRevokeIdSignersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeIdSigners not implemented") +} +func (*UnimplementedMsgServer) EnrollDocIssuers(ctx context.Context, req *MsgEnrollDocIssuers) (*MsgEnrollDocIssuersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnrollDocIssuers not implemented") +} +func (*UnimplementedMsgServer) RevokeDocIssuers(ctx context.Context, req *MsgRevokeDocIssuers) (*MsgRevokeDocIssuersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeDocIssuers not implemented") +} +func (*UnimplementedMsgServer) EnrollAccountOperators(ctx context.Context, req *MsgEnrollAccountOperators) (*MsgEnrollAccountOperatorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnrollAccountOperators not implemented") +} +func (*UnimplementedMsgServer) RevokeAccountOperators(ctx context.Context, req *MsgRevokeAccountOperators) (*MsgRevokeAccountOperatorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeAccountOperators not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_EnrollVoter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgEnrollVoter) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).EnrollVoter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/EnrollVoter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).EnrollVoter(ctx, req.(*MsgEnrollVoter)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RevokeVoter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRevokeVoter) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RevokeVoter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/RevokeVoter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RevokeVoter(ctx, req.(*MsgRevokeVoter)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_EnrollLoaders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgEnrollLoaders) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).EnrollLoaders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/EnrollLoaders", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).EnrollLoaders(ctx, req.(*MsgEnrollLoaders)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RevokeLoaders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRevokeLoaders) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RevokeLoaders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/RevokeLoaders", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RevokeLoaders(ctx, req.(*MsgRevokeLoaders)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_EnrollIdSigners_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgEnrollIdSigners) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).EnrollIdSigners(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/EnrollIdSigners", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).EnrollIdSigners(ctx, req.(*MsgEnrollIdSigners)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RevokeIdSigners_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRevokeIdSigners) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RevokeIdSigners(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/RevokeIdSigners", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RevokeIdSigners(ctx, req.(*MsgRevokeIdSigners)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_EnrollDocIssuers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgEnrollDocIssuers) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).EnrollDocIssuers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/EnrollDocIssuers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).EnrollDocIssuers(ctx, req.(*MsgEnrollDocIssuers)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RevokeDocIssuers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRevokeDocIssuers) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RevokeDocIssuers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/RevokeDocIssuers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RevokeDocIssuers(ctx, req.(*MsgRevokeDocIssuers)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_EnrollAccountOperators_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgEnrollAccountOperators) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).EnrollAccountOperators(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/EnrollAccountOperators", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).EnrollAccountOperators(ctx, req.(*MsgEnrollAccountOperators)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RevokeAccountOperators_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRevokeAccountOperators) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RevokeAccountOperators(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.electoral.Msg/RevokeAccountOperators", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RevokeAccountOperators(ctx, req.(*MsgRevokeAccountOperators)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.electoral.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EnrollVoter", + Handler: _Msg_EnrollVoter_Handler, + }, + { + MethodName: "RevokeVoter", + Handler: _Msg_RevokeVoter_Handler, + }, + { + MethodName: "EnrollLoaders", + Handler: _Msg_EnrollLoaders_Handler, + }, + { + MethodName: "RevokeLoaders", + Handler: _Msg_RevokeLoaders_Handler, + }, + { + MethodName: "EnrollIdSigners", + Handler: _Msg_EnrollIdSigners_Handler, + }, + { + MethodName: "RevokeIdSigners", + Handler: _Msg_RevokeIdSigners_Handler, + }, + { + MethodName: "EnrollDocIssuers", + Handler: _Msg_EnrollDocIssuers_Handler, + }, + { + MethodName: "RevokeDocIssuers", + Handler: _Msg_RevokeDocIssuers_Handler, + }, + { + MethodName: "EnrollAccountOperators", + Handler: _Msg_EnrollAccountOperators_Handler, + }, + { + MethodName: "RevokeAccountOperators", + Handler: _Msg_RevokeAccountOperators_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "electoral/tx.proto", +} + +func (m *MsgEnrollVoter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollVoter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollVoter) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTx(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEnrollVoterResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollVoterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollVoterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgRevokeVoter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeVoter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeVoter) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTx(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRevokeVoterResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeVoterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeVoterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgEnrollLoaders) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollLoaders) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollLoaders) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEnrollLoadersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollLoadersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollLoadersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgRevokeLoaders) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeLoaders) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeLoaders) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRevokeLoadersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeLoadersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeLoadersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgEnrollIdSigners) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollIdSigners) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollIdSigners) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEnrollIdSignersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollIdSignersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollIdSignersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgRevokeIdSigners) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeIdSigners) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeIdSigners) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRevokeIdSignersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeIdSignersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeIdSignersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgEnrollDocIssuers) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollDocIssuers) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollDocIssuers) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEnrollDocIssuersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollDocIssuersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollDocIssuersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgRevokeDocIssuers) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeDocIssuers) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeDocIssuers) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRevokeDocIssuersResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeDocIssuersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeDocIssuersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgEnrollAccountOperators) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollAccountOperators) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollAccountOperators) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEnrollAccountOperatorsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEnrollAccountOperatorsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEnrollAccountOperatorsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgRevokeAccountOperators) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeAccountOperators) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeAccountOperators) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRevokeAccountOperatorsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRevokeAccountOperatorsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRevokeAccountOperatorsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgEnrollVoter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgEnrollVoterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgRevokeVoter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgRevokeVoterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgEnrollLoaders) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgEnrollLoadersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgRevokeLoaders) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgRevokeLoadersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgEnrollIdSigners) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgEnrollIdSignersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgRevokeIdSigners) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgRevokeIdSignersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgEnrollDocIssuers) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgEnrollDocIssuersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgRevokeDocIssuers) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgRevokeDocIssuersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgEnrollAccountOperators) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgEnrollAccountOperatorsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgRevokeAccountOperators) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgRevokeAccountOperatorsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgEnrollVoter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollVoter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollVoter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollVoterResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollVoterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollVoterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeVoter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeVoter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeVoter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeVoterResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeVoterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeVoterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollLoaders) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollLoaders: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollLoaders: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollLoadersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollLoadersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollLoadersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeLoaders) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeLoaders: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeLoaders: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeLoadersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeLoadersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeLoadersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollIdSigners) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollIdSigners: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollIdSigners: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollIdSignersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollIdSignersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollIdSignersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeIdSigners) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeIdSigners: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeIdSigners: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeIdSignersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeIdSignersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeIdSignersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollDocIssuers) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollDocIssuers: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollDocIssuers: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollDocIssuersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollDocIssuersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollDocIssuersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeDocIssuers) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeDocIssuers: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeDocIssuers: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeDocIssuersResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeDocIssuersResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeDocIssuersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollAccountOperators) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollAccountOperators: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollAccountOperators: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEnrollAccountOperatorsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgEnrollAccountOperatorsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEnrollAccountOperatorsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeAccountOperators) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeAccountOperators: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeAccountOperators: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRevokeAccountOperatorsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgRevokeAccountOperatorsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRevokeAccountOperatorsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/electoral/types/types.go b/x/electoral/types/types.go index 3a3592b9..ab1254f4 100644 --- a/x/electoral/types/types.go +++ b/x/electoral/types/types.go @@ -1,28 +1 @@ package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - StatusVoterEnrolled = "enrolled" - StatusVoterRevoked = "revoked" - DefaultVoterStatus = StatusVoterRevoked -) - -type Voter struct { - Address sdk.AccAddress `json:"address"` - Status string `json:"status"` -} - -func NewVoter() Voter { - return Voter{ - Status: DefaultVoterStatus, - } -} - -func (v Voter) String() string { - return fmt.Sprintf("{Voter: %s, Status: %s}", v.Address.String(), v.Status) -} diff --git a/x/electoral/utils.go b/x/electoral/utils.go deleted file mode 100644 index ebf26e6a..00000000 --- a/x/electoral/utils.go +++ /dev/null @@ -1,21 +0,0 @@ -package electoral - -import ( - "crypto/sha256" - "encoding/hex" - "encoding/json" -) - -func GenBookID(inp interface{}) (string, error) { - h := sha256.New() - - enc, err := json.Marshal(inp) - if err != nil { - return "", err - } - - h.Write(enc) - hash := h.Sum(nil) - - return hex.EncodeToString(hash)[:20], nil -} diff --git a/x/fee/fee_table.go b/x/fee/fee_table.go new file mode 100644 index 00000000..a790f7cf --- /dev/null +++ b/x/fee/fee_table.go @@ -0,0 +1,131 @@ +package fee + +import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + feegrantmoduletypes "github.com/cosmos/cosmos-sdk/x/feegrant" + govmoduletypes "github.com/cosmos/cosmos-sdk/x/gov/types" + stakingmoduletypes "github.com/cosmos/cosmos-sdk/x/staking/types" + assettypes "github.com/sharering/shareledger/x/asset/types" + bookingtypes "github.com/sharering/shareledger/x/booking/types" + "github.com/sharering/shareledger/x/constant" + documenttypes "github.com/sharering/shareledger/x/document/types" + electoralmoduletypes "github.com/sharering/shareledger/x/electoral/types" + gentlemintmoduletypes "github.com/sharering/shareledger/x/gentlemint/types" + idmoduletypes "github.com/sharering/shareledger/x/id/types" + "reflect" + "sync" +) + +func init() { + // init map action string _ msg type + doOnce.Do(func() { + mapMsg = make(map[string]reflect.Type) + // We check fee of transactions based on mapActions' values. So it should not be duplicated. + for msg, v := range mapActions { + if _, found := mapMsg[v]; found { + panic(fmt.Sprintf("map actions has duplicate values, %v.", v)) + } + mapMsg[v] = msg + } + }) +} + +var mapMsg map[string]reflect.Type +var doOnce sync.Once + +var mapActions = map[reflect.Type]string{ + reflect.ValueOf(&assettypes.MsgCreateAsset{}).Type(): "asset_create", + reflect.ValueOf(&assettypes.MsgDeleteAsset{}).Type(): "asset_delete", + reflect.ValueOf(&assettypes.MsgUpdateAsset{}).Type(): "asset_update", + + reflect.ValueOf(&banktypes.MsgSend{}).Type(): "bank_send", + + reflect.ValueOf(&bookingtypes.MsgCreateBooking{}).Type(): "booking_create", + reflect.ValueOf(&bookingtypes.MsgCompleteBooking{}).Type(): "booking_complete", + + reflect.ValueOf(&distributiontypes.MsgWithdrawDelegatorReward{}).Type(): "distribution_withdraw-delegator-reward", + reflect.ValueOf(&distributiontypes.MsgWithdrawValidatorCommission{}).Type(): "distribution_withdraw-validator-commission", + reflect.ValueOf(&distributiontypes.MsgSetWithdrawAddress{}).Type(): "distribution_set-withdraw-address", + reflect.ValueOf(&distributiontypes.MsgFundCommunityPool{}).Type(): "distribution_fund-community-pool", + + reflect.ValueOf(&documenttypes.MsgCreateDocument{}).Type(): "document_create", + reflect.ValueOf(&documenttypes.MsgCreateDocuments{}).Type(): "documents_create", + reflect.ValueOf(&documenttypes.MsgRevokeDocument{}).Type(): "document_revoke", + reflect.ValueOf(&documenttypes.MsgUpdateDocument{}).Type(): "document_update", + + reflect.ValueOf(&electoralmoduletypes.MsgEnrollVoter{}).Type(): "electoral_enroll-voter", + reflect.ValueOf(&electoralmoduletypes.MsgRevokeVoter{}).Type(): "electoral_revoke-voter", + reflect.ValueOf(&electoralmoduletypes.MsgEnrollLoaders{}).Type(): "electoral_enroll-loaders", + reflect.ValueOf(&electoralmoduletypes.MsgRevokeLoaders{}).Type(): "electoral_revoke-loaders", + reflect.ValueOf(&electoralmoduletypes.MsgEnrollIdSigners{}).Type(): "electoral_enroll-id-signers", + reflect.ValueOf(&electoralmoduletypes.MsgRevokeIdSigners{}).Type(): "electoral_revoke-id-signers", + reflect.ValueOf(&electoralmoduletypes.MsgEnrollDocIssuers{}).Type(): "electoral_enroll-doc-issuers", + reflect.ValueOf(&electoralmoduletypes.MsgRevokeDocIssuers{}).Type(): "electoral_revoke-doc-issuers", + reflect.ValueOf(&electoralmoduletypes.MsgEnrollAccountOperators{}).Type(): "electoral_enroll-account-operators", + reflect.ValueOf(&electoralmoduletypes.MsgRevokeAccountOperators{}).Type(): "electoral_revoke-account-operators", + + //feegrant + reflect.ValueOf(&feegrantmoduletypes.MsgGrantAllowance{}).Type(): "feegrant_grant", + reflect.ValueOf(&feegrantmoduletypes.MsgRevokeAllowance{}).Type(): "feegrant_revoke", + + //gentlemint + reflect.ValueOf(&gentlemintmoduletypes.MsgLoad{}).Type(): "gentlemint_load", + reflect.ValueOf(&gentlemintmoduletypes.MsgBuyShr{}).Type(): "gentlemint_buy-shr", + reflect.ValueOf(&gentlemintmoduletypes.MsgSend{}).Type(): "gentlemint_send", + reflect.ValueOf(&gentlemintmoduletypes.MsgBurn{}).Type(): "gentlemint_burn", + reflect.ValueOf(&gentlemintmoduletypes.MsgSetExchange{}).Type(): "gentlemint_set-exchange", + reflect.ValueOf(&gentlemintmoduletypes.MsgLoadFee{}).Type(): "gentlemint_load-fee", + + //gov + reflect.ValueOf(&govmoduletypes.MsgDeposit{}).Type(): "gov_deposit", + reflect.ValueOf(&govmoduletypes.MsgSubmitProposal{}).Type(): "gov_submit-proposal", + reflect.ValueOf(&govmoduletypes.MsgVote{}).Type(): "gov_vote", + reflect.ValueOf(&govmoduletypes.MsgVoteWeighted{}).Type(): "gov_weighted-vote", + + //ids + reflect.ValueOf(&idmoduletypes.MsgCreateId{}).Type(): "id_create", + reflect.ValueOf(&idmoduletypes.MsgUpdateId{}).Type(): "id_update", + reflect.ValueOf(&idmoduletypes.MsgReplaceIdOwner{}).Type(): "id_replace", + reflect.ValueOf(&idmoduletypes.MsgCreateIds{}).Type(): "id_create-ids", + + //staking + reflect.ValueOf(&stakingmoduletypes.MsgCreateValidator{}).Type(): "staking_create-validator", + reflect.ValueOf(&stakingmoduletypes.MsgDelegate{}).Type(): "staking_delegate", + reflect.ValueOf(&stakingmoduletypes.MsgEditValidator{}).Type(): "staking_edit-validator", + reflect.ValueOf(&stakingmoduletypes.MsgBeginRedelegate{}).Type(): "staking_redelegate", + reflect.ValueOf(&stakingmoduletypes.MsgUndelegate{}).Type(): "staking_unbond", +} + +func GetActionKey(msg sdk.Msg) string { + k := mapActions[reflect.TypeOf(msg)] + return k +} + +func GetListActions() []string { + actions := make([]string, 0, len(mapActions)) + for _, v := range mapActions { + actions = append(actions, v) + } + return actions +} + +func GetListActionsWithDefaultLevel() map[string]string { + m := make(map[string]string) + for _, v := range mapActions { + m[v] = string(constant.MinFee) + } + return m +} + +func IsSpecialActionKey(actionKey string) bool { + return actionKey == "staking_create-validator" || + actionKey == "gentlemint_load-fee" +} + +func HaveActionKey(actionKey string) bool { + _, found := mapMsg[actionKey] + return found +} diff --git a/x/fee/fee_table_test.go b/x/fee/fee_table_test.go new file mode 100644 index 00000000..fa26ee92 --- /dev/null +++ b/x/fee/fee_table_test.go @@ -0,0 +1,19 @@ +package fee + +import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "reflect" + "testing" +) + +func TestTableFee_GetNameMsg(t *testing.T) { + a := func(msg sdk.Msg) bool { + fmt.Println(reflect.ValueOf(&distributiontypes.MsgWithdrawDelegatorReward{}).Type().String()) + return reflect.ValueOf(&distributiontypes.MsgWithdrawDelegatorReward{}).Type() == reflect.TypeOf(msg) + } + msg := &distributiontypes.MsgWithdrawDelegatorReward{} + fmt.Println(a(msg)) + +} diff --git a/x/gatecheck/authante.go b/x/gatecheck/authante.go deleted file mode 100644 index ee15a044..00000000 --- a/x/gatecheck/authante.go +++ /dev/null @@ -1,32 +0,0 @@ -package gatecheck - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/cosmos/cosmos-sdk/x/auth/keeper" - "github.com/cosmos/cosmos-sdk/x/auth/types" -) - -type AuthAnteDecorator struct { - ak keeper.AccountKeeper - supplyKeeper types.SupplyKeeper - sigGasConsumer ante.SignatureVerificationGasConsumer -} - -func NewAuthAnteDecorator(ak keeper.AccountKeeper, sk types.SupplyKeeper, sgc ante.SignatureVerificationGasConsumer) AuthAnteDecorator { - return AuthAnteDecorator{ - ak: ak, - supplyKeeper: sk, - sigGasConsumer: sgc, - } -} - -func (aad AuthAnteDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - authAnteHandler := auth.NewAnteHandler(aad.ak, aad.supplyKeeper, aad.sigGasConsumer) - newCtx, err = authAnteHandler(ctx, tx, simulate) - if err != nil { - return newCtx, err - } - return next(newCtx, tx, simulate) -} diff --git a/x/gatecheck/authcheck.go b/x/gatecheck/authcheck.go deleted file mode 100644 index 4f78bd51..00000000 --- a/x/gatecheck/authcheck.go +++ /dev/null @@ -1,69 +0,0 @@ -package gatecheck - -import ( - "github.com/ShareRing/modules/document" - "github.com/ShareRing/modules/id" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/electoral" - "github.com/sharering/shareledger/x/gentlemint" -) - -const ( - NotIdSignerErr = "Transacation's Signer is not IdSigner" - NotDocIssuerErr = "Transacation's Signer is not document issuer" - NotAuthorityErr = "Transacation's Signer is not Authority" - NotBackupAccountErr = "Transacation's Signer is not the backup account" -) - -type CheckAuthDecorator struct { - gk gentlemint.Keeper - ik id.Keeper -} - -func NewCheckAuthDecorator(gk gentlemint.Keeper, ik id.Keeper) CheckAuthDecorator { - return CheckAuthDecorator{ - gk: gk, - ik: ik, - } -} - -func (cfd CheckAuthDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - msgs := tx.GetMsgs() - msg := msgs[0] - - switch msg.Type() { - case gentlemint.TypeLoadSHRMsg, gentlemint.TypeEnrollSHRPLoaderMsg, gentlemint.TypeRevokeSHRPLoaderMsg, electoral.TypeEnrollVoter, electoral.TypeRevokeVoter: - if msg.GetSigners()[0].String() != cfd.gk.GetAuthorityAccount(ctx) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, NotAuthorityErr) - } - case gentlemint.TypeLoadSHRPMsg: - if !gentlemint.IsSHRPLoader(ctx, msg.GetSigners()[0], cfd.gk) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "Signer is not approved SHRP loader") - } - case gentlemint.TypeBurnSHRMsg, gentlemint.TypeBurnSHRPMsg: - if msg.GetSigners()[0].String() != cfd.gk.GetTreasurerAccount(ctx) { - return ctx, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Signer is not treasurer") - } - case id.TypeMsgCreateID, id.TypeMsgCreateIDBatch, id.TypeMsgUpdateID: - idSigner := cfd.gk.GetIdSigner(ctx, msg.GetSigners()[0]) - if !idSigner.IsActive() { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, NotIdSignerErr) - } - case id.TypeMsgReplaceIdOwner: - rMsg, _ := msg.(id.MsgReplaceIdOwner) - id := cfd.ik.GetIDByIdString(ctx, rMsg.Id) - if !id.BackupAddr.Equals(rMsg.BackupAddr) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, NotBackupAccountErr) - } - case document.TypeMsgCreateDoc, document.TypeMsgCreateDocInBatch, document.TypeMsgUpdateDoc, document.TypeMsgRevokeDoc: - issuer := cfd.gk.GetDocIssuer(ctx, msg.GetSigners()[0]) - if !issuer.IsActive() { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, NotDocIssuerErr) - } - // case gentlemint.TypeEnrollIDSignersMsg, gentlemint.TypeRevokeIDSignersMsg: - - default: - } - return next(ctx, tx, simulate) -} diff --git a/x/gatecheck/feecheck.go b/x/gatecheck/feecheck.go deleted file mode 100644 index ac88d18a..00000000 --- a/x/gatecheck/feecheck.go +++ /dev/null @@ -1,96 +0,0 @@ -package gatecheck - -import ( - "github.com/ShareRing/modules/document" - doctypes "github.com/ShareRing/modules/document/types" - "github.com/ShareRing/modules/id" - idtypes "github.com/ShareRing/modules/id/types" - shareringUtils "github.com/ShareRing/modules/utils" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/sharering/shareledger/x/asset" - "github.com/sharering/shareledger/x/booking" - "github.com/sharering/shareledger/x/gentlemint" -) - -const ( - FEE_LEVEL_HIGH = "HIGH" - // HIGHFEE = 0.05 - FEE_LEVEL_MEDIUM = "MEDIUM" - // MEDIUMFEE = 0.03 - FEE_LEVEL_LOW = "LOW" - // LOWFEE = 0.02 - // MINFEE = 0.01 - SKIP_CHECK_LEVEL = "SKIP" -) - -type CheckFeeDecorator struct { - gk gentlemint.Keeper -} - -func NewCheckFeeDecorator(gk gentlemint.Keeper) CheckFeeDecorator { - return CheckFeeDecorator{ - gk: gk, - } -} - -func (cfd CheckFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - msgs := tx.GetMsgs() - msg := msgs[0] - feeLevel, multiplier := getFeeLevel(msg) - if feeLevel == SKIP_CHECK_LEVEL { - return next(ctx, tx, simulate) - } - exRate := cfd.gk.GetExchangeRate(ctx) - // exRate, err := strconv.ParseFloat(exRateStr, 64) - // if err != nil { - // return ctx, err - // } - - requiredFees := getRequiredFees(feeLevel, exRate, int64(multiplier)) - - feeTx, _ := tx.(ante.FeeTx) - fee := feeTx.GetFee() - if requiredFees.IsAnyGT(fee) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", fee, requiredFees) - } - return next(ctx, tx, simulate) -} - -func getFeeLevel(msg sdk.Msg) (string, int) { - switch msg.Type() { - case asset.TypeAssetCreateMsg, booking.TypeBookMsg, document.TypeMsgCreateDoc, document.TypeMsgRevokeDoc: - return FEE_LEVEL_HIGH, 1 - case asset.TypeAssetUpdateMsg, booking.TypeBookCompleteMsg, document.TypeMsgUpdateDoc, id.TypeMsgCreateID, id.TypeMsgUpdateID, id.TypeMsgReplaceIdOwner: - return FEE_LEVEL_MEDIUM, 1 - case asset.TypeAssetDeleteMsg, "send", gentlemint.TypesSendSHRP, gentlemint.TypeSendSHR: - return FEE_LEVEL_LOW, 1 - case document.TypeMsgCreateDocInBatch: - m := msg.(doctypes.MsgCreateDocBatch) - return FEE_LEVEL_HIGH, len(m.Holder) - case id.TypeMsgCreateIDBatch: - m := msg.(idtypes.MsgCreateIdBatch) - return FEE_LEVEL_MEDIUM, len(m.Id) - default: - return SKIP_CHECK_LEVEL, 1 - } -} - -// Calculate the SHR amount based on the fee level and the exchange rate -func getRequiredFees(feeLevel string, exRate sdk.Int, multiplier int64) sdk.Coins { - var fiatFee sdk.Int - switch feeLevel { - case FEE_LEVEL_HIGH: - fiatFee = shareringUtils.HIGHFEE - case FEE_LEVEL_MEDIUM: - fiatFee = shareringUtils.MEDIUMFEE - case FEE_LEVEL_LOW: - fiatFee = shareringUtils.LOWFEE - default: - fiatFee = shareringUtils.MINFEE - } - - shrAmt := fiatFee.Mul(exRate) - return sdk.NewCoins(sdk.NewCoin("shr", shrAmt.Mul(sdk.NewInt(multiplier)))) -} diff --git a/x/gatecheck/feeensure.go b/x/gatecheck/feeensure.go deleted file mode 100644 index 21636136..00000000 --- a/x/gatecheck/feeensure.go +++ /dev/null @@ -1,32 +0,0 @@ -// ensure that user has enough shr token to pay fee -package gatecheck - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/sharering/shareledger/x/gentlemint" -) - -type FeeEnsureDecorator struct { - gk gentlemint.Keeper -} - -func NewFeeEnsureDecorator(gk gentlemint.Keeper) FeeEnsureDecorator { - return FeeEnsureDecorator{ - gk: gk, - } -} - -func (fsd FeeEnsureDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - feeTx, _ := tx.(ante.FeeTx) - fee := feeTx.GetFee() - shrAmt := fee.AmountOf("shr") - amtToBuy, notEnough := fsd.gk.NotEnoughShr(ctx, shrAmt, feeTx.FeePayer()) - if notEnough { - err := fsd.gk.BuyShr(ctx, amtToBuy, feeTx.FeePayer()) - if err != nil { - return ctx, err - } - } - return next(ctx, tx, simulate) -} diff --git a/x/gatecheck/gatecheck.go b/x/gatecheck/gatecheck.go deleted file mode 100644 index b9f70c1b..00000000 --- a/x/gatecheck/gatecheck.go +++ /dev/null @@ -1,21 +0,0 @@ -package gatecheck - -import ( - "github.com/ShareRing/modules/id" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/cosmos/cosmos-sdk/x/auth/keeper" - "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/sharering/shareledger/x/electoral" - "github.com/sharering/shareledger/x/gentlemint" -) - -func NewAnteHandler(ak keeper.AccountKeeper, ek electoral.Keeper, supplyKeeper types.SupplyKeeper, gmKeeper gentlemint.Keeper, idKeeper id.Keeper, sigGasConsumer ante.SignatureVerificationGasConsumer) sdk.AnteHandler { - return sdk.ChainAnteDecorators( - NewCheckValDecorator(ek), - NewCheckFeeDecorator(gmKeeper), - NewFeeEnsureDecorator(gmKeeper), - NewAuthAnteDecorator(ak, supplyKeeper, sigGasConsumer), - NewCheckAuthDecorator(gmKeeper, idKeeper), - ) -} diff --git a/x/gatecheck/valcheck.go b/x/gatecheck/valcheck.go deleted file mode 100644 index 0877768f..00000000 --- a/x/gatecheck/valcheck.go +++ /dev/null @@ -1,30 +0,0 @@ -package gatecheck - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/electoral" -) - -type CheckValDecorator struct { - ek electoral.Keeper -} - -func NewCheckValDecorator(ek electoral.Keeper) CheckValDecorator { - return CheckValDecorator{ - ek: ek, - } -} - -func (cvd CheckValDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - msgs := tx.GetMsgs() - msg := msgs[0] - switch msg.Type() { - case "create_validator": - if !electoral.IsEnrolledVoter(ctx, msg.GetSigners()[0], cvd.ek) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "Signer is not enrolled voter") - } - default: - } - return next(ctx, tx, simulate) -} diff --git a/x/gentlemint/alias.go b/x/gentlemint/alias.go deleted file mode 100644 index c9a64049..00000000 --- a/x/gentlemint/alias.go +++ /dev/null @@ -1,72 +0,0 @@ -package gentlemint - -import ( - "github.com/sharering/shareledger/x/gentlemint/keeper" - "github.com/sharering/shareledger/x/gentlemint/types" -) - -const ( - ModuleName = types.ModuleName - RouterKey = types.RouterKey - StoreKey = types.StoreKey - QuerierRoute = types.QuerierRoute - TypeLoadSHRMsg = types.TypeLoadSHRMsg - TypeLoadSHRPMsg = types.TypeLoadSHRPMsg - TypeBuyCentMsg = types.TypeBuyCent - TypeBurnSHRPMsg = types.TypeBurnSHRPMsg - TypeBurnSHRMsg = types.TypeBurnSHRMsg - TypeEnrollSHRPLoaderMsg = types.TypeEnrollSHRPLoaderMsg - TypeRevokeSHRPLoaderMsg = types.TypeRevokeSHRPLoaderMsg - TypeBuySHRMsg = types.TypeBuySHRMsg - TypeSetExchangeMsg = types.TypeMsgSetExchange - TypesSendSHRP = types.TypeMsgSendSHRP - TypeSendSHR = types.TypeMsgSendSHR - - IdSignerPrefix = types.IdSignerPrefix - ActiveStatus = types.Active - InactiveStatus = types.Inactive - - TypeEnrollIDSignersMsg = types.TypeEnrollIDSignersMsg - TypeRevokeIDSignersMsg = types.TypeRevokeIDSignersMsg -) - -var ( - NewKeeper = keeper.NewKeeper - NewQuerier = keeper.NewQuerier - NewMsgLoadSHR = types.NewMsgLoadSHR - NewMsgBurnSHRP = types.NewMsgBurnSHRP - NewMsgBurnSHR = types.NewMsgBurnSHR - NewMsgBuySHR = types.NewMsgBuySHR - NewMsgSetExchange = types.NewMsgSetExchange - NewMsgSendSHRP = types.NewMsgSendSHRP - NewMsgSendSHR = types.NewMsgSendSHR - ModuleCdc = types.ModuleCdc - RegisterCodec = types.RegisterCodec - ParseCoinStr = types.ParseCoinStr -) - -type ( - Keeper = keeper.Keeper - MsgLoadSHR = types.MsgLoadSHR - MsgBurnSHRP = types.MsgBurnSHRP - MsgBurnSHR = types.MsgBurnSHR - MsgLoadSHRP = types.MsgLoadSHRP - MsgBuySHR = types.MsgBuySHR - MsgSetExchange = types.MsgSetExchange - MsgBuyCent = types.MsgBuyCent - MsgEnrollSHRPLoader = types.MsgEnrollSHRPLoaders - MsgRevokeSHRPLoader = types.MsgRevokeSHRPLoaders - MsgSendSHRP = types.MsgSendSHRP - MsgSendSHR = types.MsgSendSHR - - MsgRevokeIDSigners = types.MsgRevokeIDSigners - MsgEnrollIDSigners = types.MsgEnrollIDSigners - - MsgEnrollDocIssuers = types.MsgEnrollDocIssuers - MsgRevokeDocIssuers = types.MsgRevokeDocIssuers - - MsgEnrollAccOperators = types.MsgEnrollAccOperators - MsgRevokeAccOperators = types.MsgRevokeAccOperators - - AccState = types.AccState -) diff --git a/x/gentlemint/client/cli/query.go b/x/gentlemint/client/cli/query.go index 56371e28..96b02526 100644 --- a/x/gentlemint/client/cli/query.go +++ b/x/gentlemint/client/cli/query.go @@ -2,110 +2,40 @@ package cli import ( "fmt" + // "strings" + + "github.com/spf13/cobra" - shareringUtils "github.com/ShareRing/modules/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/sharering/shareledger/x/gentlemint/types" + // "github.com/cosmos/cosmos-sdk/client/flags" + // sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/cobra" + "github.com/sharering/shareledger/x/gentlemint/types" ) -func QueryCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - gentlemintQueryCmd := &cobra.Command{ +// GetQueryCmd returns the cli query commands for this module +func GetQueryCmd(queryRoute string) *cobra.Command { + // Group gentlemint queries under a subcommand + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "Querying commands for the gentlemint module", + Aliases: []string{types.ModuleNameAlias}, + Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - gentlemintQueryCmd.AddCommand(flags.GetCommands( - CmdGetLoader(storeKey, cdc), - CmdGetLoadersFromFile(storeKey, cdc), - CmdGetExchange(storeKey, cdc), - CmdGetIdSigner(storeKey, cdc), - CmdGetAllIdSigner(storeKey, cdc), - CmdGetAccountOperator(storeKey, cdc), - CmdGetAllAccountOperator(storeKey, cdc), - CmdGetDocumentIssuer(storeKey, cdc), - CmdGetAllDocumentIssuer(storeKey, cdc), - )...) - return gentlemintQueryCmd -} + cmd.AddCommand(CmdShowExchangeRate()) -func CmdGetLoader(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "get-loader [address]", - Short: "get shrp loader from address", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - addr := "shrploader" + args[0] - queryPath := fmt.Sprintf("custom/%s/loader/%s", queryRoute, addr) - res, _, err := cliCtx.QueryWithData(queryPath, nil) - if err != nil { - fmt.Printf("could not get loader - %s \n", addr) - return nil - } + cmd.AddCommand(CmdListLevelFee()) + cmd.AddCommand(CmdShowLevelFee()) + cmd.AddCommand(CmdListActionLevelFee()) + cmd.AddCommand(CmdShowActionLevelFee()) + cmd.AddCommand(CmdCheckFees()) - var out types.SHRPLoader - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} - -func CmdGetLoadersFromFile(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "get-loaders-from-file [file-path]", - Short: "get shrp loaders from json file of addresses", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - addrList, err := shareringUtils.GetAddressFromFile(args[0]) - if err != nil { - return err - } - for i, addr := range addrList { - fmt.Println("loader", i, addr) - addr = "shrploader" + addr - queryPath := fmt.Sprintf("custom/%s/loader/%s", queryRoute, addr) - res, _, err := cliCtx.QueryWithData(queryPath, nil) - if err != nil { - fmt.Printf("could not get loader - %s \n", addr) - return nil - } - - var out types.SHRPLoader - cdc.MustUnmarshalJSON(res, &out) - if err := cliCtx.PrintOutput(out); err != nil { - return err - } - } - return nil - }, - } -} + cmd.AddCommand(CmdBalances()) -func CmdGetExchange(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "get-exchange", - Short: "get shrp to shr exchange rate", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - queryPath := fmt.Sprintf("custom/%s/exchange", queryRoute) - res, _, err := cliCtx.QueryWithData(queryPath, nil) - if err != nil { - fmt.Println("could not get exchange", err) - return nil - } + // this line is used by starport scaffolding # 1 - var out string - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } + return cmd } diff --git a/x/gentlemint/client/cli/query_account_operator.go b/x/gentlemint/client/cli/query_account_operator.go deleted file mode 100644 index 486e2f6f..00000000 --- a/x/gentlemint/client/cli/query_account_operator.go +++ /dev/null @@ -1,50 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gentlemint/types" - "github.com/spf13/cobra" -) - -func CmdGetAccountOperator(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "account-operator [address]", - Short: "get account operator by address", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/account-operator/%s", queryRoute, addr.String()), nil) - if err != nil { - return err - } - var out types.AccState - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} - -func CmdGetAllAccountOperator(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "account-operators", - Short: "get account operator by address", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/account-operators", queryRoute), nil) - if err != nil { - return err - } - var out []types.AccState - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} diff --git a/x/gentlemint/client/cli/query_action_level_fee.go b/x/gentlemint/client/cli/query_action_level_fee.go new file mode 100644 index 00000000..b0a08d16 --- /dev/null +++ b/x/gentlemint/client/cli/query_action_level_fee.go @@ -0,0 +1,69 @@ +package cli + +import ( + "context" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func CmdListActionLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "action-level-fees", + Short: "List all action-level-fee", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryActionLevelFeesRequest{} + + res, err := queryClient.ActionLevelFees(context.Background(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +func CmdShowActionLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "action-fee [action]", + Short: "shows a action-level-fee", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx := client.GetClientContextFromCmd(cmd) + + queryClient := types.NewQueryClient(clientCtx) + + argAction := args[0] + + params := &types.QueryActionLevelFeeRequest{ + Action: argAction, + } + + res, err := queryClient.ActionLevelFee(context.Background(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/query_action_level_fee_test.go b/x/gentlemint/client/cli/query_action_level_fee_test.go new file mode 100644 index 00000000..1ebc46eb --- /dev/null +++ b/x/gentlemint/client/cli/query_action_level_fee_test.go @@ -0,0 +1,30 @@ +package cli_test + +import ( + "github.com/cosmos/cosmos-sdk/testutil/network" + "strconv" + "testing" + + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/stretchr/testify/require" +) + +// Prevent strconv unused error +var _ = strconv.IntSize + +func networkWithActionLevelFeeObjects(t *testing.T, n int) (*network.Network, []types.ActionLevelFee) { + t.Helper() + cfg := network.DefaultConfig() + state := types.GenesisState{} + require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) + + for i := 0; i < n; i++ { + state.ActionLevelFeeList = append(state.ActionLevelFeeList, types.ActionLevelFee{ + Action: strconv.Itoa(i), + }) + } + buf, err := cfg.Codec.MarshalJSON(&state) + require.NoError(t, err) + cfg.GenesisState[types.ModuleName] = buf + return network.New(t, cfg), state.ActionLevelFeeList +} diff --git a/x/gentlemint/client/cli/query_balances.go b/x/gentlemint/client/cli/query_balances.go new file mode 100644 index 00000000..a635a89b --- /dev/null +++ b/x/gentlemint/client/cli/query_balances.go @@ -0,0 +1,50 @@ +package cli + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ = strconv.Itoa(0) + +func CmdBalances() *cobra.Command { + cmd := &cobra.Command{ + Use: "balances", + Short: "Query balances from [address]", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + if _, err := sdk.AccAddressFromBech32(args[0]); err != nil { + return err + } + + params := &types.QueryBalancesRequest{ + Address: args[0], + } + + res, err := queryClient.Balances(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/query_check_fees.go b/x/gentlemint/client/cli/query_check_fees.go new file mode 100644 index 00000000..a064b8f5 --- /dev/null +++ b/x/gentlemint/client/cli/query_check_fees.go @@ -0,0 +1,45 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ = strconv.Itoa(0) + +func CmdCheckFees() *cobra.Command { + cmd := &cobra.Command{ + Use: "check-fees [address] [actions]", + Short: "Query check-fees of actions and status of current [address]'s balances with that fees", + Args: cobra.MinimumNArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryCheckFeesRequest{ + Actions: args[1:], + Address: args[0], + } + + res, err := queryClient.CheckFees(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/query_document_issuer.go b/x/gentlemint/client/cli/query_document_issuer.go deleted file mode 100644 index 65cea18d..00000000 --- a/x/gentlemint/client/cli/query_document_issuer.go +++ /dev/null @@ -1,50 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gentlemint/types" - "github.com/spf13/cobra" -) - -func CmdGetDocumentIssuer(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "document-issuer [address]", - Short: "get document issuer by address", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/document-issuer/%s", queryRoute, addr.String()), nil) - if err != nil { - return err - } - var out types.AccState - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} - -func CmdGetAllDocumentIssuer(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "document-issuers", - Short: "get account operator by address", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/document-issuers", queryRoute), nil) - if err != nil { - return err - } - var out []types.AccState - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} diff --git a/x/gentlemint/client/cli/query_get_exchange.go b/x/gentlemint/client/cli/query_get_exchange.go new file mode 100644 index 00000000..663df66f --- /dev/null +++ b/x/gentlemint/client/cli/query_get_exchange.go @@ -0,0 +1,38 @@ +package cli + +import ( + "context" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/spf13/cobra" +) + +func CmdShowExchangeRate() *cobra.Command { + cmd := &cobra.Command{ + Use: "exchange", + Short: "Get shrp to shr exchange rate", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryExchangeRateRequest{} + + res, err := queryClient.ExchangeRate(context.Background(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/query_id.go b/x/gentlemint/client/cli/query_id.go deleted file mode 100644 index 4eb16234..00000000 --- a/x/gentlemint/client/cli/query_id.go +++ /dev/null @@ -1,50 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gentlemint/types" - "github.com/spf13/cobra" -) - -func CmdGetIdSigner(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "id-signer [address]", - Short: "get id signer by address", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/id-signer/%s", queryRoute, addr.String()), nil) - if err != nil { - return err - } - var out types.AccState - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} - -func CmdGetAllIdSigner(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "id-signers", - Short: "get all id signer", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/id-signers", queryRoute), nil) - if err != nil { - return err - } - var out []types.AccState - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} diff --git a/x/gentlemint/client/cli/query_level_fee.go b/x/gentlemint/client/cli/query_level_fee.go new file mode 100644 index 00000000..cf3f775b --- /dev/null +++ b/x/gentlemint/client/cli/query_level_fee.go @@ -0,0 +1,69 @@ +package cli + +import ( + "context" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func CmdListLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "level-fees", + Short: "List all level-fees", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryLevelFeesRequest{} + + res, err := queryClient.LevelFees(context.Background(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +func CmdShowLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "level-fee [level]", + Short: "shows a level-fee", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx := client.GetClientContextFromCmd(cmd) + + queryClient := types.NewQueryClient(clientCtx) + + argLevel := args[0] + + params := &types.QueryLevelFeeRequest{ + Level: argLevel, + } + + res, err := queryClient.LevelFee(context.Background(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/tx.go b/x/gentlemint/client/cli/tx.go index c555be53..450991b7 100644 --- a/x/gentlemint/client/cli/tx.go +++ b/x/gentlemint/client/cli/tx.go @@ -1,678 +1,41 @@ package cli import ( - "bufio" "fmt" + "time" "github.com/spf13/cobra" - "github.com/spf13/viper" - - shareringUtils "github.com/ShareRing/modules/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + // "github.com/cosmos/cosmos-sdk/client/flags" "github.com/sharering/shareledger/x/gentlemint/types" - - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" ) var ( - minFeeShr = shareringUtils.MINFEE.String() + "shr" - sendFee = shareringUtils.LOWFEE + DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) ) -func GetTxCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - gentlemintTxCmd := &cobra.Command{ +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ Use: types.ModuleName, - Short: "gentlemint transaction subcommands", + Aliases: []string{types.ModuleNameAlias}, + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } - gentlemintTxCmd.AddCommand(flags.PostCommands( - GetCmdLoadSHR(cdc), - GetCmdBuySHR(cdc), - GetCmdSetExchange(cdc), - GetCmdEnrollSHRPLoader(cdc), - GetCmdEnrollSHRPLoaderFromFile(cdc), - GetCmdRevokeSHRPLoader(cdc), - GetCmdRevokeSHRPLoaderFromFile(cdc), - GetCmdLoadSHRP(cdc), - GetCmdSendSHRP(cdc), - GetCmdSendSHR(cdc), - GetCmdBurnSHRP(cdc), - GetCmdBurnSHR(cdc), - GetCmdEnrollIdSigners(cdc), - GetCmdEnrollIdSignersFromFile(cdc), - GetCmdRevokeIdSigners(cdc), - GetCmdEnrollAccountOperators(cdc), - GetCmdRevokeAccountOperator(cdc), - GetCmdEnrollDocIssuer(cdc), - GetCmdRevokeDocIssuer(cdc), - )...) - - return gentlemintTxCmd -} - -func GetCmdLoadSHR(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "load-shr [address] [amount]", - Short: "bid for existing name or claim new name", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - to, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - // amt, err := strconv.Atoi(args[1]) - // if err != nil { - // return err - // } - amt := args[1] - msg := types.NewMsgLoadSHR(cliCtx.GetFromAddress(), to, amt) - err = msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdLoadSHRP(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "load-shrp [address] [amount]", - Short: "bid for existing name or claim new name", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - to, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - amt := args[1] - msg := types.NewMsgLoadSHRP(cliCtx.GetFromAddress(), to, amt) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdSendSHRP(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "send-shrp [address] [amount]", - Short: "send shrp to another address", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txFee, err := shareringUtils.GetFeeFromShrp(cdc, cliCtx, sendFee) - - txBldr = txBldr.WithFees(txFee) - - to, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - amt := args[1] - msg := types.NewMsgSendSHRP(cliCtx.GetFromAddress(), to, amt) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdSendSHR(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "send-shr [address] [amount]", - Short: "send shr to another address", - Long: "buy shr using shrp balance if the sender doesn't have enough shr", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txFee, err := shareringUtils.GetFeeFromShrp(cdc, cliCtx, sendFee) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(txFee) - - to, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - // amt, err := strconv.Atoi(args[1]) - // if err != nil { - // return err - // } - amt := args[1] - msg := types.NewMsgSendSHR(cliCtx.GetFromAddress(), to, amt) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdBuySHR(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "buy-shr [amount]", - Short: "buy shr from shrp", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - amt := args[0] - msg := types.NewMsgBuySHR(cliCtx.GetFromAddress(), amt) - err := msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdSetExchange(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "set-exchange [rate]", - Short: "set exchange rate of shrp to shr", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - msg := types.NewMsgSetExchange(cliCtx.GetFromAddress(), args[0]) - err := msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdBurnSHRP(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "burn-shrp [amount]", - Short: "bid for existing name or claim new name", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - amt := args[0] - msg := types.NewMsgBurnSHRP(cliCtx.GetFromAddress(), amt) - err := msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdBurnSHR(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "burn-shr [amount]", - Short: "burn shr from treasurer account", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - // amt, err := strconv.Atoi(args[0]) - // if err != nil { - // return err - // } - amt := args[0] - msg := types.NewMsgBurnSHR(cliCtx.GetFromAddress(), amt) - err := msg.ValidateBasic() - if err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdEnrollSHRPLoader(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-loaders [address 1] [address 2] [address n]", - Short: "bid for existing name or claim new name", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) + cmd.AddCommand(CmdBuyShr()) + cmd.AddCommand(CmdSetExchange()) + cmd.AddCommand(CmdSetLevelFee()) + cmd.AddCommand(CmdDeleteLevelFee()) + cmd.AddCommand(CmdSetActionLevelFee()) + cmd.AddCommand(CmdDeleteActionLevelFee()) + cmd.AddCommand(CmdLoad()) + cmd.AddCommand(CmdSend()) + cmd.AddCommand(CmdBurn()) + // this line is used by starport scaffolding # 1 - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - var loaderAddresses []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - loaderAddresses = append(loaderAddresses, addr) - } - - msg := types.NewMsgEnrollSHRPLoaders(cliCtx.GetFromAddress(), loaderAddresses) - err := msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdEnrollSHRPLoaderFromFile(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-loaders-from-file [filepath]", - Short: "bid for existing name or claim new name", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - addrList, err := shareringUtils.GetAddressFromFile(args[0]) - if err != nil { - return err - } - - listLength := len(addrList) - nloop := listLength / 5 - if nloop*5 > listLength { - nloop = nloop + 1 - } - for i := 0; i < nloop; i++ { - var loaderAddresses []sdk.AccAddress - m := 5 * i - n := 5*i + 5 - if n > listLength { - n = listLength - } - for _, a := range addrList[m:n] { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - loaderAddresses = append(loaderAddresses, addr) - } - - msg := types.NewMsgEnrollSHRPLoaders(cliCtx.GetFromAddress(), loaderAddresses) - err = msg.ValidateBasic() - if err != nil { - return err - } - if err := utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}); err != nil { - return err - } - fmt.Printf("================ ENROLLED %d LOADERS", n) - } - fmt.Printf("\nDONE ENROLL %d SHRP LOADERS\n", listLength) - return nil - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdRevokeSHRPLoader(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "revoke-loaders [address 1] [address 2] [address n]", - Short: "revoke shrp loaders", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - var loaderAddresses []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - loaderAddresses = append(loaderAddresses, addr) - } - - msg := types.NewMsgEnrollSHRPLoaders(cliCtx.GetFromAddress(), loaderAddresses) - err := msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdRevokeSHRPLoaderFromFile(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "revoke-loaders-from-file [filepath]", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - addrList, err := shareringUtils.GetAddressFromFile(args[0]) - if err != nil { - return err - } - - listLength := len(addrList) - nloop := listLength / 5 - if nloop*5 > listLength { - nloop = nloop + 1 - } - for i := 0; i < nloop; i++ { - var loaderAddresses []sdk.AccAddress - m := 5 * i - n := 5*i + 5 - if n > listLength { - n = listLength - } - for _, a := range addrList[m:n] { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - loaderAddresses = append(loaderAddresses, addr) - } - - msg := types.NewMsgRevokeSHRPLoaders(cliCtx.GetFromAddress(), loaderAddresses) - err = msg.ValidateBasic() - if err != nil { - return err - } - if err := utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}); err != nil { - return err - } - fmt.Printf("================ REVOKED %d LOADERS", n) - } - fmt.Printf("\nDONE REVOKE %d SHRP LOADERS\n", listLength) - return nil - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") return cmd } diff --git a/x/gentlemint/client/cli/tx_account_operator.go b/x/gentlemint/client/cli/tx_account_operator.go deleted file mode 100644 index 829b1dce..00000000 --- a/x/gentlemint/client/cli/tx_account_operator.go +++ /dev/null @@ -1,123 +0,0 @@ -package cli - -import ( - "bufio" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - - shareringUtils "github.com/ShareRing/modules/utils" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/gentlemint/types" - - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" -) - -func GetCmdEnrollAccountOperators(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-account-operator [address1] [address2] [address3]", - Short: "enroll account operator", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty address list") - } - - var accs []sdk.AccAddress - - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - accs = append(accs, addr) - } - msg := types.NewMsgEnrollAccOperators(cliCtx.GetFromAddress(), accs) - - err := msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdRevokeAccountOperator(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "revoke-account-operator [address1] [address2] [address3]", - Short: "revoke account operator", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - txBldr = txBldr.WithFees(minFeeShr) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty address list") - } - var accs []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - accs = append(accs, addr) - } - msg := types.NewMsgRevokeAccOperators(cliCtx.GetFromAddress(), accs) - - err := msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} diff --git a/x/gentlemint/client/cli/tx_action_level_fee.go b/x/gentlemint/client/cli/tx_action_level_fee.go new file mode 100644 index 00000000..8f7fc72c --- /dev/null +++ b/x/gentlemint/client/cli/tx_action_level_fee.go @@ -0,0 +1,73 @@ +package cli + +import ( + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func CmdSetActionLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "set-action-level-fee [action] [level]", + Short: "Set action-level-fee", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + // Get indexes + indexAction := args[0] + + // Get value arguments + argLevel := args[1] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgSetActionLevelFee( + clientCtx.GetFromAddress().String(), + indexAction, + argLevel, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdDeleteActionLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "delete-action-level-fee [action]", + Short: "Delete a action-level-fee", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + indexAction := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgDeleteActionLevelFee( + clientCtx.GetFromAddress().String(), + indexAction, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/tx_burn.go b/x/gentlemint/client/cli/tx_burn.go new file mode 100644 index 00000000..27c3d8c0 --- /dev/null +++ b/x/gentlemint/client/cli/tx_burn.go @@ -0,0 +1,47 @@ +package cli + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ = strconv.Itoa(0) + +func CmdBurn() *cobra.Command { + cmd := &cobra.Command{ + Use: "burn [coins]", + Short: "Broadcast message burn", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argCoins := args[0] + decCoins, err := sdk.ParseDecCoins(argCoins) + if err != nil { + return err + } + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgBurn( + clientCtx.GetFromAddress().String(), + decCoins, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/tx_buy_shr.go b/x/gentlemint/client/cli/tx_buy_shr.go new file mode 100644 index 00000000..eef83876 --- /dev/null +++ b/x/gentlemint/client/cli/tx_buy_shr.go @@ -0,0 +1,44 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ = strconv.Itoa(0) + +func CmdBuyShr() *cobra.Command { + cmd := &cobra.Command{ + Use: "buy-shr [amount]", + Short: "Buy shr by shrp and cent", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + if err != nil { + return err + } + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgBuyShr( + clientCtx.GetFromAddress().String(), + args[0], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/tx_document_issuer.go b/x/gentlemint/client/cli/tx_document_issuer.go deleted file mode 100644 index 4ee40c37..00000000 --- a/x/gentlemint/client/cli/tx_document_issuer.go +++ /dev/null @@ -1,123 +0,0 @@ -package cli - -import ( - "bufio" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - - shareringUtils "github.com/ShareRing/modules/utils" - - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/gentlemint/types" - - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" -) - -func GetCmdEnrollDocIssuer(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-doc-issuer [address1] [address2] [address3]", - Short: "enroll document issuer", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty address list") - } - - var accs []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - accs = append(accs, addr) - } - msg := types.NewMsgEnrollDocIssuers(cliCtx.GetFromAddress(), accs) - err := msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdRevokeDocIssuer(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "revoke-doc-issuer [address1] [address2] [address3]", - Short: "revoke document issuers", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty address list") - } - var accs []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - accs = append(accs, addr) - } - msg := types.NewMsgRevokeDocIssuers(cliCtx.GetFromAddress(), accs) - err := msg.ValidateBasic() - - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} diff --git a/x/gentlemint/client/cli/tx_id_signer.go b/x/gentlemint/client/cli/tx_id_signer.go deleted file mode 100644 index d66cf828..00000000 --- a/x/gentlemint/client/cli/tx_id_signer.go +++ /dev/null @@ -1,193 +0,0 @@ -package cli - -import ( - "bufio" - "fmt" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/gentlemint/types" - - shareringUtils "github.com/ShareRing/modules/utils" - - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" -) - -func GetCmdEnrollIdSigners(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-id-signer [address1] [address2] [address3]", - Short: "enroll id signers", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - - var signerAddresses []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - signerAddresses = append(signerAddresses, addr) - } - msg := types.NewMsgEnrollIDSigners(cliCtx.GetFromAddress(), signerAddresses) - err := msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdEnrollIdSignersFromFile(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-id-signers-from-file [filepath]", - Short: "enroll id signers", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - addrList, err := shareringUtils.GetAddressFromFile(args[0]) - if err != nil { - return err - } - - listLength := len(addrList) - nloop := listLength / 5 - if nloop*5 > listLength { - nloop = nloop + 1 - } - for i := 0; i < nloop; i++ { - var loaderAddresses []sdk.AccAddress - m := 5 * i - n := 5*i + 5 - if n > listLength { - n = listLength - } - for _, a := range addrList[m:n] { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - loaderAddresses = append(loaderAddresses, addr) - } - - msg := types.NewMsgEnrollIDSigners(cliCtx.GetFromAddress(), loaderAddresses) - err = msg.ValidateBasic() - if err != nil { - return err - } - if err := utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}); err != nil { - return err - } - fmt.Printf("================ ENROLLED %d SIGNERS", n) - } - fmt.Printf("\nDONE ENROLL %d ID SIGNERS\n", listLength) - return nil - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdRevokeIdSigners(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "revoke-id-signer [address1] [address2] [address3]", - Short: "revoke id signers", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - var cliCtx context.CLIContext - var txBldr auth.TxBuilder - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - if len(keySeed) > 0 { - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err = shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - } else { - txBldr = auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx = context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - } - - txBldr = txBldr.WithFees(minFeeShr) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - var signerAddresses []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - signerAddresses = append(signerAddresses, addr) - } - msg := types.NewMsgRevokeIDSigners(cliCtx.GetFromAddress(), signerAddresses) - err := msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} diff --git a/x/gentlemint/client/cli/tx_level_fee.go b/x/gentlemint/client/cli/tx_level_fee.go new file mode 100644 index 00000000..3e68c42c --- /dev/null +++ b/x/gentlemint/client/cli/tx_level_fee.go @@ -0,0 +1,77 @@ +package cli + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func CmdSetLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "level-fee [level] [fee]", + Short: "Set level-fee", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + // Get indexes + indexLevel := args[0] + + // Get value arguments + dc, err := sdk.ParseDecCoin(args[1]) + if err != nil { + return err + } + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgSetLevelFee( + clientCtx.GetFromAddress().String(), + indexLevel, + dc, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdDeleteLevelFee() *cobra.Command { + cmd := &cobra.Command{ + Use: "delete-level-fee [level]", + Short: "Delete a level-fee", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + indexLevel := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgDeleteLevelFee( + clientCtx.GetFromAddress().String(), + indexLevel, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/tx_load.go b/x/gentlemint/client/cli/tx_load.go new file mode 100644 index 00000000..c0342b3f --- /dev/null +++ b/x/gentlemint/client/cli/tx_load.go @@ -0,0 +1,47 @@ +package cli + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ = strconv.Itoa(0) + +func CmdLoad() *cobra.Command { + cmd := &cobra.Command{ + Use: "load [address] [coins]", + Short: "load [coins] into [address]." + + "coins: Expected format: {amount0}{denomination},...,{amountN}{denominationN}", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + decCoins, err := sdk.ParseDecCoins(args[1]) + if err != nil { + return err + } + msg := types.NewMsgLoad( + clientCtx.GetFromAddress().String(), + args[0], + decCoins, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/tx_send.go b/x/gentlemint/client/cli/tx_send.go new file mode 100644 index 00000000..062ca3de --- /dev/null +++ b/x/gentlemint/client/cli/tx_send.go @@ -0,0 +1,50 @@ +package cli + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ = strconv.Itoa(0) + +func CmdSend() *cobra.Command { + cmd := &cobra.Command{ + Use: "send [address] [coins]", + Short: "Broadcast message send", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argAddress := args[0] + + dCoins, err := sdk.ParseDecCoins(args[1]) + if err != nil { + return err + } + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgSend( + clientCtx.GetFromAddress().String(), + argAddress, + dCoins, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/cli/tx_set_exchange.go b/x/gentlemint/client/cli/tx_set_exchange.go new file mode 100644 index 00000000..08a12ed0 --- /dev/null +++ b/x/gentlemint/client/cli/tx_set_exchange.go @@ -0,0 +1,44 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ = strconv.Itoa(0) + +func CmdSetExchange() *cobra.Command { + cmd := &cobra.Command{ + Use: "set-exchange [rate]", + Short: "Set exchange [rate] shrp to shr", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argRate := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgSetExchange( + clientCtx.GetFromAddress().String(), + argRate, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/gentlemint/client/rest/rest.go b/x/gentlemint/client/rest/rest.go deleted file mode 100644 index d3375203..00000000 --- a/x/gentlemint/client/rest/rest.go +++ /dev/null @@ -1,13 +0,0 @@ -package rest - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/client/context" - - "github.com/gorilla/mux" -) - -func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, storeName string) { - r.HandleFunc(fmt.Sprintf("/%s", storeName), nil).Methods("GET") -} diff --git a/x/gentlemint/client/rest/tx.go b/x/gentlemint/client/rest/tx.go deleted file mode 100644 index 0062e0ca..00000000 --- a/x/gentlemint/client/rest/tx.go +++ /dev/null @@ -1 +0,0 @@ -package rest diff --git a/x/gentlemint/client/tests/cli_test.go b/x/gentlemint/client/tests/cli_test.go new file mode 100644 index 00000000..e10c0e45 --- /dev/null +++ b/x/gentlemint/client/tests/cli_test.go @@ -0,0 +1,24 @@ +package tests + +import ( + "github.com/sharering/shareledger/cmd/Shareledgerd/cli" + "sync" + "testing" + + "github.com/sharering/shareledger/testutil/network" + "github.com/stretchr/testify/suite" +) + +var runOnce = sync.Once{} + +func init() { + runOnce.Do(func() { + cli.InitMiddleWare() + }) +} + +func TestGentlemintIntegrationTestSuite(t *testing.T) { + networkConfig := network.ShareLedgerTestingConfig() + networkConfig.NumValidators = 1 + suite.Run(t, NewGentlemintIntegrationTestSuite(networkConfig)) +} diff --git a/x/gentlemint/client/tests/suite.go b/x/gentlemint/client/tests/suite.go new file mode 100644 index 00000000..e44be561 --- /dev/null +++ b/x/gentlemint/client/tests/suite.go @@ -0,0 +1,615 @@ +package tests + +import ( + "fmt" + testutil2 "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + netutilts "github.com/sharering/shareledger/testutil/network" + gentleminttypes "github.com/sharering/shareledger/x/gentlemint/types" + denom "github.com/sharering/shareledger/x/utils/demo" + "github.com/stretchr/testify/suite" + "os" + "strings" + + "github.com/sharering/shareledger/x/electoral/client/tests" +) + +const MaximumSHRSupply = 2090000 + +type GentlemintIntegrationTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network + dir string +} + +func NewGentlemintIntegrationTestSuite(cf network.Config) *GentlemintIntegrationTestSuite { + return &GentlemintIntegrationTestSuite{ + cfg: cf, + } +} + +func (s *GentlemintIntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite for document module") + + kb, dir := netutilts.GetTestingGenesis(s.T(), &s.cfg) + s.dir = dir + + s.network = network.New(s.T(), s.cfg) + _, err := s.network.WaitForHeight(1) + s.Require().NoError(err) + + //override the keyring by our keyring information + s.network.Validators[0].ClientCtx.Keyring = kb + + s.T().Log("setting up document data....") + + //Enroll ACCOUNT_OPERATOR + out, _ := tests.ExCmdEnrollLoader( + s.network.Validators[0].ClientCtx, + s.T(), + netutilts.Accounts[netutilts.KeyLoader].String(), + netutilts.MakeByAccount(netutilts.KeyAuthority), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee2, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init operator fail %v", res.String()) + + s.T().Log("setting up integration test suite successfully") + +} +func (s *GentlemintIntegrationTestSuite) TearDownSuite() { + s.NoError(os.RemoveAll(s.dir)) + s.network.Cleanup() + s.T().Log("tearing down integration test suite") +} + +func (s *GentlemintIntegrationTestSuite) TestLoadSHR() { + validatorCtx := s.network.Validators[0].ClientCtx + type ( + Num struct { + D int + } + ) + testSuite := []struct { + d string + iLoadTarget string + iAmount string + txCreator string + txFee int + oErr error + oRes *sdk.TxResponse + expectTargetBalance *Num + expectCreatorBalance *Num + }{ + { + d: "load_shr_success", + iLoadTarget: netutilts.Accounts[netutilts.KeyEmpty1].String(), + iAmount: "100shr", + txCreator: netutilts.KeyAuthority, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + expectTargetBalance: &Num{98}, + expectCreatorBalance: &Num{9998}, + }, + { + d: "load_shr_but_supply_reach_to_limit", + iLoadTarget: netutilts.Accounts[netutilts.KeyEmpty1].String(), + iAmount: "4396000043shr", + txCreator: netutilts.KeyAuthority, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: gentleminttypes.ErrBaseSupplyExceeded.ABCICode()}, + }, + { + d: "load_shr_loader_isn't_authority", + iLoadTarget: netutilts.Accounts[netutilts.KeyEmpty1].String(), + iAmount: "100shr", + txCreator: netutilts.KeyAccount1, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err := CmdLoadSHR(validatorCtx, tc.iLoadTarget, + tc.iAmount, + netutilts.MakeByAccount(tc.txCreator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txFee), + ) + if tc.oErr != nil { + s.Require().NotNilf(err, "this case require err") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "load shr must success %v", txResponse) + } + if tc.expectTargetBalance != nil { + a, _ := sdk.AccAddressFromBech32(tc.iLoadTarget) + balRes := CmdQueryBalance(s.T(), validatorCtx, a) + s.Equalf(fmt.Sprintf("%d", int64(tc.expectTargetBalance.D)*denom.ShrExponent), balRes.GetBalances().AmountOf(denom.Base).String(), "balance of user is not equal after load shr %s", balRes.GetBalances().String()) + } + if tc.expectCreatorBalance != nil { + balRes := CmdQueryBalance(s.T(), validatorCtx, netutilts.Accounts[tc.txCreator]) + s.Require().Equalf(fmt.Sprintf("%d", int64(tc.expectCreatorBalance.D)*denom.ShrExponent), balRes.GetBalances().AmountOf(denom.Base).String(), "authority balance after make transaction is not equal") + } + }) + } +} + +func (s *GentlemintIntegrationTestSuite) TestBurnSHR() { + validatorCtx := s.network.Validators[0].ClientCtx + + type ( + Num struct { + D int + } + ) + testSuite := []struct { + d string + iAmount string + txCreator string + txFee int + oErr error + oRes *sdk.TxResponse + expectSubtractNum *Num + }{ + { + d: "burn_shr_success", + iAmount: "11shr", + txCreator: netutilts.KeyTreasurer, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + expectSubtractNum: &Num{D: -13}, + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + balResBeforeBurn := CmdQueryBalance(s.T(), validatorCtx, netutilts.Accounts[tc.txCreator], netutilts.JSONFlag) + stdOut, err := CmdBurnSHR(validatorCtx, + tc.iAmount, + netutilts.MakeByAccount(tc.txCreator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txFee), + ) + if tc.oErr != nil { + s.Require().NotNilf(err, "this case require err") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "load shr must success %v", txResponse) + } + + if tc.expectSubtractNum != nil { + balRes := CmdQueryBalance(s.T(), validatorCtx, netutilts.Accounts[tc.txCreator]) + expectAmount := balResBeforeBurn. + GetBalances(). + AmountOf(denom.Base). + Add(sdk.NewInt(int64(tc.expectSubtractNum.D) * denom.ShrExponent)) + s.Equalf(expectAmount.String(), balRes.GetBalances().AmountOf(denom.Base).String(), "the expect shr should be equal") + } + }) + } +} + +func (s *GentlemintIntegrationTestSuite) TestBurnSHRP() { + validatorCtx := s.network.Validators[0].ClientCtx + + type ( + Num struct { + D int + } + ) + testSuite := []struct { + d string + iAmount string + txCreator string + txFee int + oErr error + oRes *sdk.TxResponse + expectSubtractNum *Num + }{ + { + d: "burn_shrp_success", + iAmount: "11shrp", + txCreator: netutilts.KeyTreasurer, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + expectSubtractNum: &Num{D: -11}, + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + balResBeforeBurn := CmdQueryBalance(s.T(), validatorCtx, netutilts.Accounts[tc.txCreator], netutilts.JSONFlag) + stdOut, err := CmdBurnSHR(validatorCtx, + tc.iAmount, + netutilts.MakeByAccount(tc.txCreator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txFee), + ) + if tc.oErr != nil { + s.Require().NotNilf(err, "this case require err") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "load shr must success %v", txResponse) + } + + if tc.expectSubtractNum != nil { + balRes := CmdQueryBalance(s.T(), validatorCtx, netutilts.Accounts[tc.txCreator]) + expectAmount := balResBeforeBurn. + GetBalances(). + AmountOf(denom.BaseUSD). + Add(sdk.NewInt(int64(tc.expectSubtractNum.D) * denom.USDExponent)) + s.Equalf(expectAmount.String(), balRes.GetBalances().AmountOf(denom.BaseUSD).String(), "the expect shr should be equal") + } + }) + } + +} + +func (s *GentlemintIntegrationTestSuite) TestBuySHR() { + validatorCtx := s.network.Validators[0].ClientCtx + + type ( + Num struct { + D float64 + } + ) + testSuite := []struct { + d string + iAmount string + txCreator string + txFee int + oErr error + oRes *sdk.TxResponse + expectChangeNumSHR *Num + expectChangeNumSHRP *Num + }{ + { + d: "buy_shr_success", + iAmount: "211", + txCreator: netutilts.KeyAccount4, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + expectChangeNumSHR: &Num{D: 209}, + expectChangeNumSHRP: &Num{D: -1.06}, + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + balResBeforeBuy := CmdQueryBalance(s.T(), validatorCtx, netutilts.Accounts[tc.txCreator], netutilts.JSONFlag) + stdOut, err := CmdBuySHR(validatorCtx, + tc.iAmount, + netutilts.MakeByAccount(tc.txCreator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txFee), + ) + if tc.oErr != nil { + s.Require().NotNilf(err, "this case require err") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "load shr must success %v", txResponse) + } + balResAfterBuy := CmdQueryBalance(s.T(), validatorCtx, netutilts.Accounts[tc.txCreator]) + if tc.expectChangeNumSHR != nil { + expectSHR := balResBeforeBuy.GetBalances().AmountOf(denom.Base).Add(sdk.NewInt(int64(tc.expectChangeNumSHR.D) * denom.ShrExponent)) + s.Equalf(expectSHR.String(), balResAfterBuy.GetBalances().AmountOf(denom.Base).String(), "shr amount must be equal") + } + if tc.expectChangeNumSHRP != nil { + shrpSub := tc.expectChangeNumSHRP.D * float64(denom.USDExponent) + expectSHRP := balResBeforeBuy.GetBalances().AmountOf(denom.BaseUSD).Add(sdk.NewInt(int64(shrpSub))) + s.Equalf(expectSHRP.String(), balResAfterBuy.GetBalances().AmountOf(denom.BaseUSD).String(), "shrp amount must be equal") + } + }) + } + +} + +func (s *GentlemintIntegrationTestSuite) TestLoadSHRP() { + validatorCtx := s.network.Validators[0].ClientCtx + + type ( + Num struct { + D int + } + ) + testSuite := []struct { + d string + iLoadTarget string + iAmount string + txCreator string + txFee int + oErr error + oRes *sdk.TxResponse + expectBalanceSHRChange *Num + expectBalanceSHRPChange *Num + }{ + { + d: "load_shrp_success", + iLoadTarget: netutilts.Accounts[netutilts.KeyAccount3].String(), + iAmount: "129shrp", + txCreator: netutilts.KeyLoader, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + expectBalanceSHRChange: &Num{-2}, + expectBalanceSHRPChange: &Num{129}, + }, + } + for _, tc := range testSuite { + s.Run(tc.d, func() { + a, _ := sdk.AccAddressFromBech32(tc.iLoadTarget) + balResBeforeLoad := CmdQueryBalance(s.T(), validatorCtx, a) + stdOut, err := CmdLoadSHRP(validatorCtx, tc.iLoadTarget, + tc.iAmount, + netutilts.MakeByAccount(tc.txCreator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txFee), + ) + if tc.oErr != nil { + s.Require().NotNilf(err, "this case require err") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "load shr must success %v", txResponse) + } + a, _ = sdk.AccAddressFromBech32(tc.iLoadTarget) + balResAfterLoad := CmdQueryBalance(s.T(), validatorCtx, a) + if tc.expectBalanceSHRPChange != nil { + shrEx := balResBeforeLoad.GetBalances().AmountOf(denom.BaseUSD).Add(sdk.NewInt(int64(tc.expectBalanceSHRPChange.D) * denom.USDExponent)) + s.Equalf(shrEx.String(), balResAfterLoad.GetBalances().AmountOf(denom.BaseUSD).String(), "shrp should equal") + + } + if tc.expectBalanceSHRChange != nil { + shrEx := balResBeforeLoad.GetBalances().AmountOf(denom.Base).Add(sdk.NewInt(int64(tc.expectBalanceSHRChange.D) * denom.ShrExponent)) + s.Equalf(shrEx.String(), balResAfterLoad.GetBalances().AmountOf(denom.Base).String(), "shr should equal") + } + }) + } + +} + +func (s *GentlemintIntegrationTestSuite) TestSendSHR() { + validatorCtx := s.network.Validators[0].ClientCtx + + var ( + stdOut testutil2.BufferWriter + err error + txnResponse sdk.TxResponse + ) + type ( + Num struct { + D int64 + } + ) + testSuite := []struct { + d string + iSender string + iReceiver string + iAmount string + txFee int + txCreator string + oErr error + oRes *sdk.TxResponse + expectSenderSHRChange *Num + expectReceiverSHRChange *Num + }{ + { + d: "send_shr_success", + iSender: netutilts.Accounts[netutilts.KeyMillionaire].String(), + iReceiver: netutilts.Accounts[netutilts.KeyEmpty3].String(), + iAmount: "1220shr", + txFee: 4, + txCreator: netutilts.KeyMillionaire, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + expectSenderSHRChange: &Num{D: -1224}, + expectReceiverSHRChange: &Num{D: 1220}, + }, + { + d: "send_shr_fail_insufficient_shr", + iSender: netutilts.Accounts[netutilts.KeyAccount2].String(), + iReceiver: netutilts.Accounts[netutilts.KeyEmpty3].String(), + iAmount: "10022000shr", + txFee: 4, + txCreator: netutilts.KeyAccount2, + oErr: nil, + oRes: &sdk.TxResponse{Code: sdkerrors.ErrInsufficientFunds.ABCICode()}, + expectSenderSHRChange: &Num{D: -4}, + expectReceiverSHRChange: &Num{D: 0}, + }, + } + + for _, tc := range testSuite { + senderAddr, _ := sdk.AccAddressFromBech32(tc.iSender) + senderBalanceBeforeSend := CmdQueryBalance(s.T(), validatorCtx, senderAddr) + receiverAddr, _ := sdk.AccAddressFromBech32(tc.iReceiver) + receiverBalanceBeforeSend := CmdQueryBalance(s.T(), validatorCtx, receiverAddr) + + stdOut, err = CmdSendSHR(validatorCtx, tc.iReceiver, tc.iAmount, + netutilts.JSONFlag, + netutilts.SHRFee(tc.txFee), + netutilts.BlockBroadcast, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + + if tc.oErr != nil { + s.Require().NotNilf(err, "this case require error") + } + + if tc.oRes != nil { + txnResponse = netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "txn response got error %v", txnResponse.String()) + } + senderAddr, _ = sdk.AccAddressFromBech32(tc.iSender) + senderBalanceAfterSend := CmdQueryBalance(s.T(), validatorCtx, senderAddr) + receiverAddr, _ = sdk.AccAddressFromBech32(tc.iReceiver) + receiverBalanceAfterSend := CmdQueryBalance(s.T(), validatorCtx, receiverAddr) + if tc.expectReceiverSHRChange != nil { + expect := receiverBalanceBeforeSend.GetBalances().AmountOf(denom.Base).Add(sdk.NewInt(tc.expectReceiverSHRChange.D * denom.ShrExponent)) + s.Require().Equalf(expect.String(), receiverBalanceAfterSend.GetBalances().AmountOf(denom.Base).String(), "receiver shr balance isn't equal") + } + + if tc.expectSenderSHRChange != nil { + expect := senderBalanceBeforeSend.GetBalances().AmountOf(denom.Base).Add(sdk.NewInt(tc.expectSenderSHRChange.D * denom.ShrExponent)) + s.Require().Equalf(expect.String(), senderBalanceAfterSend.GetBalances().AmountOf(denom.Base).String(), "sender shr balance isn't equal") + } + + } + +} + +func (s *GentlemintIntegrationTestSuite) TestSendSHRP() { + var ( + stdOut testutil2.BufferWriter + err error + txnResponse sdk.TxResponse + ) + validatorCtx := s.network.Validators[0].ClientCtx + + type ( + Num struct { + D int64 + } + ) + testSuite := []struct { + d string + iSender string + iReceiver string + iAmount string + txFee int + txCreator string + oErr error + oRes *sdk.TxResponse + expectSenderSHRPChange *Num + expectReceiverSHRPChange *Num + }{ + { + d: "send_shrp_success", + iSender: netutilts.Accounts[netutilts.KeyMillionaire].String(), + iReceiver: netutilts.Accounts[netutilts.KeyEmpty5].String(), + iAmount: "123shrp", + txFee: 4, + txCreator: netutilts.KeyMillionaire, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + expectSenderSHRPChange: &Num{D: -123}, + expectReceiverSHRPChange: &Num{D: 123}, + }, + } + + for _, tc := range testSuite { + senderAddr, _ := sdk.AccAddressFromBech32(tc.iSender) + senderBalanceBeforeSend := CmdQueryBalance(s.T(), validatorCtx, senderAddr) + receiverAddr, _ := sdk.AccAddressFromBech32(tc.iReceiver) + receiverBalanceBeforeSend := CmdQueryBalance(s.T(), validatorCtx, receiverAddr) + + stdOut, err = CmdSendSHRP(validatorCtx, tc.iReceiver, tc.iAmount, + netutilts.JSONFlag, + netutilts.SHRFee(tc.txFee), + netutilts.BlockBroadcast, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator)) + + if tc.oErr != nil { + s.Require().NotNilf(err, "this case require error") + } + + if tc.oRes != nil { + txnResponse = netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "txn response got error %v", txnResponse.String()) + } + senderAddr, _ = sdk.AccAddressFromBech32(tc.iSender) + senderBalanceAfterSend := CmdQueryBalance(s.T(), validatorCtx, senderAddr) + receiverAddr, _ = sdk.AccAddressFromBech32(tc.iReceiver) + receiverBalanceAfterSend := CmdQueryBalance(s.T(), validatorCtx, receiverAddr) + if tc.expectReceiverSHRPChange != nil { + expect := receiverBalanceBeforeSend.GetBalances().AmountOf(denom.BaseUSD).Add(sdk.NewInt(tc.expectReceiverSHRPChange.D * denom.USDExponent)) + s.Require().Equalf(expect.String(), receiverBalanceAfterSend.GetBalances().AmountOf(denom.BaseUSD).String(), "receiver shrp balance isn't equal") + } + + if tc.expectSenderSHRPChange != nil { + expect := senderBalanceBeforeSend.GetBalances().AmountOf(denom.BaseUSD).Add(sdk.NewInt(tc.expectSenderSHRPChange.D * denom.USDExponent)) + s.Require().Equalf(expect.String(), senderBalanceAfterSend.GetBalances().AmountOf(denom.BaseUSD).String(), "sender shrp balance isn't equal") + } + + } + +} + +func (s *GentlemintIntegrationTestSuite) TestSetExchangeRate() { + + var ( + stdOut testutil2.BufferWriter + err error + txnResponse sdk.TxResponse + ) + validatorCtx := s.network.Validators[0].ClientCtx + + testSuite := []struct { + d string + iRate string + txFee int + txCreator string + oErr error + oRes *sdk.TxResponse + oRate string + }{ + { + d: "set_exchange_rate", + iRate: "12", + txFee: 2, + txCreator: netutilts.KeyTreasurer, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oRate: "12", + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + stdOut, err = CmdSetExchangeRate(validatorCtx, + tc.iRate, netutilts.SHRFee(tc.txFee), + netutilts.MakeByAccount(tc.txCreator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast) + if tc.oErr != nil { + s.Require().NotNilf(err, "error is required in this case") + } + if tc.oRes != nil { + txnResponse = netutilts.ParseStdOut(s.T(), stdOut.Bytes()) + s.Equalf(tc.oRes.Code, txnResponse.Code, "txn response got error %v", txnResponse.String()) + } + if strings.TrimSpace(tc.oRate) != "" { + stdOut, err = CmdGetExchangeRate(validatorCtx, netutilts.JSONFlag) + exchangeRate := gentleminttypes.QueryExchangeRateResponse{} + err = validatorCtx.Codec.UnmarshalJSON(stdOut.Bytes(), &exchangeRate) + s.NoErrorf(err, "should no error %v", err) + s.Equalf(tc.oRate, exchangeRate.GetRate(), "the rate is not equal") + } + }) + } +} diff --git a/x/gentlemint/client/tests/test_helpers.go b/x/gentlemint/client/tests/test_helpers.go new file mode 100644 index 00000000..2980533b --- /dev/null +++ b/x/gentlemint/client/tests/test_helpers.go @@ -0,0 +1,96 @@ +package tests + +import ( + testutil2 "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" + "github.com/cosmos/cosmos-sdk/x/bank/types" + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + cli2 "github.com/cosmos/cosmos-sdk/x/bank/client/cli" + "github.com/sharering/shareledger/x/gentlemint/client/cli" +) + +func CmdGetExchangeRate(ctx client.Context, flags ...string) (testutil.BufferWriter, error) { + return clitestutil.ExecTestCLICmd(ctx, cli.CmdShowExchangeRate(), flags) +} + +func CmdSetExchangeRate(ctx client.Context, rate string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{rate} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdSetExchange(), args) +} + +//CmdBurnSHR burn shr by treasurer account send shr to void +func CmdBurnSHR(ctx client.Context, amount string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{amount} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdBurn(), args) +} + +//CmdBurnSHRP burn shrp by treasurer account send shr to void +func CmdBurnSHRP(ctx client.Context, amount string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{amount} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdBurn(), args) +} + +//CmdBuySHR buy shr by SHRP and cent +func CmdBuySHR(ctx client.Context, amount string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{amount} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdBuyShr(), args) +} + +//CmdLoadSHR mint new shr coin out of thin air and send it to address require authority +func CmdLoadSHR(ctx client.Context, receiver, amount string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{receiver, amount} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdLoad(), args) +} + +//CmdLoadSHRP mint new shrp coin out of thin air and send it to address require SHRP loader role +func CmdLoadSHRP(ctx client.Context, receiver, amount string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{receiver, amount} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdLoad(), args) +} + +//CmdSendSHR send shr to address from address +func CmdSendSHR(ctx client.Context, receiver, amount string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{receiver, amount} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdSend(), args) +} + +//CmdSendSHRP send shrp to address from address +func CmdSendSHRP(ctx client.Context, receiver, amount string, flags ...string) (testutil.BufferWriter, error) { + var args = []string{receiver, amount} + args = append(args, flags...) + return clitestutil.ExecTestCLICmd(ctx, cli.CmdSend(), args) +} + +//CmdTotalSupply +func CmdTotalSupply(ctx client.Context, flags ...string) (testutil.BufferWriter, error) { + + return clitestutil.ExecTestCLICmd(ctx, cli2.GetCmdQueryTotalSupply(), flags) +} + +func CmdQueryBalance(t *testing.T, ctx client.Context, address sdk.Address, flags ...string) types.QueryAllBalancesResponse { + balRes := types.QueryAllBalancesResponse{} + var args = []string{address.String()} + args = append(args, flags...) + res, err := testutil2.QueryBalancesExec(ctx, address) + if err != nil { + t.Errorf("query balance fail %v", err) + return types.QueryAllBalancesResponse{} + } + + err = ctx.Codec.UnmarshalJSON(res.Bytes(), &balRes) + if err != nil { + t.Errorf("unmarshal balance fail %v", err) + } + return balRes +} diff --git a/x/gentlemint/genesis.go b/x/gentlemint/genesis.go index 665d4d3b..68a814eb 100644 --- a/x/gentlemint/genesis.go +++ b/x/gentlemint/genesis.go @@ -1,112 +1,41 @@ package gentlemint import ( - "encoding/json" - - "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/keeper" "github.com/sharering/shareledger/x/gentlemint/types" ) -type GenesisState struct { - LoaderKeys []string `json:"loader_keys"` - ExchangeRate string `json:"exchange_rate"` - - Authority string `json:"authority"` - Treasurer string `json:"treasurer"` - IdSigners []types.AccState `json:"id_signers"` - DocumentIssuer []types.AccState `json:"document_issuer"` - AccountOperators []types.AccState `json:"account_operators"` -} - -func NewGenesisState() GenesisState { - return GenesisState{} -} - -func ValidateGenesis(data GenesisState) error { - return nil -} - -func DefaultGenesisState() GenesisState { - return GenesisState{} -} - -func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { - for _, loaderKey := range data.LoaderKeys { - keeper.SetSHRPLoaderStatus(ctx, loaderKey, types.StatusSHRPLoaderActived) - } - if data.ExchangeRate != "" { - keeper.SetExchangeRate(ctx, data.ExchangeRate) - } - - keeper.SetAuthorityAccount(ctx, data.Authority) - keeper.SetTreasurerAccount(ctx, data.Treasurer) - - for _, acc := range data.IdSigners { - keeper.SetIdSigner(ctx, acc) +// InitGenesis initializes the capability module's state from a provided genesis +// state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + // Set if defined + if genState.ExchangeRate != nil { + k.SetExchangeRate(ctx, *genState.ExchangeRate) } - - for _, acc := range data.DocumentIssuer { - keeper.SetDocIssuer(ctx, acc) + // Set all the levelFee + for _, elem := range genState.LevelFeeList { + k.SetLevelFee(ctx, elem) } - - for _, acc := range data.AccountOperators { - keeper.SetAccOp(ctx, acc) + // Set all the actionLevelFee + for _, elem := range genState.ActionLevelFeeList { + k.SetActionLevelFee(ctx, elem) } + // this line is used by starport scaffolding # genesis/module/init } -func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState { - var loaderKeys []string - cb := func(loaderKey string, loader types.SHRPLoader) bool { - if loader.Status == types.StatusSHRPLoaderActived { - loaderKeys = append(loaderKeys, loaderKey) - } - return false - } - - var idSigners []types.AccState - idSignerCb := func(idSigner types.AccState) bool { - idSigners = append(idSigners, idSigner) - return false - } - - var issuers []types.AccState - issuerCb := func(issuer types.AccState) bool { - issuers = append(issuers, issuer) - return false - } - - var operators []types.AccState - operatorCb := func(operator types.AccState) bool { - operators = append(operators, operator) - return false - } - - k.IterateSHRPLoaders(ctx, cb) - k.IterateIdSigners(ctx, idSignerCb) - k.IterateDocIssuers(ctx, issuerCb) - k.IterateAccOps(ctx, operatorCb) - - exchangeRate := k.GetExchangeRate(ctx) - authorityAcc := k.GetAuthorityAccount(ctx) - treasurer := k.GetTreasurerAccount(ctx) - - return GenesisState{ - LoaderKeys: loaderKeys, - ExchangeRate: exchangeRate.String(), - Authority: authorityAcc, - Treasurer: treasurer, - IdSigners: idSigners, - DocumentIssuer: issuers, - AccountOperators: operators, - } -} +// ExportGenesis returns the capability module's exported genesis. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() -func GetGenesisStateFromAppState(cdc *codec.Codec, appState map[string]json.RawMessage) GenesisState { - var genesisState GenesisState - if appState[ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) + // Get all exchangeRate + exchangeRate, found := k.GetExchangeRate(ctx) + if found { + genesis.ExchangeRate = &exchangeRate } + genesis.LevelFeeList = k.GetAllLevelFee(ctx) + genesis.ActionLevelFeeList = k.GetAllActionLevelFee(ctx) + // this line is used by starport scaffolding # genesis/module/export - return genesisState + return genesis } diff --git a/x/gentlemint/genesis_test.go b/x/gentlemint/genesis_test.go new file mode 100644 index 00000000..2776151c --- /dev/null +++ b/x/gentlemint/genesis_test.go @@ -0,0 +1,47 @@ +package gentlemint_test + +import ( + "testing" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/gentlemint" + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/stretchr/testify/require" +) + +func TestGenesis(t *testing.T) { + genesisState := types.GenesisState{ + ExchangeRate: &types.ExchangeRate{ + Rate: "200", + }, + LevelFeeList: []types.LevelFee{ + { + Level: "0", + }, + { + Level: "1", + }, + }, + ActionLevelFeeList: []types.ActionLevelFee{ + { + Action: "0", + }, + { + Action: "1", + }, + }, + // this line is used by starport scaffolding # genesis/test/state + } + + k, ctx := keepertest.GentlemintKeeper(t) + gentlemint.InitGenesis(ctx, *k, genesisState) + got := gentlemint.ExportGenesis(ctx, *k) + require.NotNil(t, got) + + require.Equal(t, genesisState.ExchangeRate, got.ExchangeRate) + require.Len(t, got.LevelFeeList, len(genesisState.LevelFeeList)) + require.Subset(t, genesisState.LevelFeeList, got.LevelFeeList) + require.Len(t, got.ActionLevelFeeList, len(genesisState.ActionLevelFeeList)) + require.Subset(t, genesisState.ActionLevelFeeList, got.ActionLevelFeeList) + // this line is used by starport scaffolding # genesis/test/assert +} diff --git a/x/gentlemint/handler.go b/x/gentlemint/handler.go index e5bf4435..bb4a098a 100644 --- a/x/gentlemint/handler.go +++ b/x/gentlemint/handler.go @@ -3,352 +3,54 @@ package gentlemint import ( "fmt" - shareringUtils "github.com/ShareRing/modules/utils" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/gentlemint/keeper" "github.com/sharering/shareledger/x/gentlemint/types" ) -const ( - ShrpLoaderPrefix = "shrploader" -) - -var ( - requiredSHRAmt = shareringUtils.SHRDecimal.Mul(sdk.NewInt(10)) -) +// NewHandler ... +func NewHandler(k keeper.Keeper) sdk.Handler { + msgServer := keeper.NewMsgServerImpl(k) -func NewHandler(keeper Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - switch msg := msg.(type) { - case MsgLoadSHR: - return handleMsgLoadSHR(ctx, keeper, msg) - case MsgLoadSHRP: - return handleMsgLoadSHRP(ctx, keeper, msg) - case MsgSendSHRP: - return handleMsgSendSHRP(ctx, keeper, msg) - case MsgSendSHR: - return handleMsgSendSHR(ctx, keeper, msg) - // case MsgBuyCent: - // return handleMsgBuyCent(ctx, keeper, msg) - case MsgBurnSHRP: - return handleMsgBurnSHRP(ctx, keeper, msg) - case MsgBurnSHR: - return handleMsgBurnSHR(ctx, keeper, msg) - case MsgEnrollSHRPLoader: - return handleMsgEnrollSHRPLoader(ctx, keeper, msg) - case MsgRevokeSHRPLoader: - return handleMsgRevokeSHRPLoader(ctx, keeper, msg) - case MsgBuySHR: - return handleMsgBuySHR(ctx, keeper, msg) - case MsgSetExchange: - return handleMsgSetExchange(ctx, keeper, msg) - case MsgEnrollIDSigners: - return handleMsgEnrollIdSigners(ctx, keeper, msg) - case MsgRevokeIDSigners: - return handleMsgRevokeIdSigners(ctx, keeper, msg) - case MsgEnrollDocIssuers: - return handleMsgEnrollDocummentIssuer(ctx, keeper, msg) - case MsgRevokeDocIssuers: - return handleMsgRevokeDocumentIssuers(ctx, keeper, msg) - case MsgEnrollAccOperators: - return handleMsgEnrollAccountOperator(ctx, keeper, msg) - case MsgRevokeAccOperators: - return handleMsgRevokeAccountOperator(ctx, keeper, msg) + ctx = ctx.WithEventManager(sdk.NewEventManager()) + switch msg := msg.(type) { + case *types.MsgBuyShr: + res, err := msgServer.BuyShr(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgSetExchange: + res, err := msgServer.SetExchange(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgSetLevelFee: + res, err := msgServer.SetLevelFee(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgDeleteLevelFee: + res, err := msgServer.DeleteLevelFee(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgSetActionLevelFee: + res, err := msgServer.SetActionLevelFee(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgDeleteActionLevelFee: + res, err := msgServer.DeleteActionLevelFee(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgLoadFee: + // LoadFee was handled in antee fee. + return sdk.WrapServiceResult(ctx, &types.MsgLoadFeeResponse{}, nil) + case *types.MsgLoad: + res, err := msgServer.Load(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgSend: + res, err := msgServer.Send(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgBurn: + res, err := msgServer.Burn(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + // this line is used by starport scaffolding # 1 default: - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, fmt.Sprintf("Unrecognized gentlemint Msg type: %v", msg.Type())) - } - } -} - -func handleMsgLoadSHR(ctx sdk.Context, keeper Keeper, msg MsgLoadSHR) (*sdk.Result, error) { - if !IsAuthority(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not authority") - } - - amt, _ := sdk.NewIntFromString(msg.Amount) - if !keeper.ShrMintPossible(ctx, amt) { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "SHR possible mint exceeded") - } - coins := sdk.NewCoins(sdk.NewCoin("shr", amt)) - if err := keeper.LoadCoins(ctx, msg.Receiver, coins); err != nil { - return nil, err - } - log := fmt.Sprintf("Successfully loaded shr {address: %s, amount %v}", msg.Receiver.String(), coins) - return &sdk.Result{ - Log: log, - }, nil -} - -// Load SHRP function is used to load the given amount of SHRP to the given recepient -// - Tx fee is 0.01 SHRP -// - Automatically buy 10SHR for the recepient -// - Send 1SHR from recepient to loader as the loading fee -func handleMsgLoadSHRP(ctx sdk.Context, keeper Keeper, msg MsgLoadSHRP) (*sdk.Result, error) { - if !IsSHRPLoader(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not an Enrolled SHRP Loader") - } - // i, d, err := types.ParseCoinStr(msg.Amount) - // if err != nil { - // return nil, err - // } - // shrpAmt := sdk.NewInt(i) - // centAmt := sdk.NewInt(d) - - // amt := sdk.NewCoins(sdk.NewCoin("cent", centAmt), sdk.NewCoin("shrp", shrpAmt)) - // if err := keeper.LoadCoins(ctx, msg.Receiver, amt); err != nil { - // return nil, err - // } - - shrpAmt, _ := sdk.NewIntFromString(msg.Amount) - amt := sdk.NewCoins(sdk.NewCoin("shrp", shrpAmt)) - if err := keeper.LoadCoins(ctx, msg.Receiver, amt); err != nil { - return nil, err - } - - oldCoins := keeper.GetCoins(ctx, msg.Receiver) - oldShr := oldCoins.AmountOf("shr") - // if there is less that 10 shr in the wallet, buy 10 shr - if oldShr.LT(requiredSHRAmt) { - err := keeper.BuyShr(ctx, requiredSHRAmt, msg.Receiver) - if err != nil { - return nil, sdkerrors.Wrap(err, "Can not buy SHR") + errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) + return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } - // return 1 SHR fee spent by the loader - reimbursed := sdk.NewCoin("shr", shareringUtils.OneSHR) - - if err := keeper.SendCoins(ctx, msg.Receiver, msg.Approver, sdk.NewCoins(reimbursed)); err != nil { - return nil, err - } - log := fmt.Sprintf("Successfully load SHRP {amount %s, address: %s}", msg.Amount, msg.Receiver.String()) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgSendSHRP(ctx sdk.Context, keeper Keeper, msg MsgSendSHRP) (*sdk.Result, error) { - // if err := msg.ValidateBasic(); err != nil { - // return nil, err - // } - // i, d, err := types.ParseCoinStr(msg.Amount) - // if err != nil { - // return nil, err - // } - // shrpAmt := sdk.NewInt(i) - // centAmt := sdk.NewInt(d) - // oldCoins := keeper.GetCoins(ctx, msg.Sender) - // if oldCoins.AmountOf("cent").LT(centAmt) { - // if oldCoins.AmountOf("shrp").LTE(shrpAmt) { - // return nil, sdkerrors.ErrInsufficientFunds - // } - // if _, err := keeper.SubtractCoins(ctx, msg.Sender, sdk.NewCoins(sdk.NewCoin("shrp", sdk.NewInt(int64(1))))); err != nil { - // return nil, err - // } - // if _, err := keeper.AddCoins(ctx, msg.Sender, sdk.NewCoins(sdk.NewCoin("cent", sdk.NewInt(int64(100))))); err != nil { - // return nil, err - // } - // if err := keeper.SupplyBurnCoins(ctx, sdk.NewCoins(sdk.NewCoin("shrp", sdk.NewInt(int64(1))))); err != nil { - // return nil, err - // } - // if err := keeper.SupplyMintCoins(ctx, sdk.NewCoins(sdk.NewCoin("cent", sdk.NewInt(int64(100))))); err != nil { - // return nil, err - // } - // } - shrpAmt, _ := sdk.NewIntFromString(msg.Amount) - amt := sdk.NewCoins(sdk.NewCoin("shrp", shrpAmt)) - if err := keeper.SendCoins(ctx, msg.Sender, msg.Receiver, amt); err != nil { - return nil, err - } - log := fmt.Sprintf("Successfully Send SHRP {amount %s, from: %s, to: %s}", msg.Amount, msg.Sender.String(), msg.Receiver.String()) - return &sdk.Result{ - Log: log, - }, nil -} - -// Automatically buy SHR using SHRP if the SHR balane is not enough -func handleMsgSendSHR(ctx sdk.Context, keeper Keeper, msg MsgSendSHR) (*sdk.Result, error) { - // if err := msg.ValidateBasic(); err != nil { - // return nil, err - // } - // shrAmt := sdk.NewInt(int64(msg.Amount)) - shrAmt, _ := sdk.NewIntFromString(msg.Amount) - oldCoins := keeper.GetCoins(ctx, msg.Sender) - if oldCoins.AmountOf("shr").LT(shrAmt) { - shrToBuy := oldCoins.AmountOf("shr").Sub(shrAmt) - if err := keeper.BuyShr(ctx, shrToBuy, msg.Sender); err != nil { - return nil, err - } - } - amt := sdk.NewCoins(sdk.NewCoin("shr", shrAmt)) - if err := keeper.SendCoins(ctx, msg.Sender, msg.Receiver, amt); err != nil { - return nil, err - } - log := fmt.Sprintf("Successfully Send SHR {amount %d, from: %s, to: %s}", msg.Amount, msg.Sender.String(), msg.Receiver.String()) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgBuyCent(ctx sdk.Context, keeper Keeper, msg MsgBuyCent) (*sdk.Result, error) { - err := msg.ValidateBasic() - if err != nil { - return nil, err - } - shrpAmt := sdk.NewInt(int64(msg.Amount)) - shrpCoins := sdk.NewCoins(sdk.NewCoin("shrp", shrpAmt)) - centAmt := sdk.NewInt(int64(msg.Amount * 100)) - centCoins := sdk.NewCoins(sdk.NewCoin("cent", centAmt)) - _, err = keeper.SubtractCoins(ctx, msg.Buyer, shrpCoins) - if err != nil { - return nil, err - } - _, err = keeper.AddCoins(ctx, msg.Buyer, centCoins) - if err != nil { - return nil, err - } - err = keeper.SupplyBurnCoins(ctx, shrpCoins) - if err != nil { - return nil, err - } - err = keeper.SupplyMintCoins(ctx, centCoins) - if err != nil { - return nil, err - } - log := fmt.Sprintf("Successfull exchange %d shrp to cent for address %s", msg.Amount, msg.Buyer.String()) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgBuySHR(ctx sdk.Context, keeper Keeper, msg MsgBuySHR) (*sdk.Result, error) { - shrAmt, _ := sdk.NewIntFromString(msg.Amount) - - if err := keeper.BuyShr(ctx, shrAmt, msg.Buyer); err != nil { - return nil, err - } - - log := fmt.Sprintf("Successfull buy %d shr for address %s", msg.Amount, msg.Buyer.String()) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgBurnSHRP(ctx sdk.Context, keeper Keeper, msg MsgBurnSHRP) (*sdk.Result, error) { - if !IsTreasurer(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not Treasurer") - } - // i, d, err := ParseCoinStr(msg.Amount) - // if err != nil { - // return nil, err - // } - - // shrpAmt := sdk.NewInt(i) - // centAmt := sdk.NewInt(d) - // amt := sdk.NewCoins(sdk.NewCoin("cent", centAmt), sdk.NewCoin("shrp", shrpAmt)) - shrpAmt, _ := sdk.NewIntFromString(msg.Amount) - amt := sdk.NewCoins(sdk.NewCoin("shrp", shrpAmt)) - if err := keeper.BurnCoins(ctx, msg.Approver, amt); err != nil { - return nil, err - } - log := fmt.Sprintf("Successfully burn coins %s", msg.Amount) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgBurnSHR(ctx sdk.Context, keeper Keeper, msg MsgBurnSHR) (*sdk.Result, error) { - if !IsTreasurer(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not Treasurer") - } - // if err := msg.ValidateBasic(); err != nil { - // return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, err.Error()) - // } - shrAmt, _ := sdk.NewIntFromString(msg.Amount) - amt := sdk.NewCoins(sdk.NewCoin("shr", shrAmt)) - if err := keeper.BurnCoins(ctx, msg.Approver, amt); err != nil { - return nil, err - } - log := fmt.Sprintf("Successfully burn %d shr", msg.Amount) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgEnrollSHRPLoader(ctx sdk.Context, keeper Keeper, msg MsgEnrollSHRPLoader) (*sdk.Result, error) { - if !IsAuthority(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not authority") - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - log := "SHRP loaders' addresses: " - loaderAllowance := sdk.NewCoins(sdk.NewCoin("shr", sdk.NewInt(int64(20)))) - for _, addr := range msg.SHRPLoaders { - log = log + "," + addr.String() - loaderKey := fmt.Sprintf("%s%s", ShrpLoaderPrefix, addr.String()) - keeper.SetSHRPLoaderStatus(ctx, loaderKey, types.StatusSHRPLoaderActived) - if err := keeper.LoadCoins(ctx, addr, loaderAllowance); err != nil { - return nil, err - } - } - log = fmt.Sprintf("Successfully enroll SHRP loader %s", log) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgRevokeSHRPLoader(ctx sdk.Context, keeper Keeper, msg MsgRevokeSHRPLoader) (*sdk.Result, error) { - if !IsAuthority(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Approver's Address is not authority") - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - log := "SHRP loaders' addresses: " - for _, addr := range msg.SHRPLoaders { - log = log + "," + addr.String() - loaderKey := fmt.Sprintf("%s%s", ShrpLoaderPrefix, addr.String()) - keeper.SetSHRPLoaderStatus(ctx, loaderKey, types.StatusSHRPLoaderInactived) - } - log = fmt.Sprintf("Successfully revoke SHRP loader %s", log) - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgSetExchange(ctx sdk.Context, k Keeper, msg MsgSetExchange) (*sdk.Result, error) { - if !IsTreasurer(ctx, msg.Approver, k) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Only treasurer can set exchange rate") - } - k.SetExchangeRate(ctx, msg.Rate) - return &sdk.Result{ - Log: fmt.Sprintf("Successfully set exchange rate as %s", msg.Rate), - }, nil -} - -func IsAuthority(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - authority := k.GetAuthorityAccount(ctx) - if authority == address.String() { - return true - } - - return false -} - -func IsTreasurer(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - treasurer := k.GetTreasurerAccount(ctx) - - if treasurer == address.String() { - return true - } - return false -} - -func IsSHRPLoader(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - addr := ShrpLoaderPrefix + address.String() - status := k.GetSHRPLoaderStatus(ctx, addr) - return status == types.StatusSHRPLoaderActived } diff --git a/x/gentlemint/handler_account_operator.go b/x/gentlemint/handler_account_operator.go deleted file mode 100644 index 5f55e3fa..00000000 --- a/x/gentlemint/handler_account_operator.go +++ /dev/null @@ -1,106 +0,0 @@ -package gentlemint - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/gentlemint/types" -) - -func handleMsgEnrollAccountOperator(ctx sdk.Context, keeper Keeper, msg types.MsgEnrollAccOperators) (*sdk.Result, error) { - if err := checkAuthority(ctx, msg.GetSigners()[0], keeper); err != nil { - return nil, err - } - - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - event := sdk.NewEvent( - types.EventTypeEnrollAccOp, - ) - - for _, addr := range msg.Operators { - acc := types.NewAccState(addr, types.Active) - keeper.SetAccOp(ctx, acc) - event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) - - } - // Emit event - ctx.EventManager().EmitEvent(event) - ctx.EventManager().EmitEvent( - sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - // sdk.NewAttribute(sdk.AttributeKeySender, msg.Approver.String()), - // sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeEnrollAccOp), - ), - ) - - return &sdk.Result{ - Events: ctx.EventManager().Events(), - }, nil -} - -func handleMsgRevokeAccountOperator(ctx sdk.Context, keeper Keeper, msg types.MsgRevokeAccOperators) (*sdk.Result, error) { - if err := checkAuthority(ctx, msg.GetSigners()[0], keeper); err != nil { - return nil, err - } - - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - event := sdk.NewEvent(types.EventTypeRevokeAccOp) - - // Only deactivate active accounts - for _, addr := range msg.Operators { - acc := keeper.GetAccOp(ctx, addr) - if acc.Status != types.Active { - return nil, types.ErrDoesNotExist - } - - acc.Status = types.Inactive - keeper.SetAccOp(ctx, acc) - - event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) - } - - // Emit event - ctx.EventManager().EmitEvent(event) - ctx.EventManager().EmitEvent( - sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(sdk.AttributeKeySender, msg.Approver.String()), - sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeRevokeAccOp), - ), - ) - - return &sdk.Result{ - Events: ctx.EventManager().Events(), - }, nil -} - -func IsAccountOperator(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - - acc := k.GetAccOp(ctx, address) - if acc.Status != types.Active { - return false - } - - return true -} - -func checkAuthority(ctx sdk.Context, address sdk.AccAddress, k Keeper) error { - if !IsAuthority(ctx, address, k) { - return sdkerrors.Wrap(sdkerrors.ErrUnauthorized, types.ErrSenderIsNotAuthority) - } - return nil -} - -func CheckAccountOperator(ctx sdk.Context, address sdk.AccAddress, k Keeper) error { - if !IsAccountOperator(ctx, address, k) { - return sdkerrors.Wrap(sdkerrors.ErrUnauthorized, types.ErrSenderIsNotAccountOperator) - } - return nil -} diff --git a/x/gentlemint/handler_document_issuer.go b/x/gentlemint/handler_document_issuer.go deleted file mode 100644 index 34619862..00000000 --- a/x/gentlemint/handler_document_issuer.go +++ /dev/null @@ -1,88 +0,0 @@ -package gentlemint - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gentlemint/types" -) - -func handleMsgEnrollDocummentIssuer(ctx sdk.Context, keeper Keeper, msg types.MsgEnrollDocIssuers) (*sdk.Result, error) { - if err := CheckAccountOperator(ctx, msg.GetSigners()[0], keeper); err != nil { - return nil, err - } - - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - event := sdk.NewEvent(types.EventTypeEnrollDocIssuer) - - for _, addr := range msg.Issuers { - acc := types.NewAccState(addr, types.Active) - keeper.SetDocIssuer(ctx, acc) - event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) - } - - // Emit event - ctx.EventManager().EmitEvent(event) - ctx.EventManager().EmitEvent( - sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(sdk.AttributeKeySender, msg.Approver.String()), - sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeEnrollDocIssuer), - ), - ) - - return &sdk.Result{ - Events: ctx.EventManager().Events(), - }, nil -} - -func handleMsgRevokeDocumentIssuers(ctx sdk.Context, keeper Keeper, msg types.MsgRevokeDocIssuers) (*sdk.Result, error) { - if err := CheckAccountOperator(ctx, msg.GetSigners()[0], keeper); err != nil { - return nil, err - } - - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - event := sdk.NewEvent(types.EventTypeRevokeDocIssuer) - - for _, addr := range msg.Issuers { - acc := keeper.GetDocIssuer(ctx, addr) - if acc.Status != types.Active { - return nil, types.ErrDoesNotExist - } - - acc.Status = types.Inactive - keeper.SetDocIssuer(ctx, acc) - - event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) - } - - // Emit event - ctx.EventManager().EmitEvent(event) - ctx.EventManager().EmitEvent( - sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(sdk.AttributeKeySender, msg.Approver.String()), - sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeRevokeDocIssuer), - ), - ) - - return &sdk.Result{ - Events: ctx.EventManager().Events(), - }, nil -} - -func IsDocIssuer(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - - acc := k.GetDocIssuer(ctx, address) - if acc.Status != types.Active { - return false - } - - return true -} diff --git a/x/gentlemint/handler_id_signer.go b/x/gentlemint/handler_id_signer.go deleted file mode 100644 index d94f9a93..00000000 --- a/x/gentlemint/handler_id_signer.go +++ /dev/null @@ -1,90 +0,0 @@ -package gentlemint - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/gentlemint/types" -) - -func handleMsgEnrollIdSigners(ctx sdk.Context, keeper Keeper, msg MsgEnrollIDSigners) (*sdk.Result, error) { - if err := CheckAccountOperator(ctx, msg.GetSigners()[0], keeper); err != nil { - return nil, err - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - event := sdk.NewEvent(types.EventTypeEnrollIdSigner) - for _, addr := range msg.IDSigners { - idSigner := types.NewAccState(addr, types.Active) - keeper.SetIdSigner(ctx, idSigner) - event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) - } - - // Emit event - ctx.EventManager().EmitEvent(event) - ctx.EventManager().EmitEvent( - sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(sdk.AttributeKeySender, msg.Approver.String()), - sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeEnrollIdSigner), - ), - ) - return &sdk.Result{ - Events: ctx.EventManager().Events(), - }, nil -} - -func handleMsgRevokeIdSigners(ctx sdk.Context, keeper Keeper, msg MsgRevokeIDSigners) (*sdk.Result, error) { - if err := CheckAccountOperator(ctx, msg.GetSigners()[0], keeper); err != nil { - return nil, err - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - - event := sdk.NewEvent(types.EventTypeRevokeIdSigner) - for _, addr := range msg.IDSigners { - acc := keeper.GetIdSigner(ctx, addr) - if acc.Status != types.Active { - return nil, types.ErrDoesNotExist - } - - acc.Status = types.Inactive - keeper.SetIdSigner(ctx, acc) - - event = event.AppendAttributes(sdk.NewAttribute(types.EventAttrAddress, addr.String())) - } - - // Emit event - ctx.EventManager().EmitEvent(event) - ctx.EventManager().EmitEvent( - sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(sdk.AttributeKeySender, msg.Approver.String()), - sdk.NewAttribute(sdk.AttributeKeyAction, types.EventTypeRevokeIdSigner), - ), - ) - return &sdk.Result{ - Events: ctx.EventManager().Events(), - }, nil -} - -func IsIdSigner(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - - idSigner := k.GetIdSigner(ctx, address) - if idSigner.Status != types.Active { - return false - } - - return true -} - -func checkIdSigner(ctx sdk.Context, address sdk.AccAddress, k Keeper) error { - if !IsIdSigner(ctx, address, k) { - return sdkerrors.Wrap(sdkerrors.ErrUnauthorized, types.ErrSenderIsNotIssuer) - } - return nil -} diff --git a/x/gentlemint/keeper/action_level_fee.go b/x/gentlemint/keeper/action_level_fee.go new file mode 100644 index 00000000..00a48ff1 --- /dev/null +++ b/x/gentlemint/keeper/action_level_fee.go @@ -0,0 +1,63 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +// SetActionLevelFee set a specific actionLevelFee in the store from its index +func (k Keeper) SetActionLevelFee(ctx sdk.Context, actionLevelFee types.ActionLevelFee) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.ActionLevelFeeKeyPrefix)) + b := k.cdc.MustMarshal(&actionLevelFee) + store.Set(types.ActionLevelFeeKey( + actionLevelFee.Action, + ), b) +} + +// GetActionLevelFee returns a actionLevelFee from its index +func (k Keeper) GetActionLevelFee( + ctx sdk.Context, + action string, + +) (val types.ActionLevelFee, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.ActionLevelFeeKeyPrefix)) + + b := store.Get(types.ActionLevelFeeKey( + action, + )) + if b == nil { + return val, false + } + + k.cdc.MustUnmarshal(b, &val) + return val, true +} + +// RemoveActionLevelFee removes a actionLevelFee from the store +func (k Keeper) RemoveActionLevelFee( + ctx sdk.Context, + action string, + +) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.ActionLevelFeeKeyPrefix)) + store.Delete(types.ActionLevelFeeKey( + action, + )) +} + +// GetAllActionLevelFee returns all actionLevelFee +func (k Keeper) GetAllActionLevelFee(ctx sdk.Context) (list []types.ActionLevelFee) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.ActionLevelFeeKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var val types.ActionLevelFee + k.cdc.MustUnmarshal(iterator.Value(), &val) + list = append(list, val) + } + + return +} diff --git a/x/gentlemint/keeper/action_level_fee_test.go b/x/gentlemint/keeper/action_level_fee_test.go new file mode 100644 index 00000000..5e0d4d7b --- /dev/null +++ b/x/gentlemint/keeper/action_level_fee_test.go @@ -0,0 +1,56 @@ +package keeper_test + +import ( + "strconv" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/gentlemint/keeper" + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/stretchr/testify/require" +) + +// Prevent strconv unused error +var _ = strconv.IntSize + +func createNActionLevelFee(keeper *keeper.Keeper, ctx sdk.Context, n int) []types.ActionLevelFee { + items := make([]types.ActionLevelFee, n) + for i := range items { + items[i].Action = strconv.Itoa(i) + + keeper.SetActionLevelFee(ctx, items[i]) + } + return items +} + +func TestActionLevelFeeGet(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + items := createNActionLevelFee(keeper, ctx, 10) + for _, item := range items { + rst, found := keeper.GetActionLevelFee(ctx, + item.Action, + ) + require.True(t, found) + require.Equal(t, item, rst) + } +} +func TestActionLevelFeeRemove(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + items := createNActionLevelFee(keeper, ctx, 10) + for _, item := range items { + keeper.RemoveActionLevelFee(ctx, + item.Action, + ) + _, found := keeper.GetActionLevelFee(ctx, + item.Action, + ) + require.False(t, found) + } +} + +func TestActionLevelFeeGetAll(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + items := createNActionLevelFee(keeper, ctx, 10) + require.ElementsMatch(t, items, keeper.GetAllActionLevelFee(ctx)) +} diff --git a/x/gentlemint/keeper/exchange_rate.go b/x/gentlemint/keeper/exchange_rate.go new file mode 100644 index 00000000..c36a6b1e --- /dev/null +++ b/x/gentlemint/keeper/exchange_rate.go @@ -0,0 +1,41 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func (k Keeper) GetExchangeRateD(ctx sdk.Context) sdk.Dec { + v, found := k.GetExchangeRate(ctx) + if !found { + return types.DefaultExchangeRateSHRPToSHR + } + return sdk.MustNewDecFromStr(v.Rate) +} + +// SetExchangeRate set exchangeRate in the store +func (k Keeper) SetExchangeRate(ctx sdk.Context, exchangeRate types.ExchangeRate) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.ExchangeRateKey)) + b := k.cdc.MustMarshal(&exchangeRate) + store.Set([]byte{0}, b) +} + +// GetExchangeRate returns exchangeRate +func (k Keeper) GetExchangeRate(ctx sdk.Context) (val types.ExchangeRate, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.ExchangeRateKey)) + b := store.Get([]byte{0}) + + val = types.ExchangeRate{Rate: types.DefaultExchangeRateSHRPToSHR.String()} + + if b != nil { + k.cdc.MustUnmarshal(b, &val) + } + return val, true +} + +// RemoveExchangeRate removes exchangeRate from the store +func (k Keeper) RemoveExchangeRate(ctx sdk.Context) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.ExchangeRateKey)) + store.Delete([]byte{0}) +} diff --git a/x/gentlemint/keeper/exchange_rate_test.go b/x/gentlemint/keeper/exchange_rate_test.go new file mode 100644 index 00000000..15192a25 --- /dev/null +++ b/x/gentlemint/keeper/exchange_rate_test.go @@ -0,0 +1,36 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/gentlemint/keeper" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func createTestExchangeRate(keeper *keeper.Keeper, ctx sdk.Context) types.ExchangeRate { + item := types.ExchangeRate{ + Rate: "200.1", + } + keeper.SetExchangeRate(ctx, item) + return item +} + +func TestExchangeRateGet(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + item := createTestExchangeRate(keeper, ctx) + rst, found := keeper.GetExchangeRate(ctx) + require.True(t, found) + require.Equal(t, item, rst) +} +func TestExchangeRateRemove(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + createTestExchangeRate(keeper, ctx) + keeper.RemoveExchangeRate(ctx) + v, found := keeper.GetExchangeRate(ctx) + require.True(t, found) + require.Equal(t, types.DefaultExchangeRateSHRPToSHR, sdk.MustNewDecFromStr(v.Rate)) +} diff --git a/x/gentlemint/keeper/fee.go b/x/gentlemint/keeper/fee.go new file mode 100644 index 00000000..ae05e54c --- /dev/null +++ b/x/gentlemint/keeper/fee.go @@ -0,0 +1,71 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/constant" + "github.com/sharering/shareledger/x/fee" + "github.com/sharering/shareledger/x/gentlemint/types" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +func (k Keeper) GetBaseFeeByMsg(ctx sdk.Context, msg sdk.Msg) (sdk.Coin, error) { + feeD := k.GetFeeByMsg(ctx, msg) + usdRate := k.GetExchangeRateD(ctx) + return denom.NormalizeToBaseCoin(denom.Base, sdk.NewDecCoins(feeD), usdRate, true) +} +func (k Keeper) GetBaseDenomFeeByActionKey(ctx sdk.Context, action string) (sdk.Coin, error) { + feeD := k.GetFeeByAction(ctx, action) + usdRate := k.GetExchangeRateD(ctx) + return denom.NormalizeToBaseCoin(denom.Base, sdk.NewDecCoins(feeD), usdRate, true) +} + +func (k Keeper) LoadFeeFundFromShrp(ctx sdk.Context, msg *types.MsgLoadFee) error { + if msg.Shrp == nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "shrp is nil") + } + rate := k.GetExchangeRateD(ctx) + + boughtBase, err := denom.NormalizeToBaseCoin(denom.Base, sdk.NewDecCoins(*msg.Shrp), rate, false) + if err != nil { + return err + } + if err := k.buyBaseDenom(ctx, boughtBase, msg.GetSigners()[0]); err != nil { + return sdkerrors.Wrapf(err, "buy shr, %v, by usd, %v", boughtBase.String(), msg.Shrp.String()) + } + return nil +} + +// GetFeeByMsg return fee based on message +// return min fee if msg not found +func (k Keeper) GetFeeByMsg(ctx sdk.Context, msg sdk.Msg) sdk.DecCoin { + return k.GetFeeByAction(ctx, fee.GetActionKey(msg)) +} + +// GetFeeByAction return fee based on action +// return min fee if not found +func (k Keeper) GetFeeByAction(ctx sdk.Context, action string) sdk.DecCoin { + level := string(constant.MinFee) + if fee.IsSpecialActionKey(action) { + level = string(constant.NoFee) + } + if len(action) == 0 { + return k.GetFeeByLevel(ctx, level) + } + + m, found := k.GetActionLevelFee(ctx, action) + if found { + level = m.Level + } + return k.GetFeeByLevel(ctx, level) +} + +// GetFeeByLevel get fee by level +// return min fee if not found +func (k Keeper) GetFeeByLevel(ctx sdk.Context, level string) sdk.DecCoin { + levelCost, found := k.GetLevelFee(ctx, level) + if !found { + return constant.DefaultFeeLevel[constant.MinFee] + } + return levelCost.Fee +} diff --git a/x/gentlemint/keeper/grpc_query.go b/x/gentlemint/keeper/grpc_query.go new file mode 100644 index 00000000..2a9685fa --- /dev/null +++ b/x/gentlemint/keeper/grpc_query.go @@ -0,0 +1,7 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/gentlemint/types" +) + +var _ types.QueryServer = Keeper{} diff --git a/x/gentlemint/keeper/grpc_query_action_level_fees.go b/x/gentlemint/keeper/grpc_query_action_level_fees.go new file mode 100644 index 00000000..044f861c --- /dev/null +++ b/x/gentlemint/keeper/grpc_query_action_level_fees.go @@ -0,0 +1,67 @@ +package keeper + +import ( + "context" + "github.com/sharering/shareledger/x/constant" + "github.com/sharering/shareledger/x/fee" + "sort" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) ActionLevelFees(c context.Context, req *types.QueryActionLevelFeesRequest) (*types.QueryActionLevelFeesResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(c) + actionFees := k.GetAllActionLevelFee(ctx) + actionsDefaultLevels := fee.GetListActionsWithDefaultLevel() + + actionLevelFees := make([]types.ActionLevelFee, 0, len(actionsDefaultLevels)) + for _, a := range actionFees { + actionLevelFees = append(actionLevelFees, types.ActionLevelFee{ + Action: a.Action, + Level: a.Level, + Creator: a.Creator, + }) + delete(actionsDefaultLevels, a.Action) + } + for a, l := range actionsDefaultLevels { + actionLevelFees = append(actionLevelFees, types.ActionLevelFee{ + Action: a, + Level: l, + }) + } + sort.Slice(actionLevelFees, func(i, j int) bool { + return actionLevelFees[i].Action < actionLevelFees[j].Action + }) + + return &types.QueryActionLevelFeesResponse{ActionLevelFee: actionLevelFees}, nil +} + +func (k Keeper) ActionLevelFee(c context.Context, req *types.QueryActionLevelFeeRequest) (*types.QueryActionLevelFeeResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(c) + + defaultLevel := string(constant.MinFee) + + val, found := k.GetActionLevelFee( + ctx, + req.Action, + ) + if found { + defaultLevel = val.Level + } + + return &types.QueryActionLevelFeeResponse{ + Action: req.Action, + Level: defaultLevel, + Fee: k.GetFeeByLevel(ctx, defaultLevel).String(), + }, nil +} diff --git a/x/gentlemint/keeper/grpc_query_balances.go b/x/gentlemint/keeper/grpc_query_balances.go new file mode 100644 index 00000000..1c571fdd --- /dev/null +++ b/x/gentlemint/keeper/grpc_query_balances.go @@ -0,0 +1,35 @@ +package keeper + +import ( + "context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" + denom "github.com/sharering/shareledger/x/utils/demo" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) Balances(goCtx context.Context, req *types.QueryBalancesRequest) (*types.QueryBalancesResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + addr, err := sdk.AccAddressFromBech32(req.GetAddress()) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "invalid address %v", err) + } + ctx := sdk.UnwrapSDKContext(goCtx) + currentBalances := k.bankKeeper.GetAllBalances(ctx, addr) + displayCoins := denom.ToDisplayCoins(currentBalances) + r := &types.QueryBalancesResponse{ + Coins: make([]*sdk.DecCoin, 0, displayCoins.Len()), + } + for _, c := range displayCoins { + r.Coins = append(r.Coins, &sdk.DecCoin{ + Denom: c.Denom, + Amount: c.Amount, + }) + } + + return r, nil +} diff --git a/x/gentlemint/keeper/grpc_query_check_fees.go b/x/gentlemint/keeper/grpc_query_check_fees.go new file mode 100644 index 00000000..2f3bb718 --- /dev/null +++ b/x/gentlemint/keeper/grpc_query_check_fees.go @@ -0,0 +1,64 @@ +package keeper + +import ( + "context" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) CheckFees(goCtx context.Context, req *types.QueryCheckFeesRequest) (*types.QueryCheckFeesResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + addr, err := sdk.AccAddressFromBech32(req.Address) + if err != nil { + return nil, status.Error(codes.InvalidArgument, "invalid address") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + var result types.QueryCheckFeesResponse + + fee := sdk.NewCoin(denom.Base, sdk.NewInt(0)) + for _, a := range req.Actions { + af, err := k.GetBaseDenomFeeByActionKey(ctx, a) + if err != nil { + return nil, sdkerrors.Wrapf(err, "get %v fee by action %v", denom.Base, a) + } + fee = fee.Add(af) + } + result.ConvertedFee = &fee + + currentBalances := k.bankKeeper.GetAllBalances(ctx, addr) + currentShr := sdk.NewCoin(denom.Base, currentBalances.AmountOf(denom.Base)) + result.SufficientFee = currentShr.IsGTE(fee) + result.SufficientFundForFee = result.SufficientFee // sufficient fee is true, sufficient fund for fee will be true by default + if !result.SufficientFee { + rate := k.GetExchangeRateD(ctx) + calculatedBaseDenomFromShrpFund, err := denom.NormalizeToBaseCoin(denom.Base, + sdk.NewDecCoinsFromCoins(sdk.NewCoins( + sdk.NewCoin(denom.ShrP, currentBalances.AmountOf(denom.ShrP)), + sdk.NewCoin(denom.BaseUSD, currentBalances.AmountOf(denom.BaseUSD)), + )...), rate, true) + if err != nil { + return nil, sdkerrors.Wrapf(err, "calculate %v from %v fund %v", denom.Base, denom.ShrP, currentBalances) + } + // Should check for the whole not partial fee to avoid a case that: + // User have enough token to send out but not enough fee. So we need to buy whole fee token to let user be able to send out their current balance. + result.SufficientFundForFee = calculatedBaseDenomFromShrpFund.IsGTE(fee) + + if result.SufficientFundForFee { + dC, err := denom.To(sdk.NewDecCoinsFromCoins(fee), denom.ShrP, rate) + if err != nil { + return nil, sdkerrors.Wrapf(err, "convert fee,%v, to usd", fee) + } + result.CostLoadingFee = &dC + } + } + + return &result, nil +} diff --git a/x/gentlemint/keeper/grpc_query_exchange_rate.go b/x/gentlemint/keeper/grpc_query_exchange_rate.go new file mode 100644 index 00000000..252427c9 --- /dev/null +++ b/x/gentlemint/keeper/grpc_query_exchange_rate.go @@ -0,0 +1,24 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) ExchangeRate(c context.Context, req *types.QueryExchangeRateRequest) (*types.QueryExchangeRateResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(c) + + val, found := k.GetExchangeRate(ctx) + if !found { + return nil, status.Error(codes.InvalidArgument, "not found") + } + + return &types.QueryExchangeRateResponse{Rate: val.Rate}, nil +} diff --git a/x/gentlemint/keeper/grpc_query_exchange_rate_test.go b/x/gentlemint/keeper/grpc_query_exchange_rate_test.go new file mode 100644 index 00000000..239d9315 --- /dev/null +++ b/x/gentlemint/keeper/grpc_query_exchange_rate_test.go @@ -0,0 +1,44 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func TestExchangeRateQuery(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + wctx := sdk.WrapSDKContext(ctx) + item := createTestExchangeRate(keeper, ctx) + for _, tc := range []struct { + desc string + request *types.QueryExchangeRateRequest + response *types.QueryExchangeRateResponse + err error + }{ + { + desc: "First", + request: &types.QueryExchangeRateRequest{}, + response: &types.QueryExchangeRateResponse{Rate: item.Rate}, + }, + { + desc: "InvalidRequest", + err: status.Error(codes.InvalidArgument, "invalid request"), + }, + } { + t.Run(tc.desc, func(t *testing.T) { + response, err := keeper.ExchangeRate(wctx, tc.request) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.Equal(t, sdk.MustNewDecFromStr(tc.response.Rate), sdk.MustNewDecFromStr(response.Rate)) + } + }) + } +} diff --git a/x/gentlemint/keeper/grpc_query_level_fees.go b/x/gentlemint/keeper/grpc_query_level_fees.go new file mode 100644 index 00000000..e4a8cd66 --- /dev/null +++ b/x/gentlemint/keeper/grpc_query_level_fees.go @@ -0,0 +1,87 @@ +package keeper + +import ( + "context" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/constant" + denom "github.com/sharering/shareledger/x/utils/demo" + "sort" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) LevelFees(c context.Context, req *types.QueryLevelFeesRequest) (*types.QueryLevelFeesResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(c) + defaultsLevelFees := constant.DefaultFeeLevel + storedLevelFees := k.GetAllLevelFee(ctx) + levelFees := make([]types.LevelFeeDetail, 0, len(defaultsLevelFees)+len(storedLevelFees)) + exchangeRate := k.GetExchangeRateD(ctx) + + for _, lf := range storedLevelFees { + convertedFee, err := denom.NormalizeToBaseCoin(denom.Base, sdk.NewDecCoins(lf.Fee), exchangeRate, true) + if err != nil { + return nil, err + } + levelFees = append(levelFees, types.LevelFeeDetail{ + Level: lf.Level, + OriginalFee: lf.Fee, + ConvertedFee: &convertedFee, + Creator: lf.Creator, + }) + delete(defaultsLevelFees, constant.DefaultLevel(lf.Level)) + } + for l, f := range defaultsLevelFees { + decCoins := sdk.NewDecCoins(f) + + convertedFee, err := denom.NormalizeToBaseCoin(denom.Base, decCoins, exchangeRate, true) + if err != nil { + return nil, err + } + + levelFees = append(levelFees, types.LevelFeeDetail{ + Level: string(l), + OriginalFee: f, + ConvertedFee: &convertedFee, + }) + } + sort.Slice(levelFees, func(i, j int) bool { + return levelFees[i].Level < levelFees[j].Level + }) + + return &types.QueryLevelFeesResponse{LevelFees: levelFees}, nil +} + +func (k Keeper) LevelFee(c context.Context, req *types.QueryLevelFeeRequest) (*types.QueryLevelFeeResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(c) + + val, found := k.GetLevelFee( + ctx, + req.Level, + ) + usdRate := k.GetExchangeRateD(ctx) + convertedFee, err := denom.NormalizeToBaseCoin(denom.Base, sdk.NewDecCoins(val.Fee), usdRate, true) + if err != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrLogic, err.Error()) + } + resp := types.LevelFeeDetail{ + Level: req.Level, + Creator: val.Creator, + OriginalFee: val.Fee, + ConvertedFee: &convertedFee, + } + if !found { + return nil, status.Error(codes.InvalidArgument, "not found") + } + + return &types.QueryLevelFeeResponse{LevelFee: resp}, nil +} diff --git a/x/gentlemint/keeper/grpc_query_level_fees_test.go b/x/gentlemint/keeper/grpc_query_level_fees_test.go new file mode 100644 index 00000000..7debfa8b --- /dev/null +++ b/x/gentlemint/keeper/grpc_query_level_fees_test.go @@ -0,0 +1,64 @@ +package keeper_test + +import ( + "strconv" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +// Prevent strconv unused error +var _ = strconv.IntSize + +func TestLevelFeeQuerySingle(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + wctx := sdk.WrapSDKContext(ctx) + msgs := createNLevelFee(keeper, ctx, 2) + for _, tc := range []struct { + desc string + request *types.QueryLevelFeeRequest + response *types.QueryLevelFeeResponse + err error + }{ + { + desc: "First", + request: &types.QueryLevelFeeRequest{ + Level: msgs[0].Level, + }, + response: &types.QueryLevelFeeResponse{}, //LevelFee: msgs[0]}, + }, + { + desc: "Second", + request: &types.QueryLevelFeeRequest{ + Level: msgs[1].Level, + }, + response: &types.QueryLevelFeeResponse{}, //LevelFee: msgs[1] + }, + { + desc: "KeyNotFound", + request: &types.QueryLevelFeeRequest{ + Level: strconv.Itoa(100000), + }, + err: status.Error(codes.InvalidArgument, "not found"), + }, + { + desc: "InvalidRequest", + err: status.Error(codes.InvalidArgument, "invalid request"), + }, + } { + t.Run(tc.desc, func(t *testing.T) { + response, err := keeper.LevelFee(wctx, tc.request) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.Equal(t, tc.response, response) + } + }) + } +} diff --git a/x/gentlemint/keeper/keeper.go b/x/gentlemint/keeper/keeper.go index 2f9685f3..34e425c0 100644 --- a/x/gentlemint/keeper/keeper.go +++ b/x/gentlemint/keeper/keeper.go @@ -2,361 +2,110 @@ package keeper import ( "fmt" + denom "github.com/sharering/shareledger/x/utils/demo" + + "github.com/tendermint/tendermint/libs/log" - myutil "github.com/ShareRing/modules/utils" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/sharering/shareledger/x/gentlemint/types" - - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/supply" ) -const ( - ExchangeRateKey = "exchange_shrp_to_shr" +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey sdk.StoreKey + memKey sdk.StoreKey - ShrpToCentRate = 100 - AuthorityKey = "A" - TreasurerKey = "T" - IdSignerKey = "IDS" - DocIssuerKey = "DOCIS" - AccOpKey = "ACCOP" + bankKeeper types.BankKeeper + accountKeeper types.AccountKeeper + } ) -var ( - DefaultExchangeRate = sdk.NewInt(200) - MaxSHRSupply = sdk.NewInt(4396000000).Mul(myutil.SHRDecimal) -) +func NewKeeper( + cdc codec.BinaryCodec, + storeKey, + memKey sdk.StoreKey, -type Keeper struct { - accountKeeper auth.AccountKeeper - supplyKeeper supply.Keeper - bankKeeper bank.Keeper - storeKey sdk.StoreKey - cdc *codec.Codec -} + bankKeeper types.BankKeeper, accountKeeper types.AccountKeeper, +) *Keeper { + return &Keeper{ + cdc: cdc, + storeKey: storeKey, + memKey: memKey, -// NewKeeper creates new instances of the gentlemint Keeper -func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey, ak auth.AccountKeeper, sk supply.Keeper, bk bank.Keeper) Keeper { - return Keeper{ - cdc: cdc, - storeKey: storeKey, - accountKeeper: ak, - supplyKeeper: sk, - bankKeeper: bk, + bankKeeper: bankKeeper, accountKeeper: accountKeeper, } } -func (keeper Keeper) LoadCoins(ctx sdk.Context, toAddr sdk.AccAddress, amt sdk.Coins) error { - if !amt.IsValid() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, amt.String()) - } - _, err := keeper.bankKeeper.AddCoins(ctx, toAddr, amt) - if err != nil { - return err - } +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) +} - return keeper.supplyKeeper.MintCoins(ctx, types.ModuleName, amt) +func (k Keeper) BaseMintPossible(ctx sdk.Context, amt sdk.Int) bool { + total := k.bankKeeper.GetSupply(ctx, denom.Base) + newAmt := total.Amount.Add(amt) + return newAmt.LT(types.MaxBaseSupply) } -func (keeper Keeper) BurnCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) error { +// loadCoins mint amt coins to module address and then send coins to account toAddr +func (k Keeper) loadCoins(ctx sdk.Context, toAddr sdk.AccAddress, amt sdk.Coins) error { if !amt.IsValid() { return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, amt.String()) } - _, err := keeper.bankKeeper.SubtractCoins(ctx, addr, amt) - if err != nil { - return err + if err := k.bankKeeper.MintCoins(ctx, types.ModuleName, amt); err != nil { + return sdkerrors.Wrapf(err, "mint %v coins to module %v", amt, types.ModuleName) } - return keeper.supplyKeeper.BurnCoins(ctx, types.ModuleName, amt) -} - -func (keeper Keeper) GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins { - acc := keeper.accountKeeper.GetAccount(ctx, addr) - if acc != nil { - return acc.GetCoins() + if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, toAddr, amt); err != nil { + return sdkerrors.Wrapf(err, "send coins to account %s", toAddr.String()) } - return sdk.NewCoins() -} - -func (keeper Keeper) AddCoins(ctx sdk.Context, toAddr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, error) { - return keeper.bankKeeper.AddCoins(ctx, toAddr, amt) -} - -func (keeper Keeper) SubtractCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, error) { - return keeper.bankKeeper.SubtractCoins(ctx, addr, amt) -} - -func (keeper Keeper) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error { - return keeper.bankKeeper.SendCoins(ctx, fromAddr, toAddr, amt) -} - -func (keeper Keeper) SupplyMintCoins(ctx sdk.Context, amt sdk.Coins) error { - return keeper.supplyKeeper.MintCoins(ctx, types.ModuleName, amt) -} - -func (keeper Keeper) SupplyBurnCoins(ctx sdk.Context, amt sdk.Coins) error { - return keeper.supplyKeeper.BurnCoins(ctx, types.ModuleName, amt) + return nil } -func (k Keeper) GetSHRPLoader(ctx sdk.Context, address string) types.SHRPLoader { - if !k.IsSHRPLoaderPresent(ctx, address) { - return types.NewSHRPLoader() +// burnCoins send amt from address to module address then burning +func (k Keeper) burnCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) error { + if !amt.IsValid() { + return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, amt.String()) } - store := ctx.KVStore(k.storeKey) - bz := store.Get([]byte(address)) - var loader types.SHRPLoader - k.cdc.MustUnmarshalBinaryBare(bz, &loader) - return loader -} -func (k Keeper) SetSHRPLoader(ctx sdk.Context, address string, loader types.SHRPLoader) { - if loader.Status == "" { - return + if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, addr, types.ModuleName, amt); err != nil { + return sdkerrors.Wrapf(err, "send coins to module, amt %s", amt.String()) } - store := ctx.KVStore(k.storeKey) - store.Set([]byte(address), k.cdc.MustMarshalBinaryBare(loader)) -} - -func (k Keeper) GetSHRPLoaderStatus(ctx sdk.Context, address string) string { - loader := k.GetSHRPLoader(ctx, address) - return loader.Status -} - -func (k Keeper) SetSHRPLoaderStatus(ctx sdk.Context, address string, status string) { - loader := k.GetSHRPLoader(ctx, address) - loader.Status = status - k.SetSHRPLoader(ctx, address, loader) -} -func (k Keeper) DeleteSHRPLoader(ctx sdk.Context, address string) { - store := ctx.KVStore(k.storeKey) - store.Delete([]byte(address)) + return k.bankKeeper.BurnCoins(ctx, types.ModuleName, amt) } -func (k Keeper) GetSHRPLoadersIterator(ctx sdk.Context) sdk.Iterator { - store := ctx.KVStore(k.storeKey) - return sdk.KVStorePrefixIterator(store, []byte("shrploader")) +// LoadAllowanceLoader loads allowance coins to loader +func (k Keeper) LoadAllowanceLoader(ctx sdk.Context, addr sdk.AccAddress) error { + return k.loadCoins(ctx, addr, types.AllowanceLoader) } -func (k Keeper) IterateSHRPLoaders(ctx sdk.Context, cb func(loaderKey string, loader types.SHRPLoader) (stop bool)) { - iterator := k.GetSHRPLoadersIterator(ctx) - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - var loader types.SHRPLoader - loaderKey := string(iterator.Key()) - k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &loader) - if cb(loaderKey, loader) { - break - } +func (k Keeper) buyBaseDenom(ctx sdk.Context, base sdk.Coin, buyer sdk.AccAddress) error { + if base.Denom != denom.Base || !base.IsValid() { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "%v", base) } -} - -func (k Keeper) IsSHRPLoaderPresent(ctx sdk.Context, address string) bool { - store := ctx.KVStore(k.storeKey) - return store.Has([]byte(address)) -} - -func (k Keeper) ShrMintPossible(ctx sdk.Context, amt sdk.Int) bool { - total := k.supplyKeeper.GetSupply(ctx).GetTotal() - newAmt := total.AmountOf("shr").Add(amt) - if newAmt.GTE(MaxSHRSupply) { - return false + if !k.BaseMintPossible(ctx, base.Amount) { + return sdkerrors.Wrap(types.ErrBaseSupplyExceeded, base.String()) } - return true -} -func (k Keeper) GetExchangeRate(ctx sdk.Context) sdk.Int { - if !k.IsExchangeRatePresent(ctx) { - return DefaultExchangeRate - } - store := ctx.KVStore((k.storeKey)) - bz := store.Get([]byte(ExchangeRateKey)) - var rate sdk.Int - k.cdc.MustUnmarshalBinaryBare(bz, &rate) - return rate -} - -func (k Keeper) SetExchangeRate(ctx sdk.Context, rate string) { - store := ctx.KVStore(k.storeKey) - store.Set([]byte(ExchangeRateKey), k.cdc.MustMarshalBinaryBare(rate)) -} - -func (k Keeper) SetAuthorityAccount(ctx sdk.Context, authority string) { - store := ctx.KVStore(k.storeKey) - store.Set([]byte(AuthorityKey), k.cdc.MustMarshalBinaryBare(authority)) -} -func (k Keeper) GetAuthorityAccount(ctx sdk.Context) string { - store := ctx.KVStore(k.storeKey) - bz := store.Get([]byte(AuthorityKey)) - if len(bz) == 0 { - return "" - } - var authority string - k.cdc.MustUnmarshalBinaryBare(bz, &authority) - return authority -} + rate := k.GetExchangeRateD(ctx) -func (k Keeper) SetTreasurerAccount(ctx sdk.Context, treasurer string) { - store := ctx.KVStore(k.storeKey) - store.Set([]byte(TreasurerKey), k.cdc.MustMarshalBinaryBare(treasurer)) -} + currentBalance := k.bankKeeper.GetAllBalances(ctx, buyer) -func (k Keeper) GetTreasurerAccount(ctx sdk.Context) string { - store := ctx.KVStore(k.storeKey) - bz := store.Get([]byte(TreasurerKey)) - if len(bz) == 0 { - return "" + cost, err := denom.NormalizeToBaseCoin(denom.BaseUSD, sdk.NewDecCoinsFromCoins(base), rate, true) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrLogic, "+%v", err) } - var treasurer string - k.cdc.MustUnmarshalBinaryBare(bz, &treasurer) - return treasurer -} - -func (k Keeper) BuyShr(ctx sdk.Context, shrAmt sdk.Int, addr sdk.AccAddress) error { - - if !k.ShrMintPossible(ctx, shrAmt) { - return types.ErrSHRSupplyExceeded + if !currentBalance.IsAllGTE(sdk.NewCoins(cost)) { + return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, "current balances %v, Cost: %v", currentBalance, cost) } - - rate := k.GetExchangeRate(ctx) - // rate, err := strconv.ParseFloat(rateStr, 64) - // if err != nil { - // return err - // } - - // conv := float64(shrAmt.Int64()) / rate - - oldCoins := k.GetCoins(ctx, addr) - addedCoins := sdk.NewCoins(sdk.NewCoin("shr", shrAmt)) - removedCoins := sdk.NewCoins() - - // i, d, err := ParseCoinFloat(conv) - // if err != nil { - // return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, err.Error()) - // } - // shrpAmt := sdk.NewInt(i) - // centAmt := sdk.NewInt(d) - shrpAmt := shrAmt.Mul(myutil.RateDecimal).Quo(rate) - - if !oldCoins.AmountOf("shrp").GT(shrpAmt) { - return sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, fmt.Sprintf("Need %sSHRP, balance %sSHRP", shrpAmt.String(), oldCoins.AmountOf("shrp").String())) + if err := k.burnCoins(ctx, buyer, sdk.NewCoins(cost)); err != nil { + return sdkerrors.Wrapf(err, "charge %v coins", cost) } - // if !oldCoins.AmountOf("cent").GT(centAmt) { - // shrpAmt = shrpAmt.AddRaw(int64(1)) - // addedCoins = addedCoins.Add(sdk.NewCoin("cent", sdk.NewInt(int64(ShrpToCentRate)))) - // } - fmt.Println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1") - removedCoins = removedCoins.Add(sdk.NewCoin("shrp", shrpAmt)) - if _, err := k.AddCoins(ctx, addr, addedCoins); err != nil { - return err - } - fmt.Println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 11") - if _, err := k.SubtractCoins(ctx, addr, removedCoins); err != nil { - return err - } - fmt.Println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 12") - if err := k.SupplyMintCoins(ctx, addedCoins); err != nil { - return err + if err := k.loadCoins(ctx, buyer, sdk.NewCoins(base)); err != nil { + return sdkerrors.Wrapf(err, "load %v coins", base) } - fmt.Println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 13") - if err := k.SupplyBurnCoins(ctx, removedCoins); err != nil { - return err - } - fmt.Println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2") return nil } - -func (k Keeper) NotEnoughShr(ctx sdk.Context, amt sdk.Int, addr sdk.AccAddress) (sdk.Int, bool) { - oldCoins := k.GetCoins(ctx, addr) - oldShr := oldCoins.AmountOf("shr") - if !oldShr.GT(amt) { - return amt.Sub(oldShr), true - } - return sdk.ZeroInt(), false -} - -func (k Keeper) IsExchangeRatePresent(ctx sdk.Context) bool { - store := ctx.KVStore(k.storeKey) - return store.Has([]byte(ExchangeRateKey)) -} - -func ParseCoinFloat(f float64) (i, d int64, err error) { - - if f < 0 { - return i, d, sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "Negative Coins are not accepted") - } - i = int64(f) - d = int64(f*100 - float64(i*100) + 1) // make sure always round it up - return -} - -// func (k Keeper) GetIdSigner(ctx sdk.Context, address string) types.IdSigner { -// if !k.IsIdSignerPresent(ctx, address) { -// return types.NewIdSigner() -// } -// store := ctx.KVStore(k.storeKey) -// bz := store.Get([]byte(address)) -// var signer types.IdSigner -// k.cdc.MustUnmarshalBinaryBare(bz, &signer) -// return signer -// } - -func (k Keeper) SetIdSigner(ctx sdk.Context, signer types.AccState) { - store := ctx.KVStore(k.storeKey) - store.Set(k.createIdSignerKey(signer.Address), k.cdc.MustMarshalBinaryBare(signer.Status)) -} - -func (k Keeper) GetIdSigner(ctx sdk.Context, signerAddr sdk.AccAddress) types.AccState { - store := ctx.KVStore((k.storeKey)) - bz := store.Get(k.createIdSignerKey(signerAddr)) - if len(bz) == 0 { - return types.AccState{} - } - var status string - k.cdc.MustUnmarshalBinaryBare(bz, &status) - idSigner := types.NewAccState(signerAddr, status) - return idSigner -} - -func (k Keeper) DeleteIdSigner(ctx sdk.Context, addr sdk.AccAddress) { - store := ctx.KVStore(k.storeKey) - store.Delete(k.createIdSignerKey(addr)) -} - -func (k Keeper) DetactivateIdSigner(ctx sdk.Context, addr sdk.AccAddress) { - signer := k.GetIdSigner(ctx, addr) - signer.Status = types.Inactive - - k.SetIdSigner(ctx, signer) -} - -func (k Keeper) createIdSignerKey(addr sdk.AccAddress) []byte { - key := fmt.Sprintf("%s%s", IdSignerKey, addr) - return []byte(key) -} - -func (k Keeper) IterateIdSigners(ctx sdk.Context, cb func(loader types.AccState) (stop bool)) { - store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, []byte(IdSignerKey)) - - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - - key := string(iterator.Key()) - var status string - sAddr, err := sdk.AccAddressFromBech32(key[len(IdSignerKey):]) - - if err != nil { - panic(err) - } - err = k.cdc.UnmarshalBinaryBare(iterator.Value(), &status) - - signer := types.AccState{Address: sAddr, Status: status} - if cb(signer) { - break - } - } -} diff --git a/x/gentlemint/keeper/keeper_acc_op.go b/x/gentlemint/keeper/keeper_acc_op.go deleted file mode 100644 index 5a9336c3..00000000 --- a/x/gentlemint/keeper/keeper_acc_op.go +++ /dev/null @@ -1,58 +0,0 @@ -package keeper - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gentlemint/types" -) - -func (k Keeper) SetAccOp(ctx sdk.Context, acc types.AccState) { - store := ctx.KVStore(k.storeKey) - store.Set(k.createAccOpKey(acc.Address), k.cdc.MustMarshalBinaryBare(acc.Status)) -} - -func (k Keeper) GetAccOp(ctx sdk.Context, accAddr sdk.AccAddress) types.AccState { - store := ctx.KVStore((k.storeKey)) - bz := store.Get(k.createAccOpKey(accAddr)) - if len(bz) == 0 { - return types.AccState{} - } - var status string - k.cdc.MustUnmarshalBinaryBare(bz, &status) - acc := types.NewAccState(accAddr, status) - return acc -} - -func (k Keeper) DeleteAccOp(ctx sdk.Context, addr sdk.AccAddress) { - store := ctx.KVStore(k.storeKey) - store.Delete(k.createAccOpKey(addr)) -} - -func (k Keeper) createAccOpKey(addr sdk.AccAddress) []byte { - key := fmt.Sprintf("%s%s", AccOpKey, addr) - return []byte(key) -} - -func (k Keeper) IterateAccOps(ctx sdk.Context, cb func(loader types.AccState) (stop bool)) { - store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, []byte(AccOpKey)) - - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - - key := string(iterator.Key()) - var status string - sAddr, err := sdk.AccAddressFromBech32(key[len(AccOpKey):]) - - if err != nil { - panic(err) - } - err = k.cdc.UnmarshalBinaryBare(iterator.Value(), &status) - - acc := types.AccState{Address: sAddr, Status: status} - if cb(acc) { - break - } - } -} diff --git a/x/gentlemint/keeper/keeper_document.go b/x/gentlemint/keeper/keeper_document.go deleted file mode 100644 index d9bafaa9..00000000 --- a/x/gentlemint/keeper/keeper_document.go +++ /dev/null @@ -1,65 +0,0 @@ -package keeper - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gentlemint/types" -) - -func (k Keeper) SetDocIssuer(ctx sdk.Context, acc types.AccState) { - store := ctx.KVStore(k.storeKey) - store.Set(k.createDocIssuerKey(acc.Address), k.cdc.MustMarshalBinaryBare(acc.Status)) -} - -func (k Keeper) GetDocIssuer(ctx sdk.Context, accAddr sdk.AccAddress) types.AccState { - store := ctx.KVStore((k.storeKey)) - bz := store.Get(k.createDocIssuerKey(accAddr)) - if len(bz) == 0 { - return types.AccState{} - } - var status string - k.cdc.MustUnmarshalBinaryBare(bz, &status) - acc := types.NewAccState(accAddr, status) - return acc -} - -func (k Keeper) DeleteDocIssuer(ctx sdk.Context, addr sdk.AccAddress) { - store := ctx.KVStore(k.storeKey) - store.Delete(k.createDocIssuerKey(addr)) -} - -func (k Keeper) DetactivateDocIssuer(ctx sdk.Context, addr sdk.AccAddress) { - acc := k.GetDocIssuer(ctx, addr) - acc.Status = types.Inactive - - k.SetDocIssuer(ctx, acc) -} - -func (k Keeper) createDocIssuerKey(addr sdk.AccAddress) []byte { - key := fmt.Sprintf("%s%s", DocIssuerKey, addr) - return []byte(key) -} - -func (k Keeper) IterateDocIssuers(ctx sdk.Context, cb func(loader types.AccState) (stop bool)) { - store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, []byte(DocIssuerKey)) - - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - - key := string(iterator.Key()) - var status string - sAddr, err := sdk.AccAddressFromBech32(key[len(DocIssuerKey):]) - - if err != nil { - panic(err) - } - err = k.cdc.UnmarshalBinaryBare(iterator.Value(), &status) - - acc := types.AccState{Address: sAddr, Status: status} - if cb(acc) { - break - } - } -} diff --git a/x/gentlemint/keeper/keeper_test.go b/x/gentlemint/keeper/keeper_test.go deleted file mode 100644 index 008be580..00000000 --- a/x/gentlemint/keeper/keeper_test.go +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Based on https://github.com/cosmos/cosmos-sdk/blob/master/x/distribution/keeper - */ -package keeper - -import ( - "testing" - - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/params" - "github.com/cosmos/cosmos-sdk/x/supply" - "github.com/sharering/shareledger/x/gentlemint/types" - - "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - log "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" -) - -// returns context and app with params set on account keeper -func createOutput(t *testing.T) (sdk.Context, Keeper) { - - keyAcc := sdk.NewKVStoreKey(auth.StoreKey) - keyParams := sdk.NewKVStoreKey(params.StoreKey) - tkeyParams := sdk.NewTransientStoreKey(params.TStoreKey) - keySupply := sdk.NewKVStoreKey(supply.StoreKey) - - keyStoreGentlemint := sdk.NewKVStoreKey(types.StoreKey) - cdc := MakeTestCodec() - - db := dbm.NewMemDB() - ms := store.NewCommitMultiStore(db) - ms.MountStoreWithDB(keyStoreGentlemint, sdk.StoreTypeIAVL, db) - ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db) - ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db) - ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db) - ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db) - err := ms.LoadLatestVersion() - require.Nil(t, err) - - ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, true, log.NewNopLogger()) - - pk := params.NewKeeper(cdc, keyParams, tkeyParams) - - accountKeeper := auth.NewAccountKeeper( - cdc, // amino codec - keyAcc, // target store - pk.Subspace(auth.DefaultParamspace), - auth.ProtoBaseAccount, // prototype - ) - - blacklistedAddrs := make(map[string]bool) - - bk := bank.NewBaseKeeper( - accountKeeper, - pk.Subspace(bank.DefaultParamspace), - blacklistedAddrs, - ) - - maccPerms := map[string][]string{ - auth.FeeCollectorName: nil, - // types.NotBondedPoolName: {supply.Burner, supply.Staking}, - // types.BondedPoolName: {supply.Burner, supply.Staking}, - } - - supplyKeeper := supply.NewKeeper(cdc, keySupply, accountKeeper, bk, maccPerms) - - k := NewKeeper(cdc, keyStoreGentlemint, accountKeeper, supplyKeeper, bk) - - return ctx, k -} - -func TestAuthoritySet(t *testing.T) { - ctx, k := createOutput(t) - - authorityAddr := "123" - - k.SetAuthorityAccount(ctx, authorityAddr) - - getAcc := k.GetAuthorityAccount(ctx) - - require.Equal(t, authorityAddr, getAcc) -} diff --git a/x/gentlemint/keeper/level_fee.go b/x/gentlemint/keeper/level_fee.go new file mode 100644 index 00000000..98f0f65a --- /dev/null +++ b/x/gentlemint/keeper/level_fee.go @@ -0,0 +1,71 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/constant" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +// SetLevelFee set a specific levelFee in the store from its index +func (k Keeper) SetLevelFee(ctx sdk.Context, levelFee types.LevelFee) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.LevelFeeKeyPrefix)) + b := k.cdc.MustMarshal(&levelFee) + store.Set(types.LevelFeeKey( + levelFee.Level, + ), b) +} + +// GetLevelFee returns a levelFee from its index +func (k Keeper) GetLevelFee( + ctx sdk.Context, + level string, + +) (val types.LevelFee, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.LevelFeeKeyPrefix)) + + b := store.Get(types.LevelFeeKey( + level, + )) + if b == nil { + // Check if it's defined default level. + d, f := constant.DefaultFeeLevel[constant.DefaultLevel(level)] + if !f { + return val, false + } + val.Fee = d + val.Level = level + } else { + k.cdc.MustUnmarshal(b, &val) + } + + return val, true +} + +// RemoveLevelFee removes a levelFee from the store +func (k Keeper) RemoveLevelFee( + ctx sdk.Context, + level string, + +) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.LevelFeeKeyPrefix)) + store.Delete(types.LevelFeeKey( + level, + )) +} + +// GetAllLevelFee returns all levelFee +func (k Keeper) GetAllLevelFee(ctx sdk.Context) (list []types.LevelFee) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.LevelFeeKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var val types.LevelFee + k.cdc.MustUnmarshal(iterator.Value(), &val) + list = append(list, val) + } + + return +} diff --git a/x/gentlemint/keeper/level_fee_test.go b/x/gentlemint/keeper/level_fee_test.go new file mode 100644 index 00000000..aed7fee5 --- /dev/null +++ b/x/gentlemint/keeper/level_fee_test.go @@ -0,0 +1,56 @@ +package keeper_test + +import ( + "strconv" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/gentlemint/keeper" + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/stretchr/testify/require" +) + +// Prevent strconv unused error +var _ = strconv.IntSize + +func createNLevelFee(keeper *keeper.Keeper, ctx sdk.Context, n int) []types.LevelFee { + items := make([]types.LevelFee, n) + for i := range items { + items[i].Level = strconv.Itoa(i) + + keeper.SetLevelFee(ctx, items[i]) + } + return items +} + +func TestLevelFeeGet(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + items := createNLevelFee(keeper, ctx, 10) + for _, item := range items { + rst, found := keeper.GetLevelFee(ctx, + item.Level, + ) + require.True(t, found) + require.Equal(t, item, rst) + } +} +func TestLevelFeeRemove(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + items := createNLevelFee(keeper, ctx, 10) + for _, item := range items { + keeper.RemoveLevelFee(ctx, + item.Level, + ) + _, found := keeper.GetLevelFee(ctx, + item.Level, + ) + require.False(t, found) + } +} + +func TestLevelFeeGetAll(t *testing.T) { + keeper, ctx := keepertest.GentlemintKeeper(t) + items := createNLevelFee(keeper, ctx, 10) + require.ElementsMatch(t, items, keeper.GetAllLevelFee(ctx)) +} diff --git a/x/gentlemint/keeper/msg_server.go b/x/gentlemint/keeper/msg_server.go new file mode 100644 index 00000000..26061934 --- /dev/null +++ b/x/gentlemint/keeper/msg_server.go @@ -0,0 +1,17 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/gentlemint/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} diff --git a/x/gentlemint/keeper/msg_server_action_level_fee.go b/x/gentlemint/keeper/msg_server_action_level_fee.go new file mode 100644 index 00000000..81aa90e3 --- /dev/null +++ b/x/gentlemint/keeper/msg_server_action_level_fee.go @@ -0,0 +1,54 @@ +package keeper + +import ( + "context" + "github.com/sharering/shareledger/x/fee" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func (k msgServer) SetActionLevelFee(goCtx context.Context, msg *types.MsgSetActionLevelFee) (*types.MsgSetActionLevelFeeResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if found := fee.HaveActionKey(msg.Action); !found { + return nil, sdkerrors.Wrapf(sdkerrors.ErrKeyNotFound, "%s action was not found in fee table", msg.Action) + } + + if _, found := k.GetLevelFee(ctx, msg.Level); !found { + return nil, sdkerrors.Wrapf(sdkerrors.ErrKeyNotFound, "%s level was not found", msg.Level) + } + + var actionLevelFee = types.ActionLevelFee{ + Creator: msg.Creator, + Action: msg.Action, + Level: msg.Level, + } + + k.Keeper.SetActionLevelFee( + ctx, + actionLevelFee, + ) + return &types.MsgSetActionLevelFeeResponse{}, nil +} + +func (k msgServer) DeleteActionLevelFee(goCtx context.Context, msg *types.MsgDeleteActionLevelFee) (*types.MsgDeleteActionLevelFeeResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // Check if the value exists + _, isFound := k.GetActionLevelFee( + ctx, + msg.Action, + ) + if !isFound { + return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, "index not set") + } + + k.RemoveActionLevelFee( + ctx, + msg.Action, + ) + + return &types.MsgDeleteActionLevelFeeResponse{}, nil +} diff --git a/x/gentlemint/keeper/msg_server_action_level_fee_test.go b/x/gentlemint/keeper/msg_server_action_level_fee_test.go new file mode 100644 index 00000000..530bc844 --- /dev/null +++ b/x/gentlemint/keeper/msg_server_action_level_fee_test.go @@ -0,0 +1,144 @@ +package keeper_test + +// TODO: update test cases +//import ( +// "github.com/sharering/shareledger/testutil/sample" +// "strconv" +// "testing" +// +// sdk "github.com/cosmos/cosmos-sdk/types" +// sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +// "github.com/stretchr/testify/require" +// +// keepertest "github.com/sharering/shareledger/testutil/keeper" +// "github.com/sharering/shareledger/x/gentlemint/keeper" +// "github.com/sharering/shareledger/x/gentlemint/types" +//) +// +//// Prevent strconv unused error +//var _ = strconv.IntSize +// +//func TestActionLevelFeeMsgServerCreate(t *testing.T) { +// k, ctx := keepertest.GentlemintKeeper(t) +// srv := keeper.NewMsgServerImpl(*k) +// wctx := sdk.WrapSDKContext(ctx) +// creator := sample.AccAddress() +// for i := 0; i < 5; i++ { +// expected := &types.MsgCreateActionLevelFee{Creator: creator, +// Action: strconv.Itoa(i), +// } +// _, err := srv.CreateActionLevelFee(wctx, expected) +// require.NoError(t, err, err.Error()) +// rst, found := k.GetActionLevelFee(ctx, +// expected.Action, +// ) +// require.True(t, found) +// require.Equal(t, expected.Creator, rst.Creator) +// } +//} +// +//func TestActionLevelFeeMsgServerUpdate(t *testing.T) { +// creator := "A" +// +// for _, tc := range []struct { +// desc string +// request *types.MsgUpdateActionLevelFee +// err error +// }{ +// { +// desc: "Completed", +// request: &types.MsgUpdateActionLevelFee{Creator: creator, +// Action: strconv.Itoa(0), +// }, +// }, +// { +// desc: "Unauthorized", +// request: &types.MsgUpdateActionLevelFee{Creator: "B", +// Action: strconv.Itoa(0), +// }, +// err: sdkerrors.ErrUnauthorized, +// }, +// { +// desc: "KeyNotFound", +// request: &types.MsgUpdateActionLevelFee{Creator: creator, +// Action: strconv.Itoa(100000), +// }, +// err: sdkerrors.ErrKeyNotFound, +// }, +// } { +// t.Run(tc.desc, func(t *testing.T) { +// k, ctx := keepertest.GentlemintKeeper(t) +// srv := keeper.NewMsgServerImpl(*k) +// wctx := sdk.WrapSDKContext(ctx) +// expected := &types.MsgCreateActionLevelFee{Creator: creator, +// Action: strconv.Itoa(0), +// } +// _, err := srv.CreateActionLevelFee(wctx, expected) +// require.NoError(t, err) +// +// _, err = srv.UpdateActionLevelFee(wctx, tc.request) +// if tc.err != nil { +// require.ErrorIs(t, err, tc.err) +// } else { +// require.NoError(t, err) +// rst, found := k.GetActionLevelFee(ctx, +// expected.Action, +// ) +// require.True(t, found) +// require.Equal(t, expected.Creator, rst.Creator) +// } +// }) +// } +//} +// +//func TestActionLevelFeeMsgServerDelete(t *testing.T) { +// creator := "A" +// +// for _, tc := range []struct { +// desc string +// request *types.MsgDeleteActionLevelFee +// err error +// }{ +// { +// desc: "Completed", +// request: &types.MsgDeleteActionLevelFee{Creator: creator, +// Action: strconv.Itoa(0), +// }, +// }, +// { +// desc: "Unauthorized", +// request: &types.MsgDeleteActionLevelFee{Creator: "B", +// Action: strconv.Itoa(0), +// }, +// err: sdkerrors.ErrUnauthorized, +// }, +// { +// desc: "KeyNotFound", +// request: &types.MsgDeleteActionLevelFee{Creator: creator, +// Action: strconv.Itoa(100000), +// }, +// err: sdkerrors.ErrKeyNotFound, +// }, +// } { +// t.Run(tc.desc, func(t *testing.T) { +// k, ctx := keepertest.GentlemintKeeper(t) +// srv := keeper.NewMsgServerImpl(*k) +// wctx := sdk.WrapSDKContext(ctx) +// +// _, err := srv.CreateActionLevelFee(wctx, &types.MsgCreateActionLevelFee{Creator: creator, +// Action: strconv.Itoa(0), +// }) +// require.NoError(t, err) +// _, err = srv.DeleteActionLevelFee(wctx, tc.request) +// if tc.err != nil { +// require.ErrorIs(t, err, tc.err) +// } else { +// require.NoError(t, err) +// _, found := k.GetActionLevelFee(ctx, +// tc.request.Action, +// ) +// require.False(t, found) +// } +// }) +// } +//} diff --git a/x/gentlemint/keeper/msg_server_burn.go b/x/gentlemint/keeper/msg_server_burn.go new file mode 100644 index 00000000..a7cc361b --- /dev/null +++ b/x/gentlemint/keeper/msg_server_burn.go @@ -0,0 +1,27 @@ +package keeper + +import ( + "context" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func (k msgServer) Burn(goCtx context.Context, msg *types.MsgBurn) (*types.MsgBurnResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + if err := msg.ValidateBasic(); err != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error()) + } + + baseCoins, err := denom.NormalizeToBaseCoins(msg.Coins, false) + if err != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error()) + } + + if err := k.burnCoins(ctx, msg.GetSigners()[0], baseCoins); err != nil { + return nil, sdkerrors.Wrapf(err, "burns %v coins from %v", baseCoins, msg.Creator) + } + return &types.MsgBurnResponse{}, nil +} diff --git a/x/gentlemint/keeper/msg_server_buy_shr.go b/x/gentlemint/keeper/msg_server_buy_shr.go new file mode 100644 index 00000000..d53e62b2 --- /dev/null +++ b/x/gentlemint/keeper/msg_server_buy_shr.go @@ -0,0 +1,30 @@ +package keeper + +import ( + "context" + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/gentlemint/types" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +func (k msgServer) BuyShr(goCtx context.Context, msg *types.MsgBuyShr) (*types.MsgBuyShrResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + shrCoin := sdk.NewDecCoinFromDec(denom.Shr, sdk.MustNewDecFromStr(msg.Amount)) + rate := k.GetExchangeRateD(ctx) + coin, err := denom.NormalizeToBaseCoin(denom.Base, sdk.NewDecCoins(shrCoin), rate, false) + if err != nil { + return nil, err + } + if err := k.buyBaseDenom(ctx, coin, msg.GetSigners()[0]); err != nil { + return nil, sdkerrors.Wrapf(err, "buy %+v to %v", coin, msg.Creator) + } + return &types.MsgBuyShrResponse{ + Log: fmt.Sprintf("Successfull buy %+v for address %s", coin, msg.Creator), + }, nil +} diff --git a/x/gentlemint/keeper/msg_server_level_fee.go b/x/gentlemint/keeper/msg_server_level_fee.go new file mode 100644 index 00000000..58f0a307 --- /dev/null +++ b/x/gentlemint/keeper/msg_server_level_fee.go @@ -0,0 +1,50 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func (k msgServer) SetLevelFee(goCtx context.Context, msg *types.MsgSetLevelFee) (*types.MsgSetLevelFeeResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + // If already have, will update current value + var levelFee = types.LevelFee{ + Creator: msg.Creator, + Level: msg.Level, + Fee: msg.Fee, + } + + k.Keeper.SetLevelFee( + ctx, + levelFee, + ) + return &types.MsgSetLevelFeeResponse{}, nil +} + +func (k msgServer) DeleteLevelFee(goCtx context.Context, msg *types.MsgDeleteLevelFee) (*types.MsgDeleteLevelFeeResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // Check if the value exists + _, isFound := k.GetLevelFee( + ctx, + msg.Level, + ) + if !isFound { + return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, "index not set") + } + + k.RemoveLevelFee( + ctx, + msg.Level, + ) + + return &types.MsgDeleteLevelFeeResponse{}, nil +} diff --git a/x/gentlemint/keeper/msg_server_level_fee_test.go b/x/gentlemint/keeper/msg_server_level_fee_test.go new file mode 100644 index 00000000..69429137 --- /dev/null +++ b/x/gentlemint/keeper/msg_server_level_fee_test.go @@ -0,0 +1,143 @@ +package keeper_test + +// TODO: update test case +//import ( +// "strconv" +// "testing" +// +// sdk "github.com/cosmos/cosmos-sdk/types" +// sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +// "github.com/stretchr/testify/require" +// +// keepertest "github.com/sharering/shareledger/testutil/keeper" +// "github.com/sharering/shareledger/x/gentlemint/keeper" +// "github.com/sharering/shareledger/x/gentlemint/types" +//) +// +//// Prevent strconv unused error +//var _ = strconv.IntSize +// +//func TestLevelFeeMsgServerCreate(t *testing.T) { +// k, ctx := keepertest.GentlemintKeeper(t) +// srv := keeper.NewMsgServerImpl(*k) +// wctx := sdk.WrapSDKContext(ctx) +// creator := "A" +// for i := 0; i < 5; i++ { +// expected := &types.MsgCreateLevelFee{Creator: creator, +// Level: strconv.Itoa(i), +// } +// _, err := srv.CreateLevelFee(wctx, expected) +// require.NoError(t, err) +// rst, found := k.GetLevelFee(ctx, +// expected.Level, +// ) +// require.True(t, found) +// require.Equal(t, expected.Creator, rst.Creator) +// } +//} +// +//func TestLevelFeeMsgServerUpdate(t *testing.T) { +// creator := "A" +// +// for _, tc := range []struct { +// desc string +// request *types.MsgUpdateLevelFee +// err error +// }{ +// { +// desc: "Completed", +// request: &types.MsgUpdateLevelFee{Creator: creator, +// Level: strconv.Itoa(0), +// }, +// }, +// { +// desc: "Unauthorized", +// request: &types.MsgUpdateLevelFee{Creator: "B", +// Level: strconv.Itoa(0), +// }, +// err: sdkerrors.ErrUnauthorized, +// }, +// { +// desc: "KeyNotFound", +// request: &types.MsgUpdateLevelFee{Creator: creator, +// Level: strconv.Itoa(100000), +// }, +// err: sdkerrors.ErrKeyNotFound, +// }, +// } { +// t.Run(tc.desc, func(t *testing.T) { +// k, ctx := keepertest.GentlemintKeeper(t) +// srv := keeper.NewMsgServerImpl(*k) +// wctx := sdk.WrapSDKContext(ctx) +// expected := &types.MsgCreateLevelFee{Creator: creator, +// Level: strconv.Itoa(0), +// } +// _, err := srv.CreateLevelFee(wctx, expected) +// require.NoError(t, err) +// +// _, err = srv.UpdateLevelFee(wctx, tc.request) +// if tc.err != nil { +// require.ErrorIs(t, err, tc.err) +// } else { +// require.NoError(t, err) +// rst, found := k.GetLevelFee(ctx, +// expected.Level, +// ) +// require.True(t, found) +// require.Equal(t, expected.Creator, rst.Creator) +// } +// }) +// } +//} +// +//func TestLevelFeeMsgServerDelete(t *testing.T) { +// creator := "A" +// +// for _, tc := range []struct { +// desc string +// request *types.MsgDeleteLevelFee +// err error +// }{ +// { +// desc: "Completed", +// request: &types.MsgDeleteLevelFee{Creator: creator, +// Level: strconv.Itoa(0), +// }, +// }, +// { +// desc: "Unauthorized", +// request: &types.MsgDeleteLevelFee{Creator: "B", +// Level: strconv.Itoa(0), +// }, +// err: sdkerrors.ErrUnauthorized, +// }, +// { +// desc: "KeyNotFound", +// request: &types.MsgDeleteLevelFee{Creator: creator, +// Level: strconv.Itoa(100000), +// }, +// err: sdkerrors.ErrKeyNotFound, +// }, +// } { +// t.Run(tc.desc, func(t *testing.T) { +// k, ctx := keepertest.GentlemintKeeper(t) +// srv := keeper.NewMsgServerImpl(*k) +// wctx := sdk.WrapSDKContext(ctx) +// +// _, err := srv.CreateLevelFee(wctx, &types.MsgCreateLevelFee{Creator: creator, +// Level: strconv.Itoa(0), +// }) +// require.NoError(t, err) +// _, err = srv.DeleteLevelFee(wctx, tc.request) +// if tc.err != nil { +// require.ErrorIs(t, err, tc.err) +// } else { +// require.NoError(t, err) +// _, found := k.GetLevelFee(ctx, +// tc.request.Level, +// ) +// require.False(t, found) +// } +// }) +// } +//} diff --git a/x/gentlemint/keeper/msg_server_load.go b/x/gentlemint/keeper/msg_server_load.go new file mode 100644 index 00000000..4a501a4f --- /dev/null +++ b/x/gentlemint/keeper/msg_server_load.go @@ -0,0 +1,55 @@ +package keeper + +import ( + "context" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func (k msgServer) Load(goCtx context.Context, msg *types.MsgLoad) (*types.MsgLoadResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + destAdd, err := sdk.AccAddressFromBech32(msg.Address) + if err != nil { + return nil, err + } + + baseCoins, err := denom.NormalizeToBaseCoins(msg.Coins, false) + if err != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, err.Error()) + } + if !k.BaseMintPossible(ctx, baseCoins.AmountOf(denom.Base)) { + return nil, sdkerrors.Wrapf(types.ErrBaseSupplyExceeded, "load %v", baseCoins) + } + if err := k.loadCoins(ctx, destAdd, baseCoins); err != nil { + return nil, err + } + + // Pay fee for loader who is a creator of this transaction + if msg.Creator != msg.Address { + exchangeRate := k.GetExchangeRateD(ctx) + loadDFee := k.GetFeeByMsg(ctx, msg) + loadFee, err := denom.NormalizeToBaseCoin(denom.Base, sdk.NewDecCoins(loadDFee), exchangeRate, true) + if err != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrLogic, err.Error()) + } + currentBalance := k.bankKeeper.GetBalance(ctx, destAdd, denom.Base) + if currentBalance.IsLT(loadFee) { + if err := k.buyBaseDenom(ctx, loadFee.Sub(currentBalance), destAdd); err != nil { + return nil, err + } + } + if err := k.bankKeeper.SendCoins(ctx, destAdd, msg.GetSigners()[0], sdk.NewCoins(loadFee)); err != nil { + return nil, sdkerrors.Wrapf(err, "pay fee, %v, to approver, %v", loadFee, msg.Creator) + } + } + + return &types.MsgLoadResponse{}, nil +} diff --git a/x/gentlemint/keeper/msg_server_load_fee.go b/x/gentlemint/keeper/msg_server_load_fee.go new file mode 100644 index 00000000..f518510c --- /dev/null +++ b/x/gentlemint/keeper/msg_server_load_fee.go @@ -0,0 +1,15 @@ +package keeper + +import ( + "context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +// LoadFee Not use this function +// This func is executed in antee +func (k msgServer) LoadFee(goCtx context.Context, msg *types.MsgLoadFee) (*types.MsgLoadFeeResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + err := k.LoadFeeFundFromShrp(ctx, msg) + return &types.MsgLoadFeeResponse{}, err +} diff --git a/x/gentlemint/keeper/msg_server_send.go b/x/gentlemint/keeper/msg_server_send.go new file mode 100644 index 00000000..a50b80f8 --- /dev/null +++ b/x/gentlemint/keeper/msg_server_send.go @@ -0,0 +1,36 @@ +package keeper + +import ( + "context" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func (k msgServer) Send(goCtx context.Context, msg *types.MsgSend) (*types.MsgSendResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + + //decCoins, err := sdk.ParseDecCoins(msg.Coins) + //if err != nil { + // return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error()) + //} + dstAddr, err := sdk.AccAddressFromBech32(msg.Address) + if err != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error()) + } + baseCoins, err := denom.NormalizeToBaseCoins(msg.Coins, false) + if err != nil { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error()) + } + if err := k.bankKeeper.SendCoins(ctx, msg.GetSigners()[0], dstAddr, baseCoins); err != nil { + return nil, err + } + + return &types.MsgSendResponse{}, nil +} diff --git a/x/gentlemint/keeper/msg_server_set_exchange.go b/x/gentlemint/keeper/msg_server_set_exchange.go new file mode 100644 index 00000000..1faab7da --- /dev/null +++ b/x/gentlemint/keeper/msg_server_set_exchange.go @@ -0,0 +1,14 @@ +package keeper + +import ( + "context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/gentlemint/types" +) + +func (k msgServer) SetExchange(goCtx context.Context, msg *types.MsgSetExchange) (*types.MsgSetExchangeResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + k.SetExchangeRate(ctx, types.ExchangeRate{Rate: msg.Rate}) + return &types.MsgSetExchangeResponse{}, nil +} diff --git a/x/gentlemint/keeper/querier.go b/x/gentlemint/keeper/querier.go deleted file mode 100644 index 8d80ecb9..00000000 --- a/x/gentlemint/keeper/querier.go +++ /dev/null @@ -1,157 +0,0 @@ -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/gentlemint/types" - - abci "github.com/tendermint/tendermint/abci/types" -) - -const ( - QueryLoader = "loader" - QueryExchange = "exchange" - QuerySigner = "id-signer" - QuerySigners = "id-signers" - QueryAccountOprator = "account-operator" - QueryAllAccountOprator = "account-operators" - QueryDocumentIssuer = "document-issuer" - QueryAllDocumentIssuer = "document-issuers" -) - -func NewQuerier(keeper Keeper) sdk.Querier { - return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err error) { - switch path[0] { - case QueryLoader: - return queryLoader(ctx, path[1:], req, keeper) - case QueryExchange: - return queryExchange(ctx, path[1:], req, keeper) - case QuerySigner: - return querySigner(ctx, path[1:], req, keeper) - case QuerySigners: - return queryAllSigner(ctx, path[1:], req, keeper) - case QueryAccountOprator: - return queryAccountOperator(ctx, path[1:], req, keeper) - case QueryAllAccountOprator: - return queryAllAccountOperator(ctx, req, keeper) - case QueryDocumentIssuer: - return queryDocumentIssuer(ctx, path[1:], req, keeper) - case QueryAllDocumentIssuer: - return queryAllDocumentIssuer(ctx, req, keeper) - default: - return nil, sdkerrors.ErrInvalidRequest - } - } -} - -func queryLoader(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - loader := keeper.GetSHRPLoader(ctx, path[0]) - res, err := codec.MarshalJSONIndent(keeper.cdc, loader) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func queryExchange(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - rate := keeper.GetExchangeRate(ctx) - res, err := codec.MarshalJSONIndent(keeper.cdc, rate) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func querySigner(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - addr, err := sdk.AccAddressFromBech32(path[0]) - - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) - } - - idSigner := keeper.GetIdSigner(ctx, addr) - res, err := codec.MarshalJSONIndent(keeper.cdc, idSigner) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func queryAllSigner(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - accs := []types.AccState{} - cb := func(acc types.AccState) (stop bool) { - accs = append(accs, acc) - return false - } - - keeper.IterateIdSigners(ctx, cb) - - res, err := codec.MarshalJSONIndent(keeper.cdc, accs) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func queryAccountOperator(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - addr, err := sdk.AccAddressFromBech32(path[0]) - - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) - } - - acc := keeper.GetAccOp(ctx, addr) - res, err := codec.MarshalJSONIndent(keeper.cdc, acc) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func queryAllAccountOperator(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - accs := []types.AccState{} - cb := func(acc types.AccState) (stop bool) { - accs = append(accs, acc) - return false - } - - keeper.IterateAccOps(ctx, cb) - - res, err := codec.MarshalJSONIndent(keeper.cdc, accs) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func queryDocumentIssuer(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - addr, err := sdk.AccAddressFromBech32(path[0]) - - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) - } - - acc := keeper.GetDocIssuer(ctx, addr) - res, err := codec.MarshalJSONIndent(keeper.cdc, acc) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func queryAllDocumentIssuer(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - accs := []types.AccState{} - cb := func(acc types.AccState) (stop bool) { - accs = append(accs, acc) - return false - } - - keeper.IterateDocIssuers(ctx, cb) - - res, err := codec.MarshalJSONIndent(keeper.cdc, accs) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} diff --git a/x/gentlemint/keeper/test_common.go b/x/gentlemint/keeper/test_common.go deleted file mode 100644 index f3935b71..00000000 --- a/x/gentlemint/keeper/test_common.go +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Based on https://github.com/cosmos/cosmos-sdk/blob/master/x/distribution/keeper - */ - -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/cosmos-sdk/x/supply" -) - -func MakeTestCodec() *codec.Codec { - var cdc = codec.New() - - // Register Msgs - cdc.RegisterInterface((*sdk.Msg)(nil), nil) - cdc.RegisterConcrete(bank.MsgSend{}, "test/staking/Send", nil) - cdc.RegisterConcrete(types.MsgCreateValidator{}, "test/staking/CreateValidator", nil) - cdc.RegisterConcrete(types.MsgEditValidator{}, "test/staking/EditValidator", nil) - cdc.RegisterConcrete(types.MsgUndelegate{}, "test/staking/Undelegate", nil) - cdc.RegisterConcrete(types.MsgBeginRedelegate{}, "test/staking/BeginRedelegate", nil) - - // Register AppAccount - cdc.RegisterInterface((*authexported.Account)(nil), nil) - cdc.RegisterConcrete(&auth.BaseAccount{}, "test/staking/BaseAccount", nil) - supply.RegisterCodec(cdc) - codec.RegisterCrypto(cdc) - - return cdc -} diff --git a/x/gentlemint/module.go b/x/gentlemint/module.go index da68d861..23459235 100644 --- a/x/gentlemint/module.go +++ b/x/gentlemint/module.go @@ -1,122 +1,166 @@ package gentlemint import ( + "context" "encoding/json" + "fmt" "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/supply" "github.com/sharering/shareledger/x/gentlemint/client/cli" - "github.com/sharering/shareledger/x/gentlemint/client/rest" - - "github.com/cosmos/cosmos-sdk/client/context" - sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" + "github.com/sharering/shareledger/x/gentlemint/keeper" + "github.com/sharering/shareledger/x/gentlemint/types" ) -// type check to ensure the interface is properly implemented var ( _ module.AppModule = AppModule{} _ module.AppModuleBasic = AppModuleBasic{} ) -// app module Basics object -type AppModuleBasic struct{} +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- + +// AppModuleBasic implements the AppModuleBasic interface for the capability module. +type AppModuleBasic struct { + cdc codec.BinaryCodec +} +func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the capability module's name. func (AppModuleBasic) Name() string { - return ModuleName + return types.ModuleName +} + +func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) } -func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { - RegisterCodec(cdc) +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) } -func (AppModuleBasic) DefaultGenesis() json.RawMessage { - return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) +// RegisterInterfaces registers the module's interface types +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) } -// Validation check of the Genesis -func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { - var data GenesisState - err := ModuleCdc.UnmarshalJSON(bz, &data) - if err != nil { - return err +// DefaultGenesis returns the capability module's default genesis state. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) +} + +// ValidateGenesis performs genesis state validation for the capability module. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - // Once json successfully marshalled, passes along to genesis.go - return ValidateGenesis(data) + return genState.Validate() } -// Register rest routes -func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { - rest.RegisterRoutes(ctx, rtr, StoreKey) +// RegisterRESTRoutes registers the capability module's REST service handlers. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { } -// Get the root query command of this module -func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { - return cli.QueryCmd(StoreKey, cdc) +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) } -// Get the root tx command of this module -func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetTxCmd(StoreKey, cdc) +// GetTxCmd returns the capability module's root tx command. +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() } +// GetQueryCmd returns the capability module's root query command. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(types.StoreKey) +} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- + +// AppModule implements the AppModule interface for the capability module. type AppModule struct { AppModuleBasic - keeper Keeper - accountKeeper auth.AccountKeeper - supplyKeeper supply.Keeper + + keeper keeper.Keeper } -// NewAppModule creates a new AppModule Object -func NewAppModule(k Keeper, ak auth.AccountKeeper, sk supply.Keeper) AppModule { +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, - accountKeeper: ak, - supplyKeeper: sk, + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, } } -func (AppModule) Name() string { - return ModuleName +// Name returns the capability module's name. +func (am AppModule) Name() string { + return am.AppModuleBasic.Name() } -func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} - -func (am AppModule) Route() string { - return RouterKey +// Route returns the capability module's message routing key. +func (am AppModule) Route() sdk.Route { + return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) } -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(am.keeper) -} -func (am AppModule) QuerierRoute() string { - return QuerierRoute +// QuerierRoute returns the capability module's query routing key. +func (AppModule) QuerierRoute() string { return types.QuerierRoute } + +// LegacyQuerierHandler returns the capability module's Querier. +func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { + return nil } -func (am AppModule) NewQuerierHandler() sdk.Querier { - return NewQuerier(am.keeper) +// RegisterServices registers a GRPC query service to respond to the +// module-specific GRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) } -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} +// RegisterInvariants registers the capability module's invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the capability module's genesis initialization It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, am.keeper, genState) -func (am AppModule) EndBlock(sdk.Context, abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } -func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState GenesisState - ModuleCdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} +// ExportGenesis returns the capability 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) + return cdc.MustMarshalJSON(genState) } -func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return ModuleCdc.MustMarshalJSON(gs) +// ConsensusVersion implements ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 2 } + +// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. +func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} + +// EndBlock executes all ABCI EndBlock logic respective to the capability module. It +// returns no validator updates. +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} } diff --git a/x/gentlemint/types/action_level_fee.pb.go b/x/gentlemint/types/action_level_fee.pb.go new file mode 100644 index 00000000..69f3f1b1 --- /dev/null +++ b/x/gentlemint/types/action_level_fee.pb.go @@ -0,0 +1,419 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: gentlemint/action_level_fee.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type ActionLevelFee struct { + Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` + Level string `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"` + Creator string `protobuf:"bytes,3,opt,name=creator,proto3" json:"creator,omitempty"` +} + +func (m *ActionLevelFee) Reset() { *m = ActionLevelFee{} } +func (m *ActionLevelFee) String() string { return proto.CompactTextString(m) } +func (*ActionLevelFee) ProtoMessage() {} +func (*ActionLevelFee) Descriptor() ([]byte, []int) { + return fileDescriptor_9e43a339986befe0, []int{0} +} +func (m *ActionLevelFee) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ActionLevelFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ActionLevelFee.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ActionLevelFee) XXX_Merge(src proto.Message) { + xxx_messageInfo_ActionLevelFee.Merge(m, src) +} +func (m *ActionLevelFee) XXX_Size() int { + return m.Size() +} +func (m *ActionLevelFee) XXX_DiscardUnknown() { + xxx_messageInfo_ActionLevelFee.DiscardUnknown(m) +} + +var xxx_messageInfo_ActionLevelFee proto.InternalMessageInfo + +func (m *ActionLevelFee) GetAction() string { + if m != nil { + return m.Action + } + return "" +} + +func (m *ActionLevelFee) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +func (m *ActionLevelFee) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func init() { + proto.RegisterType((*ActionLevelFee)(nil), "shareledger.gentlemint.ActionLevelFee") +} + +func init() { proto.RegisterFile("gentlemint/action_level_fee.proto", fileDescriptor_9e43a339986befe0) } + +var fileDescriptor_9e43a339986befe0 = []byte{ + // 197 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4f, 0xcd, 0x2b, + 0xc9, 0x49, 0xcd, 0xcd, 0xcc, 0x2b, 0xd1, 0x4f, 0x4c, 0x2e, 0xc9, 0xcc, 0xcf, 0x8b, 0xcf, 0x49, + 0x2d, 0x4b, 0xcd, 0x89, 0x4f, 0x4b, 0x4d, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2b, + 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x43, 0x28, 0x57, 0x8a, 0xe0, + 0xe2, 0x73, 0x04, 0xeb, 0xf0, 0x01, 0x69, 0x70, 0x4b, 0x4d, 0x15, 0x12, 0xe3, 0x62, 0x83, 0x98, + 0x21, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04, 0xe5, 0x09, 0x89, 0x70, 0xb1, 0x82, 0x0d, 0x95, + 0x60, 0x02, 0x0b, 0x43, 0x38, 0x42, 0x12, 0x5c, 0xec, 0xc9, 0x45, 0xa9, 0x89, 0x25, 0xf9, 0x45, + 0x12, 0xcc, 0x60, 0x71, 0x18, 0xd7, 0xc9, 0xf7, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, + 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, + 0x18, 0xa2, 0x8c, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0xc1, 0xce, + 0x2a, 0xca, 0xcc, 0x4b, 0xd7, 0x47, 0x72, 0xa0, 0x7e, 0x85, 0x3e, 0x92, 0x8f, 0x4a, 0x2a, 0x0b, + 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0xfe, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x6b, 0x31, 0x4d, + 0x25, 0xec, 0x00, 0x00, 0x00, +} + +func (m *ActionLevelFee) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ActionLevelFee) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ActionLevelFee) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintActionLevelFee(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0x1a + } + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintActionLevelFee(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0x12 + } + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintActionLevelFee(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintActionLevelFee(dAtA []byte, offset int, v uint64) int { + offset -= sovActionLevelFee(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ActionLevelFee) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + if l > 0 { + n += 1 + l + sovActionLevelFee(uint64(l)) + } + l = len(m.Level) + if l > 0 { + n += 1 + l + sovActionLevelFee(uint64(l)) + } + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovActionLevelFee(uint64(l)) + } + return n +} + +func sovActionLevelFee(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozActionLevelFee(x uint64) (n int) { + return sovActionLevelFee(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ActionLevelFee) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowActionLevelFee + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: ActionLevelFee: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ActionLevelFee: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowActionLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthActionLevelFee + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthActionLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowActionLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthActionLevelFee + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthActionLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowActionLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthActionLevelFee + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthActionLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipActionLevelFee(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthActionLevelFee + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipActionLevelFee(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowActionLevelFee + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowActionLevelFee + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowActionLevelFee + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthActionLevelFee + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupActionLevelFee + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthActionLevelFee + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthActionLevelFee = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowActionLevelFee = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupActionLevelFee = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/gentlemint/types/codec.go b/x/gentlemint/types/codec.go index 66283018..59ee39a0 100644 --- a/x/gentlemint/types/codec.go +++ b/x/gentlemint/types/codec.go @@ -2,35 +2,64 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" ) -// ModuleCdc is the codec for the module -var ModuleCdc = codec.New() - -func init() { - RegisterCodec(ModuleCdc) +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgBuyShr{}, "gentlemint/BuyShr", nil) + cdc.RegisterConcrete(&MsgSetExchange{}, "gentlemint/SetExchange", nil) + cdc.RegisterConcrete(&MsgSetLevelFee{}, "gentlemint/SetLevelFee", nil) + cdc.RegisterConcrete(&MsgDeleteLevelFee{}, "gentlemint/DeleteLevelFee", nil) + cdc.RegisterConcrete(&MsgSetActionLevelFee{}, "gentlemint/SetActionLevelFee", nil) + cdc.RegisterConcrete(&MsgDeleteActionLevelFee{}, "gentlemint/DeleteActionLevelFee", nil) + cdc.RegisterConcrete(&MsgLoadFee{}, "gentlemint/LoadFee", nil) + cdc.RegisterConcrete(&MsgLoad{}, "gentlemint/Load", nil) + cdc.RegisterConcrete(&MsgSend{}, "gentlemint/Send", nil) + cdc.RegisterConcrete(&MsgBurn{}, "gentlemint/Burn", nil) + // this line is used by starport scaffolding # 2 } -// RegisterCodec registers concrete types on the Amino codec -func RegisterCodec(cdc *codec.Codec) { - cdc.RegisterConcrete(MsgLoadSHR{}, "gentlemint/LoadSHR", nil) - cdc.RegisterConcrete(MsgBurnSHRP{}, "gentlemint/BurnSHRP", nil) - cdc.RegisterConcrete(MsgBurnSHR{}, "gentlemint/BurnSHR", nil) - cdc.RegisterConcrete(MsgLoadSHRP{}, "gentlemint/LoadSHRP", nil) - cdc.RegisterConcrete(MsgBuyCent{}, "gentlemint/BuyCent", nil) - cdc.RegisterConcrete(MsgEnrollSHRPLoaders{}, "gentlemint/EnrollSHRPLoaders", nil) - cdc.RegisterConcrete(MsgRevokeSHRPLoaders{}, "gentlemint/RevokeSHRPLoaders", nil) - cdc.RegisterConcrete(MsgBuySHR{}, "gentlemint/BuySHR", nil) - cdc.RegisterConcrete(MsgSetExchange{}, "gentlemint/SetExchange", nil) - cdc.RegisterConcrete(MsgSendSHRP{}, "gentlemint/SendSHRP", nil) - cdc.RegisterConcrete(MsgSendSHR{}, "gentlemint/SendSHR", nil) - - cdc.RegisterConcrete(MsgEnrollIDSigners{}, "gentlemint/MsgEnrollIDSigners", nil) - cdc.RegisterConcrete(MsgRevokeIDSigners{}, "gentlemint/MsgRevokeIDSigners", nil) - - cdc.RegisterConcrete(MsgEnrollDocIssuers{}, "gentlemint/MsgEnrollDocIssuers", nil) - cdc.RegisterConcrete(MsgRevokeDocIssuers{}, "gentlemint/MsgRevokeDocIssuers", nil) +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgBuyShr{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgBuyShr{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgBuyShr{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgSetExchange{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgSetLevelFee{}, + &MsgDeleteLevelFee{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgSetActionLevelFee{}, + &MsgDeleteActionLevelFee{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgLoadFee{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgLoad{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgSend{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgBurn{}, + ) + // this line is used by starport scaffolding # 3 - cdc.RegisterConcrete(MsgEnrollAccOperators{}, "gentlemint/MsgEnrollAccOperators", nil) - cdc.RegisterConcrete(MsgRevokeAccOperators{}, "gentlemint/MsgRevokeAccOperators", nil) + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } + +var ( + amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) +) diff --git a/x/gentlemint/types/errors.go b/x/gentlemint/types/errors.go index 72014a87..5eafe90b 100644 --- a/x/gentlemint/types/errors.go +++ b/x/gentlemint/types/errors.go @@ -1,17 +1,14 @@ package types +// DONTCOVER + import ( + "fmt" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" ) +// x/gentlemint module sentinel errors var ( - ErrSHRSupplyExceeded = sdkerrors.Register(ModuleName, 1, "SHR supply exceeded") - ErrInvalidExchangeRate = sdkerrors.New(ModuleName, 2, "Invalid exchange rate") - ErrDoesNotExist = sdkerrors.New(ModuleName, 3, "Does not exist") - - ErrSenderIsNotAuthority = "Sender is not authority" - ErrSenderIsNotAccountOperator = "Sender is not account operator" - - ErrSenderIsNotIssuer = "Sender is not document issuer" - ErrSenderIsNotIdSigner = "Sender is not id signer" + ErrBaseSupplyExceeded = sdkerrors.Register(ModuleName, 41, fmt.Sprintf("%v supply exceeded", denom.Base)) ) diff --git a/x/gentlemint/types/exchange_rate.pb.go b/x/gentlemint/types/exchange_rate.pb.go new file mode 100644 index 00000000..e0ca9909 --- /dev/null +++ b/x/gentlemint/types/exchange_rate.pb.go @@ -0,0 +1,316 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: gentlemint/exchange_rate.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type ExchangeRate struct { + Rate string `protobuf:"bytes,1,opt,name=rate,proto3" json:"rate,omitempty"` +} + +func (m *ExchangeRate) Reset() { *m = ExchangeRate{} } +func (m *ExchangeRate) String() string { return proto.CompactTextString(m) } +func (*ExchangeRate) ProtoMessage() {} +func (*ExchangeRate) Descriptor() ([]byte, []int) { + return fileDescriptor_e32923d681230718, []int{0} +} +func (m *ExchangeRate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExchangeRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ExchangeRate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ExchangeRate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExchangeRate.Merge(m, src) +} +func (m *ExchangeRate) XXX_Size() int { + return m.Size() +} +func (m *ExchangeRate) XXX_DiscardUnknown() { + xxx_messageInfo_ExchangeRate.DiscardUnknown(m) +} + +var xxx_messageInfo_ExchangeRate proto.InternalMessageInfo + +func (m *ExchangeRate) GetRate() string { + if m != nil { + return m.Rate + } + return "" +} + +func init() { + proto.RegisterType((*ExchangeRate)(nil), "shareledger.gentlemint.ExchangeRate") +} + +func init() { proto.RegisterFile("gentlemint/exchange_rate.proto", fileDescriptor_e32923d681230718) } + +var fileDescriptor_e32923d681230718 = []byte{ + // 176 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0x4f, 0xcd, 0x2b, + 0xc9, 0x49, 0xcd, 0xcd, 0xcc, 0x2b, 0xd1, 0x4f, 0xad, 0x48, 0xce, 0x48, 0xcc, 0x4b, 0x4f, 0x8d, + 0x2f, 0x4a, 0x2c, 0x49, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2b, 0xce, 0x48, 0x2c, + 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0x43, 0xa8, 0x95, 0x12, 0x49, 0xcf, 0x4f, 0xcf, + 0x07, 0x2b, 0xd1, 0x07, 0xb1, 0x20, 0xaa, 0x95, 0x94, 0xb8, 0x78, 0x5c, 0xa1, 0x86, 0x04, 0x25, + 0x96, 0xa4, 0x0a, 0x09, 0x71, 0xb1, 0x80, 0xcc, 0x92, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, + 0xb3, 0x9d, 0x7c, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, + 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x38, 0x3d, + 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6c, 0x6d, 0x51, 0x66, 0x5e, 0xba, + 0x3e, 0x92, 0x03, 0xf4, 0x2b, 0xf4, 0x91, 0x9c, 0x5b, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, + 0xb6, 0xd9, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x83, 0x35, 0x33, 0xc9, 0x00, 0x00, 0x00, +} + +func (m *ExchangeRate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExchangeRate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExchangeRate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Rate) > 0 { + i -= len(m.Rate) + copy(dAtA[i:], m.Rate) + i = encodeVarintExchangeRate(dAtA, i, uint64(len(m.Rate))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintExchangeRate(dAtA []byte, offset int, v uint64) int { + offset -= sovExchangeRate(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ExchangeRate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Rate) + if l > 0 { + n += 1 + l + sovExchangeRate(uint64(l)) + } + return n +} + +func sovExchangeRate(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozExchangeRate(x uint64) (n int) { + return sovExchangeRate(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ExchangeRate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowExchangeRate + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: ExchangeRate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExchangeRate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowExchangeRate + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthExchangeRate + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthExchangeRate + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipExchangeRate(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthExchangeRate + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipExchangeRate(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowExchangeRate + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowExchangeRate + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowExchangeRate + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthExchangeRate + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupExchangeRate + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthExchangeRate + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthExchangeRate = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowExchangeRate = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupExchangeRate = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/gentlemint/types/expected_keepers.go b/x/gentlemint/types/expected_keepers.go new file mode 100644 index 00000000..f0d66b3c --- /dev/null +++ b/x/gentlemint/types/expected_keepers.go @@ -0,0 +1,25 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +type BankKeeper interface { + // Methods imported from bank should be defined here + MintCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error + SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error + LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins + GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin + GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins + BurnCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error + GetSupply(ctx sdk.Context, denom string) sdk.Coin +} + +type AccountKeeper interface { + // Methods imported from account should be defined here + SetAccount(ctx sdk.Context, acc types.AccountI) + GetAccount(ctx sdk.Context, addr sdk.AccAddress) types.AccountI +} diff --git a/x/gentlemint/types/genesis.go b/x/gentlemint/types/genesis.go new file mode 100644 index 00000000..e9916a65 --- /dev/null +++ b/x/gentlemint/types/genesis.go @@ -0,0 +1,47 @@ +package types + +import ( + "fmt" +) + +// DefaultIndex is the default capability global index +const DefaultIndex uint64 = 1 + +// DefaultGenesis returns the default Capability genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{ + ExchangeRate: nil, + LevelFeeList: []LevelFee{}, + ActionLevelFeeList: []ActionLevelFee{}, + // this line is used by starport scaffolding # genesis/types/default + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + + // Check for duplicated index in levelFee + levelFeeIndexMap := make(map[string]struct{}) + + for _, elem := range gs.LevelFeeList { + index := string(LevelFeeKey(elem.Level)) + if _, ok := levelFeeIndexMap[index]; ok { + return fmt.Errorf("duplicated index for levelFee") + } + levelFeeIndexMap[index] = struct{}{} + } + // Check for duplicated index in actionLevelFee + actionLevelFeeIndexMap := make(map[string]struct{}) + + for _, elem := range gs.ActionLevelFeeList { + index := string(ActionLevelFeeKey(elem.Action)) + if _, ok := actionLevelFeeIndexMap[index]; ok { + return fmt.Errorf("duplicated index for actionLevelFee") + } + actionLevelFeeIndexMap[index] = struct{}{} + } + // this line is used by starport scaffolding # genesis/types/validate + + return nil +} diff --git a/x/gentlemint/types/genesis.pb.go b/x/gentlemint/types/genesis.pb.go new file mode 100644 index 00000000..b7779a82 --- /dev/null +++ b/x/gentlemint/types/genesis.pb.go @@ -0,0 +1,458 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: gentlemint/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the gentlemint module's genesis state. +type GenesisState struct { + ExchangeRate *ExchangeRate `protobuf:"bytes,1,opt,name=exchangeRate,proto3" json:"exchangeRate,omitempty"` + LevelFeeList []LevelFee `protobuf:"bytes,2,rep,name=levelFeeList,proto3" json:"levelFeeList"` + ActionLevelFeeList []ActionLevelFee `protobuf:"bytes,3,rep,name=actionLevelFeeList,proto3" json:"actionLevelFeeList"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_49e389fa8edb1952, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetExchangeRate() *ExchangeRate { + if m != nil { + return m.ExchangeRate + } + return nil +} + +func (m *GenesisState) GetLevelFeeList() []LevelFee { + if m != nil { + return m.LevelFeeList + } + return nil +} + +func (m *GenesisState) GetActionLevelFeeList() []ActionLevelFee { + if m != nil { + return m.ActionLevelFeeList + } + return nil +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "shareledger.gentlemint.GenesisState") +} + +func init() { proto.RegisterFile("gentlemint/genesis.proto", fileDescriptor_49e389fa8edb1952) } + +var fileDescriptor_49e389fa8edb1952 = []byte{ + // 290 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x48, 0x4f, 0xcd, 0x2b, + 0xc9, 0x49, 0xcd, 0xcd, 0xcc, 0x2b, 0xd1, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, + 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x2b, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, + 0x2d, 0xd2, 0x43, 0xa8, 0x92, 0x92, 0x43, 0xd2, 0x91, 0x5a, 0x91, 0x9c, 0x91, 0x98, 0x97, 0x9e, + 0x1a, 0x5f, 0x94, 0x58, 0x92, 0x0a, 0xd1, 0x27, 0x25, 0x85, 0x24, 0x9f, 0x93, 0x5a, 0x96, 0x9a, + 0x13, 0x9f, 0x96, 0x0a, 0x93, 0x53, 0x44, 0x92, 0x4b, 0x4c, 0x2e, 0xc9, 0xcc, 0xcf, 0x8b, 0x47, + 0x57, 0x22, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x66, 0xea, 0x83, 0x58, 0x10, 0x51, 0xa5, 0x26, 0x26, + 0x2e, 0x1e, 0x77, 0x88, 0xf3, 0x82, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0x3c, 0xb8, 0x78, 0x60, 0x96, + 0x07, 0x25, 0x96, 0xa4, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x1b, 0xa9, 0xe8, 0x61, 0x77, 0xb4, + 0x9e, 0x2b, 0x92, 0xda, 0x20, 0x14, 0x9d, 0x42, 0x5e, 0x5c, 0x3c, 0x60, 0x37, 0xb8, 0xa5, 0xa6, + 0xfa, 0x64, 0x16, 0x97, 0x48, 0x30, 0x29, 0x30, 0x6b, 0x70, 0x1b, 0x29, 0xe0, 0x32, 0xc9, 0x07, + 0xaa, 0xd6, 0x89, 0xe5, 0xc4, 0x3d, 0x79, 0x86, 0x20, 0x14, 0xbd, 0x42, 0x31, 0x5c, 0x42, 0x10, + 0x6f, 0xf9, 0x20, 0x9b, 0xc8, 0x0c, 0x36, 0x51, 0x0d, 0x97, 0x89, 0x8e, 0x28, 0x3a, 0xa0, 0xe6, + 0x62, 0x31, 0xc7, 0xc9, 0xf7, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, + 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x8c, + 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0xc1, 0xb6, 0x14, 0x65, 0xe6, + 0xa5, 0xeb, 0x23, 0xd9, 0xa7, 0x5f, 0xa1, 0x8f, 0x14, 0xf4, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, + 0x6c, 0xe0, 0xa0, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x93, 0xbb, 0x18, 0x03, 0x02, + 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ActionLevelFeeList) > 0 { + for iNdEx := len(m.ActionLevelFeeList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ActionLevelFeeList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.LevelFeeList) > 0 { + for iNdEx := len(m.LevelFeeList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.LevelFeeList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.ExchangeRate != nil { + { + size, err := m.ExchangeRate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ExchangeRate != nil { + l = m.ExchangeRate.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + if len(m.LevelFeeList) > 0 { + for _, e := range m.LevelFeeList { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.ActionLevelFeeList) > 0 { + for _, e := range m.ActionLevelFeeList { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExchangeRate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExchangeRate == nil { + m.ExchangeRate = &ExchangeRate{} + } + if err := m.ExchangeRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LevelFeeList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LevelFeeList = append(m.LevelFeeList, LevelFee{}) + if err := m.LevelFeeList[len(m.LevelFeeList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ActionLevelFeeList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ActionLevelFeeList = append(m.ActionLevelFeeList, ActionLevelFee{}) + if err := m.ActionLevelFeeList[len(m.ActionLevelFeeList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/gentlemint/types/genesis_test.go b/x/gentlemint/types/genesis_test.go new file mode 100644 index 00000000..e49a005f --- /dev/null +++ b/x/gentlemint/types/genesis_test.go @@ -0,0 +1,86 @@ +package types_test + +import ( + "testing" + + "github.com/sharering/shareledger/x/gentlemint/types" + "github.com/stretchr/testify/require" +) + +func TestGenesisState_Validate(t *testing.T) { + for _, tc := range []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + { + desc: "valid genesis state", + genState: &types.GenesisState{ + ExchangeRate: &types.ExchangeRate{ + Rate: "200", + }, + LevelFeeList: []types.LevelFee{ + { + Level: "0", + }, + { + Level: "1", + }, + }, + ActionLevelFeeList: []types.ActionLevelFee{ + { + Action: "0", + }, + { + Action: "1", + }, + }, + // this line is used by starport scaffolding # types/genesis/validField + }, + valid: true, + }, + { + desc: "duplicated levelFee", + genState: &types.GenesisState{ + LevelFeeList: []types.LevelFee{ + { + Level: "0", + }, + { + Level: "0", + }, + }, + }, + valid: false, + }, + { + desc: "duplicated actionLevelFee", + genState: &types.GenesisState{ + ActionLevelFeeList: []types.ActionLevelFee{ + { + Action: "0", + }, + { + Action: "0", + }, + }, + }, + valid: false, + }, + // this line is used by starport scaffolding # types/genesis/testcase + } { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/x/gentlemint/types/key.go b/x/gentlemint/types/key.go deleted file mode 100644 index 3b4f9199..00000000 --- a/x/gentlemint/types/key.go +++ /dev/null @@ -1,30 +0,0 @@ -package types - -const ( - // ModuleName is the name of the module - ModuleName = "gentlemint" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey is the module name router key - RouterKey = ModuleName - - // QuerierRoute to be used for querierer msgs - QuerierRoute = ModuleName - - IdSignerPrefix = "IdSigner" - DocIssuerPrefix = "DocIssuer" - AccOpPrefix = "AccOp" - - EventTypeEnrollAccOp = "enroll_account_operator" - EventTypeRevokeAccOp = "revoke_account_operator" - - EventTypeEnrollDocIssuer = "enroll_doc_issuer" - EventTypeRevokeDocIssuer = "revoke_doc_issuer" - - EventTypeEnrollIdSigner = "enroll_id_signer" - EventTypeRevokeIdSigner = "revoke_id_signer" - - EventAttrAddress = "address" -) diff --git a/x/gentlemint/types/key_action_level_fee.go b/x/gentlemint/types/key_action_level_fee.go new file mode 100644 index 00000000..e5c5b798 --- /dev/null +++ b/x/gentlemint/types/key_action_level_fee.go @@ -0,0 +1,23 @@ +package types + +import "encoding/binary" + +var _ binary.ByteOrder + +const ( + // ActionLevelFeeKeyPrefix is the prefix to retrieve all ActionLevelFee + ActionLevelFeeKeyPrefix = "ActionLevelFee/value/" +) + +// ActionLevelFeeKey returns the store key to retrieve a ActionLevelFee from the index fields +func ActionLevelFeeKey( + action string, +) []byte { + var key []byte + + actionBytes := []byte(action) + key = append(key, actionBytes...) + key = append(key, []byte("/")...) + + return key +} diff --git a/x/gentlemint/types/key_level_fee.go b/x/gentlemint/types/key_level_fee.go new file mode 100644 index 00000000..513b5286 --- /dev/null +++ b/x/gentlemint/types/key_level_fee.go @@ -0,0 +1,23 @@ +package types + +import "encoding/binary" + +var _ binary.ByteOrder + +const ( + // LevelFeeKeyPrefix is the prefix to retrieve all LevelFee + LevelFeeKeyPrefix = "LevelFee/value/" +) + +// LevelFeeKey returns the store key to retrieve a LevelFee from the index fields +func LevelFeeKey( + level string, +) []byte { + var key []byte + + levelBytes := []byte(level) + key = append(key, levelBytes...) + key = append(key, []byte("/")...) + + return key +} diff --git a/x/gentlemint/types/keys.go b/x/gentlemint/types/keys.go new file mode 100644 index 00000000..8a67b9ee --- /dev/null +++ b/x/gentlemint/types/keys.go @@ -0,0 +1,71 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +const ( + // ModuleName defines the module name + ModuleName = "gentlemint" + + ModuleNameAlias = "gm" + + // StoreKey defines the primary module store key + StoreKey = ModuleName + + // RouterKey is the message route for slashing + RouterKey = ModuleName + + // QuerierRoute defines the module's query routing key + QuerierRoute = ModuleName + + // MemStoreKey defines the in-memory store key + MemStoreKey = "mem_gentlemint" +) + +type ShrpStatus string + +var ( + StatusSHRPLoaderActived ShrpStatus = "actived" + StatusSHRPLoaderInactived ShrpStatus = "inactived" +) + +type Status string + +var ( + StatusActive Status = "active" + StatusInactive Status = "inactive" +) + +var ( + RequiredBaseAmt = sdk.NewCoin(denom.Base, sdk.NewInt(10*denom.ShrExponent)) + MaxBaseSupply = sdk.NewInt(4396000000 * denom.ShrExponent) + DefaultExchangeRateSHRPToSHR = sdk.NewDec(200) +) + +var ( + AllowanceLoader = sdk.NewCoins(sdk.NewCoin(denom.Base, sdk.NewInt(20*denom.ShrExponent))) +) + +var ( + // Event enroll acc op + EventTypeEnrollAccOp = "enroll_account_operator" + EventTypeRevokeAccOp = "revoke_account_operator" + // Event Type + EventTypeEnrollIdSigner = "enroll_id_signer" + EventTypeRevokeIdSigner = "revoke_id_signer" + + EventTypeRevokeDocIssuer = "revoke_doc_issuer" + EventTypeEnrollDocIssuer = "enroll_doc_issuer" + // Attr + EventAttrAddress = "address" +) + +func KeyPrefix(p string) []byte { + return []byte(p) +} + +const ( + ExchangeRateKey = "exchangeRate" +) diff --git a/x/gentlemint/types/level_fee.pb.go b/x/gentlemint/types/level_fee.pb.go new file mode 100644 index 00000000..30812515 --- /dev/null +++ b/x/gentlemint/types/level_fee.pb.go @@ -0,0 +1,764 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: gentlemint/level_fee.proto + +package types + +import ( + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type LevelFee struct { + Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"` + Fee types.DecCoin `protobuf:"bytes,2,opt,name=fee,proto3" json:"fee"` + Creator string `protobuf:"bytes,3,opt,name=creator,proto3" json:"creator,omitempty"` +} + +func (m *LevelFee) Reset() { *m = LevelFee{} } +func (m *LevelFee) String() string { return proto.CompactTextString(m) } +func (*LevelFee) ProtoMessage() {} +func (*LevelFee) Descriptor() ([]byte, []int) { + return fileDescriptor_b729e670765c5582, []int{0} +} +func (m *LevelFee) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LevelFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LevelFee.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LevelFee) XXX_Merge(src proto.Message) { + xxx_messageInfo_LevelFee.Merge(m, src) +} +func (m *LevelFee) XXX_Size() int { + return m.Size() +} +func (m *LevelFee) XXX_DiscardUnknown() { + xxx_messageInfo_LevelFee.DiscardUnknown(m) +} + +var xxx_messageInfo_LevelFee proto.InternalMessageInfo + +func (m *LevelFee) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +func (m *LevelFee) GetFee() types.DecCoin { + if m != nil { + return m.Fee + } + return types.DecCoin{} +} + +func (m *LevelFee) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +type LevelFeeDetail struct { + Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"` + Creator string `protobuf:"bytes,3,opt,name=creator,proto3" json:"creator,omitempty"` + OriginalFee types.DecCoin `protobuf:"bytes,2,opt,name=originalFee,proto3" json:"originalFee"` + ConvertedFee *types.Coin `protobuf:"bytes,4,opt,name=convertedFee,proto3" json:"convertedFee,omitempty"` +} + +func (m *LevelFeeDetail) Reset() { *m = LevelFeeDetail{} } +func (m *LevelFeeDetail) String() string { return proto.CompactTextString(m) } +func (*LevelFeeDetail) ProtoMessage() {} +func (*LevelFeeDetail) Descriptor() ([]byte, []int) { + return fileDescriptor_b729e670765c5582, []int{1} +} +func (m *LevelFeeDetail) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LevelFeeDetail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LevelFeeDetail.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LevelFeeDetail) XXX_Merge(src proto.Message) { + xxx_messageInfo_LevelFeeDetail.Merge(m, src) +} +func (m *LevelFeeDetail) XXX_Size() int { + return m.Size() +} +func (m *LevelFeeDetail) XXX_DiscardUnknown() { + xxx_messageInfo_LevelFeeDetail.DiscardUnknown(m) +} + +var xxx_messageInfo_LevelFeeDetail proto.InternalMessageInfo + +func (m *LevelFeeDetail) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +func (m *LevelFeeDetail) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *LevelFeeDetail) GetOriginalFee() types.DecCoin { + if m != nil { + return m.OriginalFee + } + return types.DecCoin{} +} + +func (m *LevelFeeDetail) GetConvertedFee() *types.Coin { + if m != nil { + return m.ConvertedFee + } + return nil +} + +func init() { + proto.RegisterType((*LevelFee)(nil), "shareledger.gentlemint.LevelFee") + proto.RegisterType((*LevelFeeDetail)(nil), "shareledger.gentlemint.LevelFeeDetail") +} + +func init() { proto.RegisterFile("gentlemint/level_fee.proto", fileDescriptor_b729e670765c5582) } + +var fileDescriptor_b729e670765c5582 = []byte{ + // 312 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0xcd, 0x4e, 0x32, 0x31, + 0x14, 0x86, 0xa7, 0x1f, 0x7c, 0xfe, 0x14, 0xe3, 0x62, 0x42, 0xcc, 0x48, 0x4c, 0x25, 0xac, 0x58, + 0xb5, 0x41, 0xdc, 0xba, 0x41, 0xe2, 0x4a, 0x37, 0x2c, 0xdd, 0x98, 0x99, 0x72, 0x28, 0x4d, 0x86, + 0x1e, 0xd2, 0xa9, 0x44, 0xef, 0xc2, 0x9b, 0x32, 0x61, 0xc9, 0xd2, 0x95, 0x31, 0x70, 0x23, 0xa6, + 0x1d, 0x89, 0x63, 0x22, 0x0b, 0x77, 0xe7, 0x34, 0xef, 0x79, 0x9e, 0x26, 0x2f, 0x6d, 0x29, 0x30, + 0x2e, 0x87, 0x99, 0x36, 0x4e, 0xe4, 0xb0, 0x80, 0xfc, 0x61, 0x02, 0xc0, 0xe7, 0x16, 0x1d, 0xc6, + 0x27, 0xc5, 0x34, 0xb5, 0x90, 0xc3, 0x58, 0x81, 0xe5, 0xdf, 0xb9, 0x16, 0x93, 0x58, 0xcc, 0xb0, + 0x10, 0x59, 0x5a, 0x80, 0x58, 0xf4, 0x32, 0x70, 0x69, 0x4f, 0x48, 0xd4, 0xa6, 0xbc, 0x6b, 0x35, + 0x15, 0x2a, 0x0c, 0xa3, 0xf0, 0x53, 0xf9, 0xda, 0x99, 0xd3, 0x83, 0x5b, 0x2f, 0xb8, 0x01, 0x88, + 0x9b, 0xf4, 0x7f, 0x90, 0x25, 0xa4, 0x4d, 0xba, 0x87, 0xa3, 0x72, 0x89, 0x2f, 0x69, 0x6d, 0x02, + 0x90, 0xfc, 0x6b, 0x93, 0x6e, 0xe3, 0xe2, 0x8c, 0x97, 0x16, 0xee, 0x2d, 0xfc, 0xcb, 0xc2, 0x87, + 0x20, 0xaf, 0x51, 0x9b, 0x41, 0x7d, 0xf9, 0x7e, 0x1e, 0x8d, 0x7c, 0x3c, 0x4e, 0xe8, 0xbe, 0xb4, + 0x90, 0x3a, 0xb4, 0x49, 0x2d, 0xd0, 0xb6, 0x6b, 0xe7, 0x95, 0xd0, 0xe3, 0xad, 0x72, 0x08, 0x2e, + 0xd5, 0xf9, 0x0e, 0xf1, 0x4e, 0x44, 0x3c, 0xa4, 0x0d, 0xb4, 0x5a, 0x69, 0x93, 0x7a, 0xc8, 0x1f, + 0xbe, 0x56, 0x3d, 0x8b, 0xaf, 0xe8, 0x91, 0x44, 0xb3, 0x00, 0xeb, 0x60, 0xec, 0x31, 0xf5, 0x80, + 0x39, 0xfd, 0x15, 0xe3, 0x19, 0xa3, 0x1f, 0xf1, 0xc1, 0xdd, 0x72, 0xcd, 0xc8, 0x6a, 0xcd, 0xc8, + 0xc7, 0x9a, 0x91, 0x97, 0x0d, 0x8b, 0x56, 0x1b, 0x16, 0xbd, 0x6d, 0x58, 0x74, 0xdf, 0x57, 0xda, + 0x4d, 0x1f, 0x33, 0x2e, 0x71, 0x26, 0x42, 0x59, 0x56, 0x1b, 0x25, 0x2a, 0xb5, 0x89, 0x27, 0x51, + 0x29, 0xd8, 0x3d, 0xcf, 0xa1, 0xc8, 0xf6, 0x42, 0x1f, 0xfd, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x64, 0x60, 0x32, 0xc1, 0xfb, 0x01, 0x00, 0x00, +} + +func (m *LevelFee) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LevelFee) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LevelFee) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintLevelFee(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0x1a + } + { + size, err := m.Fee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintLevelFee(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintLevelFee(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *LevelFeeDetail) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LevelFeeDetail) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LevelFeeDetail) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ConvertedFee != nil { + { + size, err := m.ConvertedFee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintLevelFee(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintLevelFee(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0x1a + } + { + size, err := m.OriginalFee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintLevelFee(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintLevelFee(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintLevelFee(dAtA []byte, offset int, v uint64) int { + offset -= sovLevelFee(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *LevelFee) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Level) + if l > 0 { + n += 1 + l + sovLevelFee(uint64(l)) + } + l = m.Fee.Size() + n += 1 + l + sovLevelFee(uint64(l)) + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovLevelFee(uint64(l)) + } + return n +} + +func (m *LevelFeeDetail) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Level) + if l > 0 { + n += 1 + l + sovLevelFee(uint64(l)) + } + l = m.OriginalFee.Size() + n += 1 + l + sovLevelFee(uint64(l)) + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovLevelFee(uint64(l)) + } + if m.ConvertedFee != nil { + l = m.ConvertedFee.Size() + n += 1 + l + sovLevelFee(uint64(l)) + } + return n +} + +func sovLevelFee(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozLevelFee(x uint64) (n int) { + return sovLevelFee(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *LevelFee) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: LevelFee: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LevelFee: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLevelFee + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLevelFee + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Fee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLevelFee + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipLevelFee(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthLevelFee + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LevelFeeDetail) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: LevelFeeDetail: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LevelFeeDetail: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLevelFee + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OriginalFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLevelFee + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.OriginalFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLevelFee + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConvertedFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLevelFee + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLevelFee + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLevelFee + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConvertedFee == nil { + m.ConvertedFee = &types.Coin{} + } + if err := m.ConvertedFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipLevelFee(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthLevelFee + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipLevelFee(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowLevelFee + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowLevelFee + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowLevelFee + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthLevelFee + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupLevelFee + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthLevelFee + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthLevelFee = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowLevelFee = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupLevelFee = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/gentlemint/types/message_burn.go b/x/gentlemint/types/message_burn.go new file mode 100644 index 00000000..39c17619 --- /dev/null +++ b/x/gentlemint/types/message_burn.go @@ -0,0 +1,52 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +var _ sdk.Msg = &MsgBurn{} + +func NewMsgBurn(creator string, coins sdk.DecCoins) *MsgBurn { + return &MsgBurn{ + Creator: creator, + Coins: coins, + } +} + +func (msg *MsgBurn) Route() string { + return RouterKey +} + +func (msg *MsgBurn) Type() string { + return "Burn" +} + +func (msg *MsgBurn) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgBurn) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgBurn) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + if err := msg.Coins.Validate(); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "coins string was not supported. Format should be {amount0}{denomination},...,{amountN}{denominationN}") + } + if err := denom.CheckSupportedCoins(msg.Coins, nil); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, err.Error()) + } + return nil +} diff --git a/x/gentlemint/types/message_burn_test.go b/x/gentlemint/types/message_burn_test.go new file mode 100644 index 00000000..9d59b8e0 --- /dev/null +++ b/x/gentlemint/types/message_burn_test.go @@ -0,0 +1,40 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgBurn_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgBurn + err error + }{ + { + name: "invalid address", + msg: MsgBurn{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgBurn{ + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/message_buy_shr.go b/x/gentlemint/types/message_buy_shr.go new file mode 100644 index 00000000..1659f939 --- /dev/null +++ b/x/gentlemint/types/message_buy_shr.go @@ -0,0 +1,53 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgBuyShr{} + +func NewMsgBuyShr(creator string, amount string) *MsgBuyShr { + return &MsgBuyShr{ + Creator: creator, + Amount: amount, + } +} + +func (msg *MsgBuyShr) Route() string { + return RouterKey +} + +func (msg *MsgBuyShr) Type() string { + return "BuyShr" +} + +func (msg *MsgBuyShr) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgBuyShr) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgBuyShr) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + v, e := sdk.NewDecFromStr(msg.Amount) + if e != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "invalid value. %s", e.Error()) + } + if v.LTE(sdk.NewDec(0)) { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "invalid value, should large then 0") + } + + return nil +} diff --git a/x/gentlemint/types/message_buy_shr_test.go b/x/gentlemint/types/message_buy_shr_test.go new file mode 100644 index 00000000..278152a8 --- /dev/null +++ b/x/gentlemint/types/message_buy_shr_test.go @@ -0,0 +1,41 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgBuyShr_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgBuyShr + err error + }{ + { + name: "invalid address", + msg: MsgBuyShr{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgBuyShr{ + Creator: sample.AccAddress(), + Amount: "1", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/message_load.go b/x/gentlemint/types/message_load.go new file mode 100644 index 00000000..1b0d2fe1 --- /dev/null +++ b/x/gentlemint/types/message_load.go @@ -0,0 +1,58 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +var _ sdk.Msg = &MsgLoad{} + +func NewMsgLoad(creator string, address string, coins sdk.DecCoins) *MsgLoad { + return &MsgLoad{ + Creator: creator, + Address: address, + Coins: coins, + } +} + +func (msg *MsgLoad) Route() string { + return RouterKey +} + +func (msg *MsgLoad) Type() string { + return "Load" +} + +func (msg *MsgLoad) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgLoad) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgLoad) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + _, err = sdk.AccAddressFromBech32(msg.Address) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid destination address (%s)", err) + } + + if err := msg.Coins.Validate(); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "coins string was not supported. Format should be {amount0}{denomination},...,{amountN}{denominationN}") + } + if err := denom.CheckSupportedCoins(msg.Coins, nil); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, err.Error()) + } + return nil +} diff --git a/x/gentlemint/types/message_load_fee.go b/x/gentlemint/types/message_load_fee.go new file mode 100644 index 00000000..330e173a --- /dev/null +++ b/x/gentlemint/types/message_load_fee.go @@ -0,0 +1,44 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgLoadFee{} + +func NewMsgLoadFee(creator string, shrp sdk.DecCoin) *MsgLoadFee { + return &MsgLoadFee{ + Creator: creator, + Shrp: &shrp, + } +} + +func (msg *MsgLoadFee) Route() string { + return RouterKey +} + +func (msg *MsgLoadFee) Type() string { + return "LoadFee" +} + +func (msg *MsgLoadFee) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgLoadFee) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgLoadFee) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} diff --git a/x/gentlemint/types/message_load_fee_test.go b/x/gentlemint/types/message_load_fee_test.go new file mode 100644 index 00000000..5b77e863 --- /dev/null +++ b/x/gentlemint/types/message_load_fee_test.go @@ -0,0 +1,40 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgLoadFee_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgLoadFee + err error + }{ + { + name: "invalid address", + msg: MsgLoadFee{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgLoadFee{ + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/message_load_test.go b/x/gentlemint/types/message_load_test.go new file mode 100644 index 00000000..f3ecfa44 --- /dev/null +++ b/x/gentlemint/types/message_load_test.go @@ -0,0 +1,44 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/types" + denom "github.com/sharering/shareledger/x/utils/demo" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgLoad_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgLoad + err error + }{ + { + name: "invalid address", + msg: MsgLoad{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgLoad{ + Creator: sample.AccAddress(), + Address: sample.AccAddress(), + Coins: types.NewDecCoins(types.NewDecCoinFromDec(denom.Shr, types.MustNewDecFromStr("1.1"))), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/message_send.go b/x/gentlemint/types/message_send.go new file mode 100644 index 00000000..9ccd0b2f --- /dev/null +++ b/x/gentlemint/types/message_send.go @@ -0,0 +1,59 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +var _ sdk.Msg = &MsgSend{} + +func NewMsgSend(creator string, address string, coins sdk.DecCoins) *MsgSend { + return &MsgSend{ + Creator: creator, + Address: address, + Coins: coins, + } +} + +func (msg *MsgSend) Route() string { + return RouterKey +} + +func (msg *MsgSend) Type() string { + return "Send" +} + +func (msg *MsgSend) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgSend) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgSend) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + _, err = sdk.AccAddressFromBech32(msg.Address) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid destination address (%s)", err) + } + + //coins, err := sdk.ParseDecCoins(msg.Coins) + //if err != nil { + // return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "coins string was not supported. Format should be {amount0}{denomination},...,{amountN}{denominationN}") + //} + if err := denom.CheckSupportedCoins(msg.Coins, nil); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, err.Error()) + } + return nil +} diff --git a/x/gentlemint/types/message_send_test.go b/x/gentlemint/types/message_send_test.go new file mode 100644 index 00000000..9aea1ab0 --- /dev/null +++ b/x/gentlemint/types/message_send_test.go @@ -0,0 +1,44 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/types" + denom "github.com/sharering/shareledger/x/utils/demo" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgSend_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgSend + err error + }{ + { + name: "invalid address", + msg: MsgSend{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgSend{ + Creator: sample.AccAddress(), + Address: sample.AccAddress(), + Coins: types.NewDecCoins(types.NewDecCoinFromDec(denom.Shr, types.MustNewDecFromStr("1.1"))), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/message_set_exchange.go b/x/gentlemint/types/message_set_exchange.go new file mode 100644 index 00000000..bc358746 --- /dev/null +++ b/x/gentlemint/types/message_set_exchange.go @@ -0,0 +1,48 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgSetExchange{} + +func NewMsgSetExchange(creator string, rate string) *MsgSetExchange { + return &MsgSetExchange{ + Creator: creator, + Rate: rate, + } +} + +func (msg *MsgSetExchange) Route() string { + return RouterKey +} + +func (msg *MsgSetExchange) Type() string { + return "SetExchange" +} + +func (msg *MsgSetExchange) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgSetExchange) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgSetExchange) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + + if _, err := sdk.NewDecFromStr(msg.Rate); err != nil { + return sdkerrors.Wrapf(err, "invalid number format %v", msg.Rate) + } + return nil +} diff --git a/x/gentlemint/types/message_set_exchange_test.go b/x/gentlemint/types/message_set_exchange_test.go new file mode 100644 index 00000000..aa583fd2 --- /dev/null +++ b/x/gentlemint/types/message_set_exchange_test.go @@ -0,0 +1,42 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgSetExchange_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgSetExchange + err error + }{ + { + name: "invalid address", + msg: MsgSetExchange{ + Rate: "200", + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgSetExchange{ + Rate: "200", + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/messages_action_level_fee.go b/x/gentlemint/types/messages_action_level_fee.go new file mode 100644 index 00000000..fa0ce700 --- /dev/null +++ b/x/gentlemint/types/messages_action_level_fee.go @@ -0,0 +1,91 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgSetActionLevelFee{} + +func NewMsgSetActionLevelFee( + creator string, + action string, + level string, + +) *MsgSetActionLevelFee { + return &MsgSetActionLevelFee{ + Creator: creator, + Action: action, + Level: level, + } +} + +func (msg *MsgSetActionLevelFee) Route() string { + return RouterKey +} + +func (msg *MsgSetActionLevelFee) Type() string { + return "CreateActionLevelFee" +} + +func (msg *MsgSetActionLevelFee) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgSetActionLevelFee) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgSetActionLevelFee) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} + +var _ sdk.Msg = &MsgDeleteActionLevelFee{} + +func NewMsgDeleteActionLevelFee( + creator string, + action string, + +) *MsgDeleteActionLevelFee { + return &MsgDeleteActionLevelFee{ + Creator: creator, + Action: action, + } +} +func (msg *MsgDeleteActionLevelFee) Route() string { + return RouterKey +} + +func (msg *MsgDeleteActionLevelFee) Type() string { + return "DeleteActionLevelFee" +} + +func (msg *MsgDeleteActionLevelFee) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgDeleteActionLevelFee) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgDeleteActionLevelFee) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} diff --git a/x/gentlemint/types/messages_action_level_fee_test.go b/x/gentlemint/types/messages_action_level_fee_test.go new file mode 100644 index 00000000..3e187cc4 --- /dev/null +++ b/x/gentlemint/types/messages_action_level_fee_test.go @@ -0,0 +1,102 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgCreateActionLevelFee_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgSetActionLevelFee + err error + }{ + { + name: "invalid address", + msg: MsgSetActionLevelFee{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgSetActionLevelFee{ + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +func TestMsgSetActionLevelFee_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgSetActionLevelFee + err error + }{ + { + name: "invalid address", + msg: MsgSetActionLevelFee{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgSetActionLevelFee{ + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +func TestMsgDeleteActionLevelFee_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgDeleteActionLevelFee + err error + }{ + { + name: "invalid address", + msg: MsgDeleteActionLevelFee{ + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgDeleteActionLevelFee{ + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/messages_level_fee.go b/x/gentlemint/types/messages_level_fee.go new file mode 100644 index 00000000..e9573f1f --- /dev/null +++ b/x/gentlemint/types/messages_level_fee.go @@ -0,0 +1,102 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + denom "github.com/sharering/shareledger/x/utils/demo" +) + +var _ sdk.Msg = &MsgSetLevelFee{} + +func NewMsgSetLevelFee( + creator string, + level string, + fee sdk.DecCoin, + +) *MsgSetLevelFee { + return &MsgSetLevelFee{ + Creator: creator, + Level: level, + Fee: fee, + } +} + +func (msg *MsgSetLevelFee) Route() string { + return RouterKey +} + +func (msg *MsgSetLevelFee) Type() string { + return "SetLevelFee" +} + +func (msg *MsgSetLevelFee) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgSetLevelFee) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgSetLevelFee) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + if err := msg.Fee.Validate(); err != nil { + return err + } + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, err.Error()) + } + if err := denom.CheckFeeSupportedCoin(msg.Fee); err != nil { + return err + } + + return nil +} + +var _ sdk.Msg = &MsgDeleteLevelFee{} + +func NewMsgDeleteLevelFee( + creator string, + level string, + +) *MsgDeleteLevelFee { + return &MsgDeleteLevelFee{ + Creator: creator, + Level: level, + } +} +func (msg *MsgDeleteLevelFee) Route() string { + return RouterKey +} + +func (msg *MsgDeleteLevelFee) Type() string { + return "DeleteLevelFee" +} + +func (msg *MsgDeleteLevelFee) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgDeleteLevelFee) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgDeleteLevelFee) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} diff --git a/x/gentlemint/types/messages_level_fee_test.go b/x/gentlemint/types/messages_level_fee_test.go new file mode 100644 index 00000000..92dd2ae4 --- /dev/null +++ b/x/gentlemint/types/messages_level_fee_test.go @@ -0,0 +1,115 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/constant" + denom "github.com/sharering/shareledger/x/utils/demo" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgCreateLevelFee_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgSetLevelFee + err error + }{ + { + name: "invalid address", + msg: MsgSetLevelFee{ + Level: string(constant.HighFee), + Fee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("10.9")), + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgSetLevelFee{ + Level: string(constant.HighFee), + Fee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("10.9")), + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +func TestMsgSetLevelFee_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgSetLevelFee + err error + }{ + { + name: "invalid address", + msg: MsgSetLevelFee{ + Level: string(constant.HighFee), + Fee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("10.9")), + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgSetLevelFee{ + Level: string(constant.HighFee), + Fee: sdk.NewDecCoinFromDec(denom.ShrP, sdk.MustNewDecFromStr("10.9")), + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +func TestMsgDeleteLevelFee_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgDeleteLevelFee + err error + }{ + { + name: "invalid address", + msg: MsgDeleteLevelFee{ + Level: string(constant.HighFee), + Creator: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgDeleteLevelFee{ + Level: string(constant.HighFee), + Creator: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/gentlemint/types/msgs.go b/x/gentlemint/types/msgs.go deleted file mode 100644 index 0d56e4b9..00000000 --- a/x/gentlemint/types/msgs.go +++ /dev/null @@ -1,523 +0,0 @@ -package types - -import ( - "fmt" - "strconv" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeLoadSHRMsg = "load_shr" - TypeLoadSHRPMsg = "load_shrp" - TypeBurnSHRPMsg = "burn_shrp" - TypeBurnSHRMsg = "burn_shr" - TypeBuyCent = "buy_cent" - TypeEnrollSHRPLoaderMsg = "enroll_shrp_loader" - TypeRevokeSHRPLoaderMsg = "revoke_shrp_loader" - TypeBuySHRMsg = "buy_shr" - TypeMsgSetExchange = "set_exchange" - TypeMsgSendSHR = "send_shr" - TypeMsgSendSHRP = "send_shrp" -) - -type MsgLoadSHR struct { - Approver sdk.AccAddress `json:"approver"` - Receiver sdk.AccAddress `json:"receiver"` - Amount string `json:"amount"` -} - -func NewMsgLoadSHR(approver, receiver sdk.AccAddress, amount string) MsgLoadSHR { - return MsgLoadSHR{ - Approver: approver, - Receiver: receiver, - Amount: amount, - } -} - -func (msg MsgLoadSHR) Route() string { - return RouterKey -} - -func (msg MsgLoadSHR) Type() string { - return TypeLoadSHRMsg -} - -func (msg MsgLoadSHR) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if msg.Receiver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Receiver.String()) - } - // if msg.Amount <= 0 { - // return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, "Amount must be positive") - // } - amount, ok := sdk.NewIntFromString(msg.Amount) - if !ok || amount.LTE(sdk.ZeroInt()) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, fmt.Sprintf("Invalid amount number %s", msg.Amount)) - } - return nil -} - -func (msg MsgLoadSHR) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgLoadSHR) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgBuyCent struct { - Buyer sdk.AccAddress `json:"buyer"` - Amount int `json:"amount"` -} - -func NewMsgBuyCent(buyer sdk.AccAddress, amount int) MsgBuyCent { - return MsgBuyCent{ - Buyer: buyer, - Amount: amount, - } -} - -func (msg MsgBuyCent) Route() string { - return RouterKey -} - -func (msg MsgBuyCent) Type() string { - return TypeBuyCent -} - -func (msg MsgBuyCent) ValidateBasic() error { - if msg.Buyer.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Buyer.String()) - } - - if msg.Amount <= 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, "Amount must be positive") - } - return nil -} - -func (msg MsgBuyCent) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgBuyCent) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Buyer} -} - -type MsgBuySHR struct { - Buyer sdk.AccAddress `json:"buyer"` - Amount string `json:"amount"` -} - -func NewMsgBuySHR(buyer sdk.AccAddress, amount string) MsgBuySHR { - return MsgBuySHR{ - Buyer: buyer, - Amount: amount, - } -} - -func (msg MsgBuySHR) Route() string { - return RouterKey -} - -func (msg MsgBuySHR) Type() string { - return TypeBuySHRMsg -} - -func (msg MsgBuySHR) ValidateBasic() error { - if msg.Buyer.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Buyer.String()) - } - - amount, ok := sdk.NewIntFromString(msg.Amount) - if !ok || amount.LTE(sdk.ZeroInt()) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Amount must be positive") - } - return nil -} - -func (msg MsgBuySHR) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgBuySHR) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Buyer} -} - -type MsgBurnSHRP struct { - Approver sdk.AccAddress `json:"approver"` - Amount string `json:"amount"` -} - -func NewMsgBurnSHRP(approver sdk.AccAddress, amt string) MsgBurnSHRP { - return MsgBurnSHRP{ - Approver: approver, - Amount: amt, - } -} - -func (msg MsgBurnSHRP) Route() string { - return RouterKey -} - -func (msg MsgBurnSHRP) Type() string { - return TypeBurnSHRPMsg -} - -func (msg MsgBurnSHRP) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - - // if _, _, err := ParseCoinStr(msg.Amount); err != nil { - // return err - // } - amount, ok := sdk.NewIntFromString(msg.Amount) - if !ok || amount.LTE(sdk.ZeroInt()) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Amount must be positive") - } - return nil -} - -func (msg MsgBurnSHRP) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgBurnSHRP) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgBurnSHR struct { - Approver sdk.AccAddress `json:"approver"` - Amount string `json:"amount"` -} - -func NewMsgBurnSHR(approver sdk.AccAddress, amt string) MsgBurnSHR { - return MsgBurnSHR{ - Approver: approver, - Amount: amt, - } -} - -func (msg MsgBurnSHR) Route() string { - return RouterKey -} - -func (msg MsgBurnSHR) Type() string { - return TypeBurnSHRMsg -} - -func (msg MsgBurnSHR) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - amount, ok := sdk.NewIntFromString(msg.Amount) - if !ok || amount.LTE(sdk.ZeroInt()) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Amount must be positive") - } - return nil -} - -func (msg MsgBurnSHR) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgBurnSHR) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgLoadSHRP struct { - Approver sdk.AccAddress `json:"approver"` - Receiver sdk.AccAddress `json:"receiver"` - Amount string `json:"amount"` -} - -func NewMsgLoadSHRP(approver, receiver sdk.AccAddress, amount string) MsgLoadSHRP { - return MsgLoadSHRP{ - Approver: approver, - Receiver: receiver, - Amount: amount, - } -} - -func (msg MsgLoadSHRP) Route() string { - return RouterKey -} - -func (msg MsgLoadSHRP) Type() string { - return TypeLoadSHRPMsg -} - -func (msg MsgLoadSHRP) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if msg.Receiver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Receiver.String()) - } - // if _, _, err := ParseCoinStr(msg.Amount); err != nil { - // return err - // } - amount, ok := sdk.NewIntFromString(msg.Amount) - if !ok || amount.LTE(sdk.ZeroInt()) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, fmt.Sprintf("Invalid amount number %s", msg.Amount)) - } - return nil -} - -func (msg MsgLoadSHRP) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgLoadSHRP) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgSendSHRP struct { - Sender sdk.AccAddress `json:"sender"` - Receiver sdk.AccAddress `json:"receiver"` - Amount string `json:"amount"` -} - -func NewMsgSendSHRP(sender, receiver sdk.AccAddress, amount string) MsgSendSHRP { - return MsgSendSHRP{ - Sender: sender, - Receiver: receiver, - Amount: amount, - } -} - -func (msg MsgSendSHRP) Route() string { - return RouterKey -} - -func (msg MsgSendSHRP) Type() string { - return TypeMsgSendSHRP -} - -func (msg MsgSendSHRP) ValidateBasic() error { - if msg.Sender.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender.String()) - } - if msg.Receiver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Receiver.String()) - } - amount, ok := sdk.NewIntFromString(msg.Amount) - if !ok || amount.LTE(sdk.NewInt(0)) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Amount must be positive") - } - - // if _, _, err := ParseCoinStr(msg.Amount); err != nil { - // return err - // } - return nil -} - -func (msg MsgSendSHRP) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgSendSHRP) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Sender} -} - -type MsgSendSHR struct { - Sender sdk.AccAddress `json:"sender"` - Receiver sdk.AccAddress `json:"receiver"` - Amount string `json:"amount"` -} - -func NewMsgSendSHR(sender, receiver sdk.AccAddress, amount string) MsgSendSHR { - return MsgSendSHR{ - Sender: sender, - Receiver: receiver, - Amount: amount, - } -} - -func (msg MsgSendSHR) Route() string { - return RouterKey -} - -func (msg MsgSendSHR) Type() string { - return TypeMsgSendSHR -} - -func (msg MsgSendSHR) ValidateBasic() error { - if msg.Sender.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender.String()) - } - if msg.Receiver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Receiver.String()) - } - - amount, ok := sdk.NewIntFromString(msg.Amount) - if !ok || amount.LTE(sdk.NewInt(0)) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Amount must be positive") - } - // if !(msg.Amount > 0) { - // return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Amount must be positive") - // } - return nil -} - -func (msg MsgSendSHR) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgSendSHR) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Sender} -} - -type MsgEnrollSHRPLoaders struct { - Approver sdk.AccAddress `json:"approver"` - SHRPLoaders []sdk.AccAddress `json:"shrploaders"` -} - -func NewMsgEnrollSHRPLoaders(approver sdk.AccAddress, loaders []sdk.AccAddress) MsgEnrollSHRPLoaders { - return MsgEnrollSHRPLoaders{ - Approver: approver, - SHRPLoaders: loaders, - } -} - -func (msg MsgEnrollSHRPLoaders) Route() string { - return RouterKey -} - -func (msg MsgEnrollSHRPLoaders) Type() string { - return TypeEnrollSHRPLoaderMsg -} - -func (msg MsgEnrollSHRPLoaders) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.SHRPLoaders) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The signers list are empty") - } - for _, addr := range msg.SHRPLoaders { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Signer address empty") - } - } - return nil -} - -func (msg MsgEnrollSHRPLoaders) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgEnrollSHRPLoaders) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgRevokeSHRPLoaders struct { - Approver sdk.AccAddress `json:"approver"` - SHRPLoaders []sdk.AccAddress `json:"receiver"` -} - -func NewMsgRevokeSHRPLoaders(approver sdk.AccAddress, loaders []sdk.AccAddress) MsgRevokeSHRPLoaders { - return MsgRevokeSHRPLoaders{ - Approver: approver, - SHRPLoaders: loaders, - } -} - -func (msg MsgRevokeSHRPLoaders) Route() string { - return RouterKey -} - -func (msg MsgRevokeSHRPLoaders) Type() string { - return TypeRevokeSHRPLoaderMsg -} - -func (msg MsgRevokeSHRPLoaders) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.SHRPLoaders) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The signers list are empty") - } - for _, addr := range msg.SHRPLoaders { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Signer address empty") - } - } - return nil -} - -func (msg MsgRevokeSHRPLoaders) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgRevokeSHRPLoaders) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgSetExchange struct { - Approver sdk.AccAddress `json:"approver"` - Rate string `json:"rate"` -} - -func NewMsgSetExchange(approver sdk.AccAddress, rate string) MsgSetExchange { - return MsgSetExchange{ - Approver: approver, - Rate: rate, - } -} - -func (msg MsgSetExchange) Route() string { - return RouterKey -} - -func (msg MsgSetExchange) Type() string { - return TypeMsgSetExchange -} - -func (msg MsgSetExchange) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - rate, ok := sdk.NewIntFromString(msg.Rate) - if !ok || rate.LTE(sdk.NewInt(0)) { - return ErrInvalidExchangeRate - } - return nil -} - -func (msg MsgSetExchange) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgSetExchange) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -func ParseCoinStr(s string) (i, d int64, err error) { - f, err := strconv.ParseFloat(s, 64) - if err != nil { - return i, d, err - } - if f < 0 { - return i, d, sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "Negative Coins are not accepted") - } - i = int64(f) - - d = int64(f*100 - float64(i*100)) - return -} - -func ParseCoinFloat(f float64) (i, d int64, err error) { - - if f < 0 { - return i, d, sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "Negative Coins are not accepted") - } - i = int64(f) - d = int64(f*100 - float64(i*100) + 1) // make sure always round it up - return -} diff --git a/x/gentlemint/types/msgs_acc_operator.go b/x/gentlemint/types/msgs_acc_operator.go deleted file mode 100644 index 730b959d..00000000 --- a/x/gentlemint/types/msgs_acc_operator.go +++ /dev/null @@ -1,109 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeEnrollAccOperatorMsg = "enroll_account_operator" - TypeRevokeAccOperatorMsg = "revoke_account_operator" -) - -type MsgEnrollAccOperators struct { - Approver sdk.AccAddress `json:"approver"` - Operators []sdk.AccAddress `json:"operators"` -} - -func NewMsgEnrollAccOperators(approver sdk.AccAddress, operators []sdk.AccAddress) MsgEnrollAccOperators { - return MsgEnrollAccOperators{ - Approver: approver, - Operators: operators, - } -} - -func (msg MsgEnrollAccOperators) Route() string { - return RouterKey -} - -func (msg MsgEnrollAccOperators) Type() string { - return TypeEnrollAccOperatorMsg -} - -func (msg MsgEnrollAccOperators) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.Operators) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The account list are empty") - } - for _, addr := range msg.Operators { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Account address empty") - } - } - return nil -} - -func (msg MsgEnrollAccOperators) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgEnrollAccOperators) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -func (msg MsgEnrollAccOperators) String() string { - rs := fmt.Sprintf("MsgEnrollAccOperators(%s:%v)", msg.Approver, msg.Operators) - return rs -} - -type MsgRevokeAccOperators struct { - Approver sdk.AccAddress `json:"approver"` - Operators []sdk.AccAddress `json:"operators"` -} - -func NewMsgRevokeAccOperators(approver sdk.AccAddress, accs []sdk.AccAddress) MsgRevokeAccOperators { - return MsgRevokeAccOperators{ - Approver: approver, - Operators: accs, - } -} - -func (msg MsgRevokeAccOperators) Route() string { - return RouterKey -} - -func (msg MsgRevokeAccOperators) Type() string { - return TypeRevokeAccOperatorMsg -} - -func (msg MsgRevokeAccOperators) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.Operators) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The account list are empty") - } - - for _, addr := range msg.Operators { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Account address empty") - } - } - return nil -} - -func (msg MsgRevokeAccOperators) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgRevokeAccOperators) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -func (msg MsgRevokeAccOperators) String() string { - return fmt.Sprintf("MsgRevokeAccOperators(%s, %v)", msg.Approver.String(), msg.Operators) -} diff --git a/x/gentlemint/types/msgs_document.go b/x/gentlemint/types/msgs_document.go deleted file mode 100644 index 4d3914f7..00000000 --- a/x/gentlemint/types/msgs_document.go +++ /dev/null @@ -1,108 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeEnrollDocIssuerMsg = "enroll_doc_issuer" - TypeRevokeDocIssuerMsg = "revoke_doc_issuer" -) - -type MsgEnrollDocIssuers struct { - Approver sdk.AccAddress `json:"approver"` - Issuers []sdk.AccAddress `json:"issuers"` -} - -func NewMsgEnrollDocIssuers(approver sdk.AccAddress, issuers []sdk.AccAddress) MsgEnrollDocIssuers { - return MsgEnrollDocIssuers{ - Approver: approver, - Issuers: issuers, - } -} - -func (msg MsgEnrollDocIssuers) Route() string { - return RouterKey -} - -func (msg MsgEnrollDocIssuers) Type() string { - return TypeEnrollDocIssuerMsg -} - -func (msg MsgEnrollDocIssuers) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.Issuers) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The issuer list are empty") - } - for _, addr := range msg.Issuers { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Issuer address empty") - } - } - return nil -} - -func (msg MsgEnrollDocIssuers) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgEnrollDocIssuers) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -func (msg MsgEnrollDocIssuers) String() string { - rs := fmt.Sprintf("MsgEnrollDocIssuers(%s:%v)", msg.Approver, msg.Issuers) - return rs -} - -type MsgRevokeDocIssuers struct { - Approver sdk.AccAddress `json:"approver"` - Issuers []sdk.AccAddress `json:"issuers"` -} - -func NewMsgRevokeDocIssuers(approver sdk.AccAddress, signers []sdk.AccAddress) MsgRevokeDocIssuers { - return MsgRevokeDocIssuers{ - Approver: approver, - Issuers: signers, - } -} - -func (msg MsgRevokeDocIssuers) Route() string { - return RouterKey -} - -func (msg MsgRevokeDocIssuers) Type() string { - return TypeRevokeDocIssuerMsg -} - -func (msg MsgRevokeDocIssuers) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.Issuers) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The signers list are empty") - } - for _, addr := range msg.Issuers { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Signer address empty") - } - } - return nil -} - -func (msg MsgRevokeDocIssuers) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgRevokeDocIssuers) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -func (msg MsgRevokeDocIssuers) String() string { - return fmt.Sprintf("MsgRevokeDocIssuers(%s, %v)", msg.Approver.String(), msg.Issuers) -} diff --git a/x/gentlemint/types/msgs_id.go b/x/gentlemint/types/msgs_id.go deleted file mode 100644 index ac1ac401..00000000 --- a/x/gentlemint/types/msgs_id.go +++ /dev/null @@ -1,108 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeEnrollIDSignersMsg = "enroll_id_signers" - TypeRevokeIDSignersMsg = "revoke_id_signers" -) - -type MsgEnrollIDSigners struct { - Approver sdk.AccAddress `json:"approver"` - IDSigners []sdk.AccAddress `json:"id_signers"` -} - -func NewMsgEnrollIDSigners(approver sdk.AccAddress, signers []sdk.AccAddress) MsgEnrollIDSigners { - return MsgEnrollIDSigners{ - Approver: approver, - IDSigners: signers, - } -} - -func (msg MsgEnrollIDSigners) Route() string { - return RouterKey -} - -func (msg MsgEnrollIDSigners) Type() string { - return TypeEnrollIDSignersMsg -} - -func (msg MsgEnrollIDSigners) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.IDSigners) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The signers list are empty") - } - for _, addr := range msg.IDSigners { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Signer address empty") - } - } - return nil -} - -func (msg MsgEnrollIDSigners) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgEnrollIDSigners) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -func (msg MsgEnrollIDSigners) String() string { - rs := fmt.Sprintf("MsgEnrollIDSigners(%s:%v)", msg.Approver, msg.IDSigners) - return rs -} - -type MsgRevokeIDSigners struct { - Approver sdk.AccAddress `json:"approver"` - IDSigners []sdk.AccAddress `json:"id_signers"` -} - -func NewMsgRevokeIDSigners(approver sdk.AccAddress, signers []sdk.AccAddress) MsgRevokeIDSigners { - return MsgRevokeIDSigners{ - Approver: approver, - IDSigners: signers, - } -} - -func (msg MsgRevokeIDSigners) Route() string { - return RouterKey -} - -func (msg MsgRevokeIDSigners) Type() string { - return TypeRevokeIDSignersMsg -} - -func (msg MsgRevokeIDSigners) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.IDSigners) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The signers list are empty") - } - for _, addr := range msg.IDSigners { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Signer address empty") - } - } - return nil -} - -func (msg MsgRevokeIDSigners) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgRevokeIDSigners) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -func (msg MsgRevokeIDSigners) String() string { - return fmt.Sprintf("MsgRevokeIDSigners(%s, %v)", msg.Approver.String(), msg.IDSigners) -} diff --git a/x/gentlemint/types/query.pb.go b/x/gentlemint/types/query.pb.go new file mode 100644 index 00000000..f4100ec0 --- /dev/null +++ b/x/gentlemint/types/query.pb.go @@ -0,0 +1,3076 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: gentlemint/query.proto + +package types + +import ( + context "context" + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryExchangeRateRequest struct { +} + +func (m *QueryExchangeRateRequest) Reset() { *m = QueryExchangeRateRequest{} } +func (m *QueryExchangeRateRequest) String() string { return proto.CompactTextString(m) } +func (*QueryExchangeRateRequest) ProtoMessage() {} +func (*QueryExchangeRateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{0} +} +func (m *QueryExchangeRateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryExchangeRateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryExchangeRateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryExchangeRateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryExchangeRateRequest.Merge(m, src) +} +func (m *QueryExchangeRateRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryExchangeRateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryExchangeRateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryExchangeRateRequest proto.InternalMessageInfo + +type QueryExchangeRateResponse struct { + Rate string `protobuf:"bytes,1,opt,name=rate,proto3" json:"rate,omitempty"` +} + +func (m *QueryExchangeRateResponse) Reset() { *m = QueryExchangeRateResponse{} } +func (m *QueryExchangeRateResponse) String() string { return proto.CompactTextString(m) } +func (*QueryExchangeRateResponse) ProtoMessage() {} +func (*QueryExchangeRateResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{1} +} +func (m *QueryExchangeRateResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryExchangeRateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryExchangeRateResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryExchangeRateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryExchangeRateResponse.Merge(m, src) +} +func (m *QueryExchangeRateResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryExchangeRateResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryExchangeRateResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryExchangeRateResponse proto.InternalMessageInfo + +func (m *QueryExchangeRateResponse) GetRate() string { + if m != nil { + return m.Rate + } + return "" +} + +type QueryLevelFeeRequest struct { + Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"` +} + +func (m *QueryLevelFeeRequest) Reset() { *m = QueryLevelFeeRequest{} } +func (m *QueryLevelFeeRequest) String() string { return proto.CompactTextString(m) } +func (*QueryLevelFeeRequest) ProtoMessage() {} +func (*QueryLevelFeeRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{2} +} +func (m *QueryLevelFeeRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLevelFeeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLevelFeeRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLevelFeeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLevelFeeRequest.Merge(m, src) +} +func (m *QueryLevelFeeRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryLevelFeeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLevelFeeRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLevelFeeRequest proto.InternalMessageInfo + +func (m *QueryLevelFeeRequest) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +type QueryLevelFeeResponse struct { + LevelFee LevelFeeDetail `protobuf:"bytes,1,opt,name=levelFee,proto3" json:"levelFee"` +} + +func (m *QueryLevelFeeResponse) Reset() { *m = QueryLevelFeeResponse{} } +func (m *QueryLevelFeeResponse) String() string { return proto.CompactTextString(m) } +func (*QueryLevelFeeResponse) ProtoMessage() {} +func (*QueryLevelFeeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{3} +} +func (m *QueryLevelFeeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLevelFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLevelFeeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLevelFeeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLevelFeeResponse.Merge(m, src) +} +func (m *QueryLevelFeeResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryLevelFeeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLevelFeeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLevelFeeResponse proto.InternalMessageInfo + +func (m *QueryLevelFeeResponse) GetLevelFee() LevelFeeDetail { + if m != nil { + return m.LevelFee + } + return LevelFeeDetail{} +} + +type QueryLevelFeesRequest struct { +} + +func (m *QueryLevelFeesRequest) Reset() { *m = QueryLevelFeesRequest{} } +func (m *QueryLevelFeesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryLevelFeesRequest) ProtoMessage() {} +func (*QueryLevelFeesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{4} +} +func (m *QueryLevelFeesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLevelFeesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLevelFeesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLevelFeesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLevelFeesRequest.Merge(m, src) +} +func (m *QueryLevelFeesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryLevelFeesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLevelFeesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLevelFeesRequest proto.InternalMessageInfo + +type QueryLevelFeesResponse struct { + LevelFees []LevelFeeDetail `protobuf:"bytes,1,rep,name=levelFees,proto3" json:"levelFees"` +} + +func (m *QueryLevelFeesResponse) Reset() { *m = QueryLevelFeesResponse{} } +func (m *QueryLevelFeesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryLevelFeesResponse) ProtoMessage() {} +func (*QueryLevelFeesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{5} +} +func (m *QueryLevelFeesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryLevelFeesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryLevelFeesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryLevelFeesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryLevelFeesResponse.Merge(m, src) +} +func (m *QueryLevelFeesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryLevelFeesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryLevelFeesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryLevelFeesResponse proto.InternalMessageInfo + +func (m *QueryLevelFeesResponse) GetLevelFees() []LevelFeeDetail { + if m != nil { + return m.LevelFees + } + return nil +} + +type QueryActionLevelFeeRequest struct { + Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` +} + +func (m *QueryActionLevelFeeRequest) Reset() { *m = QueryActionLevelFeeRequest{} } +func (m *QueryActionLevelFeeRequest) String() string { return proto.CompactTextString(m) } +func (*QueryActionLevelFeeRequest) ProtoMessage() {} +func (*QueryActionLevelFeeRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{6} +} +func (m *QueryActionLevelFeeRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryActionLevelFeeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryActionLevelFeeRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryActionLevelFeeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryActionLevelFeeRequest.Merge(m, src) +} +func (m *QueryActionLevelFeeRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryActionLevelFeeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryActionLevelFeeRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryActionLevelFeeRequest proto.InternalMessageInfo + +func (m *QueryActionLevelFeeRequest) GetAction() string { + if m != nil { + return m.Action + } + return "" +} + +type QueryActionLevelFeeResponse struct { + Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` + Level string `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"` + Fee string `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee,omitempty"` +} + +func (m *QueryActionLevelFeeResponse) Reset() { *m = QueryActionLevelFeeResponse{} } +func (m *QueryActionLevelFeeResponse) String() string { return proto.CompactTextString(m) } +func (*QueryActionLevelFeeResponse) ProtoMessage() {} +func (*QueryActionLevelFeeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{7} +} +func (m *QueryActionLevelFeeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryActionLevelFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryActionLevelFeeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryActionLevelFeeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryActionLevelFeeResponse.Merge(m, src) +} +func (m *QueryActionLevelFeeResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryActionLevelFeeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryActionLevelFeeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryActionLevelFeeResponse proto.InternalMessageInfo + +func (m *QueryActionLevelFeeResponse) GetAction() string { + if m != nil { + return m.Action + } + return "" +} + +func (m *QueryActionLevelFeeResponse) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +func (m *QueryActionLevelFeeResponse) GetFee() string { + if m != nil { + return m.Fee + } + return "" +} + +type QueryActionLevelFeesRequest struct { +} + +func (m *QueryActionLevelFeesRequest) Reset() { *m = QueryActionLevelFeesRequest{} } +func (m *QueryActionLevelFeesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryActionLevelFeesRequest) ProtoMessage() {} +func (*QueryActionLevelFeesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{8} +} +func (m *QueryActionLevelFeesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryActionLevelFeesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryActionLevelFeesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryActionLevelFeesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryActionLevelFeesRequest.Merge(m, src) +} +func (m *QueryActionLevelFeesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryActionLevelFeesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryActionLevelFeesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryActionLevelFeesRequest proto.InternalMessageInfo + +type QueryActionLevelFeesResponse struct { + ActionLevelFee []ActionLevelFee `protobuf:"bytes,1,rep,name=actionLevelFee,proto3" json:"actionLevelFee"` +} + +func (m *QueryActionLevelFeesResponse) Reset() { *m = QueryActionLevelFeesResponse{} } +func (m *QueryActionLevelFeesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryActionLevelFeesResponse) ProtoMessage() {} +func (*QueryActionLevelFeesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{9} +} +func (m *QueryActionLevelFeesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryActionLevelFeesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryActionLevelFeesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryActionLevelFeesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryActionLevelFeesResponse.Merge(m, src) +} +func (m *QueryActionLevelFeesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryActionLevelFeesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryActionLevelFeesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryActionLevelFeesResponse proto.InternalMessageInfo + +func (m *QueryActionLevelFeesResponse) GetActionLevelFee() []ActionLevelFee { + if m != nil { + return m.ActionLevelFee + } + return nil +} + +type QueryCheckFeesRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Actions []string `protobuf:"bytes,2,rep,name=actions,proto3" json:"actions,omitempty"` +} + +func (m *QueryCheckFeesRequest) Reset() { *m = QueryCheckFeesRequest{} } +func (m *QueryCheckFeesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryCheckFeesRequest) ProtoMessage() {} +func (*QueryCheckFeesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{10} +} +func (m *QueryCheckFeesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCheckFeesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCheckFeesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCheckFeesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCheckFeesRequest.Merge(m, src) +} +func (m *QueryCheckFeesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryCheckFeesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCheckFeesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCheckFeesRequest proto.InternalMessageInfo + +func (m *QueryCheckFeesRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *QueryCheckFeesRequest) GetActions() []string { + if m != nil { + return m.Actions + } + return nil +} + +type QueryCheckFeesResponse struct { + ConvertedFee *types.Coin `protobuf:"bytes,1,opt,name=convertedFee,proto3" json:"convertedFee,omitempty"` + SufficientFee bool `protobuf:"varint,2,opt,name=sufficientFee,proto3" json:"sufficientFee,omitempty"` + SufficientFundForFee bool `protobuf:"varint,3,opt,name=sufficientFundForFee,proto3" json:"sufficientFundForFee,omitempty"` + CostLoadingFee *types.DecCoin `protobuf:"bytes,4,opt,name=costLoadingFee,proto3" json:"costLoadingFee,omitempty"` +} + +func (m *QueryCheckFeesResponse) Reset() { *m = QueryCheckFeesResponse{} } +func (m *QueryCheckFeesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryCheckFeesResponse) ProtoMessage() {} +func (*QueryCheckFeesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{11} +} +func (m *QueryCheckFeesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCheckFeesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCheckFeesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCheckFeesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCheckFeesResponse.Merge(m, src) +} +func (m *QueryCheckFeesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryCheckFeesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCheckFeesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCheckFeesResponse proto.InternalMessageInfo + +func (m *QueryCheckFeesResponse) GetConvertedFee() *types.Coin { + if m != nil { + return m.ConvertedFee + } + return nil +} + +func (m *QueryCheckFeesResponse) GetSufficientFee() bool { + if m != nil { + return m.SufficientFee + } + return false +} + +func (m *QueryCheckFeesResponse) GetSufficientFundForFee() bool { + if m != nil { + return m.SufficientFundForFee + } + return false +} + +func (m *QueryCheckFeesResponse) GetCostLoadingFee() *types.DecCoin { + if m != nil { + return m.CostLoadingFee + } + return nil +} + +type QueryBalancesRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryBalancesRequest) Reset() { *m = QueryBalancesRequest{} } +func (m *QueryBalancesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryBalancesRequest) ProtoMessage() {} +func (*QueryBalancesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{12} +} +func (m *QueryBalancesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryBalancesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryBalancesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryBalancesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryBalancesRequest.Merge(m, src) +} +func (m *QueryBalancesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryBalancesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryBalancesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryBalancesRequest proto.InternalMessageInfo + +func (m *QueryBalancesRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type QueryBalancesResponse struct { + Coins []*types.DecCoin `protobuf:"bytes,1,rep,name=coins,proto3" json:"coins,omitempty"` +} + +func (m *QueryBalancesResponse) Reset() { *m = QueryBalancesResponse{} } +func (m *QueryBalancesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryBalancesResponse) ProtoMessage() {} +func (*QueryBalancesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c3912bb3197ea16, []int{13} +} +func (m *QueryBalancesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryBalancesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryBalancesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryBalancesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryBalancesResponse.Merge(m, src) +} +func (m *QueryBalancesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryBalancesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryBalancesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryBalancesResponse proto.InternalMessageInfo + +func (m *QueryBalancesResponse) GetCoins() []*types.DecCoin { + if m != nil { + return m.Coins + } + return nil +} + +func init() { + proto.RegisterType((*QueryExchangeRateRequest)(nil), "shareledger.gentlemint.QueryExchangeRateRequest") + proto.RegisterType((*QueryExchangeRateResponse)(nil), "shareledger.gentlemint.QueryExchangeRateResponse") + proto.RegisterType((*QueryLevelFeeRequest)(nil), "shareledger.gentlemint.QueryLevelFeeRequest") + proto.RegisterType((*QueryLevelFeeResponse)(nil), "shareledger.gentlemint.QueryLevelFeeResponse") + proto.RegisterType((*QueryLevelFeesRequest)(nil), "shareledger.gentlemint.QueryLevelFeesRequest") + proto.RegisterType((*QueryLevelFeesResponse)(nil), "shareledger.gentlemint.QueryLevelFeesResponse") + proto.RegisterType((*QueryActionLevelFeeRequest)(nil), "shareledger.gentlemint.QueryActionLevelFeeRequest") + proto.RegisterType((*QueryActionLevelFeeResponse)(nil), "shareledger.gentlemint.QueryActionLevelFeeResponse") + proto.RegisterType((*QueryActionLevelFeesRequest)(nil), "shareledger.gentlemint.QueryActionLevelFeesRequest") + proto.RegisterType((*QueryActionLevelFeesResponse)(nil), "shareledger.gentlemint.QueryActionLevelFeesResponse") + proto.RegisterType((*QueryCheckFeesRequest)(nil), "shareledger.gentlemint.QueryCheckFeesRequest") + proto.RegisterType((*QueryCheckFeesResponse)(nil), "shareledger.gentlemint.QueryCheckFeesResponse") + proto.RegisterType((*QueryBalancesRequest)(nil), "shareledger.gentlemint.QueryBalancesRequest") + proto.RegisterType((*QueryBalancesResponse)(nil), "shareledger.gentlemint.QueryBalancesResponse") +} + +func init() { proto.RegisterFile("gentlemint/query.proto", fileDescriptor_4c3912bb3197ea16) } + +var fileDescriptor_4c3912bb3197ea16 = []byte{ + // 838 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x96, 0x41, 0x6f, 0xd3, 0x48, + 0x14, 0xc7, 0xe3, 0xa6, 0xed, 0x26, 0xb3, 0xdd, 0xee, 0x6a, 0x94, 0xcd, 0xa6, 0xde, 0xae, 0x37, + 0x35, 0x55, 0x15, 0xaa, 0x62, 0x37, 0x69, 0x25, 0x4e, 0x1c, 0x68, 0x4b, 0x85, 0xa0, 0x1c, 0x88, + 0x38, 0x21, 0xa1, 0x6a, 0xe2, 0xbc, 0x38, 0x16, 0xae, 0x27, 0xf5, 0x4c, 0xaa, 0x56, 0x55, 0x2f, + 0x7c, 0x02, 0x10, 0x70, 0xe0, 0xc8, 0x9d, 0x13, 0x9f, 0xa2, 0xc7, 0x4a, 0x5c, 0x38, 0x21, 0xd4, + 0x72, 0xe6, 0xca, 0x15, 0x79, 0x3c, 0x4e, 0x1c, 0xe3, 0x34, 0xc9, 0x6d, 0x66, 0xde, 0xfb, 0xbf, + 0xf7, 0xcb, 0x7b, 0x7e, 0x4f, 0x41, 0x45, 0x1b, 0x3c, 0xee, 0xc2, 0x81, 0xe3, 0x71, 0xf3, 0xb0, + 0x0b, 0xfe, 0x89, 0xd1, 0xf1, 0x29, 0xa7, 0xb8, 0xc8, 0xda, 0xc4, 0x07, 0x17, 0x9a, 0x36, 0xf8, + 0x46, 0xdf, 0x47, 0x5d, 0xb4, 0x29, 0xb5, 0x5d, 0x30, 0x49, 0xc7, 0x31, 0x89, 0xe7, 0x51, 0x4e, + 0xb8, 0x43, 0x3d, 0x16, 0xaa, 0xd4, 0x55, 0x8b, 0xb2, 0x03, 0xca, 0xcc, 0x06, 0x61, 0x10, 0x86, + 0x33, 0x8f, 0xaa, 0x0d, 0xe0, 0xa4, 0x6a, 0x76, 0x88, 0xed, 0x78, 0xc2, 0x59, 0xfa, 0x6a, 0xb1, + 0xcc, 0x70, 0x6c, 0xb5, 0x89, 0x67, 0xc3, 0xbe, 0x4f, 0x38, 0x48, 0xbb, 0x1a, 0xb3, 0xbb, 0x70, + 0x04, 0xee, 0x7e, 0x0b, 0x22, 0xdb, 0x52, 0xcc, 0x46, 0xac, 0x20, 0xe8, 0x7e, 0xd2, 0x45, 0x8b, + 0xa3, 0x44, 0x10, 0x16, 0x75, 0xa2, 0xf4, 0x05, 0x9b, 0xda, 0x54, 0x1c, 0xcd, 0xe0, 0x14, 0xbe, + 0xea, 0x2a, 0x2a, 0x3d, 0x0e, 0xb0, 0xef, 0x49, 0xa0, 0x3a, 0xe1, 0x50, 0x87, 0xc3, 0x2e, 0x30, + 0xae, 0x9b, 0x68, 0x21, 0xc5, 0xc6, 0x3a, 0xd4, 0x63, 0x80, 0x31, 0x9a, 0x0e, 0xd8, 0x4b, 0x4a, + 0x59, 0xa9, 0xe4, 0xeb, 0xe2, 0xac, 0xaf, 0xa1, 0x82, 0x10, 0xec, 0x05, 0x68, 0xbb, 0x10, 0x05, + 0xc2, 0x05, 0x34, 0x23, 0x68, 0xa5, 0x73, 0x78, 0xd1, 0x09, 0xfa, 0x3b, 0xe1, 0x2d, 0x43, 0xdf, + 0x47, 0x39, 0x57, 0xbe, 0x09, 0xc5, 0xef, 0xb5, 0x15, 0x23, 0xbd, 0x3b, 0x46, 0xa4, 0xdd, 0x01, + 0x4e, 0x1c, 0x77, 0x6b, 0xfa, 0xfc, 0xcb, 0xff, 0x99, 0x7a, 0x4f, 0xad, 0xff, 0x93, 0x48, 0xc1, + 0xa2, 0x9f, 0xd6, 0x44, 0xc5, 0xa4, 0x41, 0x26, 0x7f, 0x80, 0xf2, 0x91, 0x9c, 0x95, 0x94, 0x72, + 0x76, 0xe2, 0xec, 0x7d, 0xb9, 0xbe, 0x89, 0x54, 0x91, 0xe5, 0xae, 0xe8, 0x58, 0xb2, 0x2a, 0x45, + 0x34, 0x1b, 0xb6, 0x52, 0x96, 0x45, 0xde, 0xf4, 0x67, 0xe8, 0xdf, 0x54, 0x95, 0x04, 0x1c, 0x22, + 0xeb, 0x17, 0x79, 0x2a, 0x56, 0x64, 0xfc, 0x17, 0xca, 0xb6, 0x00, 0x4a, 0x59, 0xf1, 0x16, 0x1c, + 0xf5, 0xff, 0x52, 0xc3, 0xf7, 0x2a, 0xc3, 0xd1, 0x62, 0xba, 0x59, 0xa6, 0x7f, 0x82, 0xe6, 0xc9, + 0x80, 0x69, 0x54, 0x91, 0x06, 0x03, 0xc9, 0x22, 0x25, 0x62, 0xe8, 0x0f, 0x65, 0xa3, 0xb6, 0xdb, + 0x60, 0x3d, 0x8f, 0xe1, 0xe0, 0x12, 0xfa, 0x8d, 0x34, 0x9b, 0x3e, 0x30, 0x26, 0x7f, 0x6e, 0x74, + 0x15, 0x16, 0x11, 0x84, 0x95, 0xa6, 0xca, 0x59, 0x61, 0x09, 0xaf, 0xfa, 0x0f, 0x45, 0x76, 0x37, + 0x16, 0x4d, 0xd2, 0xdf, 0x41, 0x73, 0x16, 0xf5, 0x8e, 0xc0, 0xe7, 0xd0, 0xec, 0x7f, 0x5e, 0x0b, + 0x46, 0x38, 0x3b, 0x46, 0x30, 0x3b, 0x86, 0x9c, 0x1d, 0x63, 0x9b, 0x3a, 0x5e, 0x7d, 0xc0, 0x1d, + 0x2f, 0xa3, 0x3f, 0x58, 0xb7, 0xd5, 0x72, 0x2c, 0x07, 0x3c, 0x1e, 0xe8, 0x83, 0x5a, 0xe7, 0xea, + 0x83, 0x8f, 0xb8, 0x86, 0x0a, 0xb1, 0x87, 0xae, 0xd7, 0xdc, 0xa5, 0xfe, 0xae, 0x6c, 0x42, 0xae, + 0x9e, 0x6a, 0xc3, 0x3b, 0x68, 0xde, 0xa2, 0x8c, 0xef, 0x51, 0xd2, 0x74, 0x3c, 0x3b, 0xf0, 0x9e, + 0x16, 0x68, 0x8b, 0xa9, 0x68, 0x3b, 0x60, 0x09, 0xba, 0x84, 0x46, 0x5f, 0x97, 0x03, 0xb8, 0x45, + 0x5c, 0xe2, 0x59, 0x63, 0x54, 0xb1, 0x57, 0xf8, 0xbe, 0x42, 0x56, 0xaa, 0x86, 0x66, 0x82, 0xe5, + 0x11, 0xcd, 0xc0, 0xf5, 0x1c, 0xa1, 0x6b, 0xed, 0x7b, 0x0e, 0xcd, 0x88, 0x68, 0xf8, 0xbd, 0x82, + 0xe6, 0xe2, 0x6b, 0x03, 0xaf, 0x0f, 0xfb, 0x3c, 0x86, 0x6d, 0x1f, 0xb5, 0x3a, 0x81, 0x22, 0x64, + 0xd6, 0xd7, 0x5e, 0x7c, 0xfa, 0xf6, 0x7a, 0x6a, 0x05, 0x2f, 0x9b, 0x31, 0xa9, 0x99, 0xb2, 0x76, + 0x05, 0xd2, 0x3b, 0x05, 0xe5, 0xa2, 0x0f, 0x10, 0xaf, 0x5d, 0x9b, 0x2d, 0x31, 0xba, 0xea, 0xad, + 0x31, 0xbd, 0x25, 0xd7, 0xba, 0xe0, 0x5a, 0xc5, 0x95, 0x61, 0x5c, 0xd1, 0xca, 0x30, 0x4f, 0xc5, + 0xe9, 0x0c, 0xbf, 0x51, 0x50, 0xbe, 0x37, 0x7b, 0x78, 0xbc, 0x74, 0x51, 0xb7, 0x55, 0x63, 0x5c, + 0x77, 0x89, 0x57, 0x11, 0x78, 0x3a, 0x2e, 0x8f, 0xc2, 0xc3, 0x1f, 0x15, 0x34, 0x3f, 0x38, 0xcf, + 0xb8, 0x76, 0x6d, 0xb2, 0xd4, 0xcd, 0xa7, 0x6e, 0x4c, 0xa4, 0x91, 0x94, 0xb7, 0x05, 0x65, 0x15, + 0x9b, 0xc3, 0x28, 0x07, 0x57, 0x8a, 0x79, 0x1a, 0xde, 0xcf, 0xf0, 0x07, 0x05, 0xfd, 0x99, 0xd8, + 0x66, 0x78, 0x12, 0x82, 0x5e, 0x5d, 0x37, 0x27, 0x13, 0x49, 0x6e, 0x43, 0x70, 0x57, 0xf0, 0xca, + 0x78, 0xdc, 0xf8, 0xad, 0x82, 0xf2, 0xbd, 0xc5, 0x35, 0xa2, 0xf5, 0xc9, 0x75, 0x39, 0xa2, 0xf5, + 0xbf, 0xec, 0x43, 0xfd, 0xa6, 0x80, 0xbb, 0x81, 0x97, 0x86, 0xc1, 0x59, 0x3d, 0x92, 0x57, 0x0a, + 0xca, 0x45, 0x5b, 0x62, 0xc4, 0xb8, 0x24, 0xd6, 0xcf, 0x88, 0x71, 0x49, 0xae, 0x9e, 0xd1, 0xdf, + 0x63, 0x43, 0x2a, 0xb6, 0x1e, 0x9d, 0x5f, 0x6a, 0xca, 0xc5, 0xa5, 0xa6, 0x7c, 0xbd, 0xd4, 0x94, + 0x97, 0x57, 0x5a, 0xe6, 0xe2, 0x4a, 0xcb, 0x7c, 0xbe, 0xd2, 0x32, 0x4f, 0x37, 0x6c, 0x87, 0xb7, + 0xbb, 0x0d, 0xc3, 0xa2, 0x07, 0x61, 0x14, 0xdf, 0xf1, 0xec, 0x81, 0x78, 0xc7, 0xf1, 0x88, 0xfc, + 0xa4, 0x03, 0xac, 0x31, 0x2b, 0xfe, 0x13, 0x6d, 0xfc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x04, 0x37, + 0x1c, 0x1a, 0x24, 0x0a, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Queries a exchangeRate by index. + ExchangeRate(ctx context.Context, in *QueryExchangeRateRequest, opts ...grpc.CallOption) (*QueryExchangeRateResponse, error) + // Queries a levelFee by index. + LevelFee(ctx context.Context, in *QueryLevelFeeRequest, opts ...grpc.CallOption) (*QueryLevelFeeResponse, error) + // Queries a list of levelFee items. + LevelFees(ctx context.Context, in *QueryLevelFeesRequest, opts ...grpc.CallOption) (*QueryLevelFeesResponse, error) + // Queries a actionLevelFee by index. + ActionLevelFee(ctx context.Context, in *QueryActionLevelFeeRequest, opts ...grpc.CallOption) (*QueryActionLevelFeeResponse, error) + // Queries a list of actionLevelFee items. + ActionLevelFees(ctx context.Context, in *QueryActionLevelFeesRequest, opts ...grpc.CallOption) (*QueryActionLevelFeesResponse, error) + // Queries a list of checkFees items. + CheckFees(ctx context.Context, in *QueryCheckFeesRequest, opts ...grpc.CallOption) (*QueryCheckFeesResponse, error) + // Queries a list of balances items. + Balances(ctx context.Context, in *QueryBalancesRequest, opts ...grpc.CallOption) (*QueryBalancesResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) ExchangeRate(ctx context.Context, in *QueryExchangeRateRequest, opts ...grpc.CallOption) (*QueryExchangeRateResponse, error) { + out := new(QueryExchangeRateResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Query/ExchangeRate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) LevelFee(ctx context.Context, in *QueryLevelFeeRequest, opts ...grpc.CallOption) (*QueryLevelFeeResponse, error) { + out := new(QueryLevelFeeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Query/LevelFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) LevelFees(ctx context.Context, in *QueryLevelFeesRequest, opts ...grpc.CallOption) (*QueryLevelFeesResponse, error) { + out := new(QueryLevelFeesResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Query/LevelFees", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) ActionLevelFee(ctx context.Context, in *QueryActionLevelFeeRequest, opts ...grpc.CallOption) (*QueryActionLevelFeeResponse, error) { + out := new(QueryActionLevelFeeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Query/ActionLevelFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) ActionLevelFees(ctx context.Context, in *QueryActionLevelFeesRequest, opts ...grpc.CallOption) (*QueryActionLevelFeesResponse, error) { + out := new(QueryActionLevelFeesResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Query/ActionLevelFees", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) CheckFees(ctx context.Context, in *QueryCheckFeesRequest, opts ...grpc.CallOption) (*QueryCheckFeesResponse, error) { + out := new(QueryCheckFeesResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Query/CheckFees", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Balances(ctx context.Context, in *QueryBalancesRequest, opts ...grpc.CallOption) (*QueryBalancesResponse, error) { + out := new(QueryBalancesResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Query/Balances", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Queries a exchangeRate by index. + ExchangeRate(context.Context, *QueryExchangeRateRequest) (*QueryExchangeRateResponse, error) + // Queries a levelFee by index. + LevelFee(context.Context, *QueryLevelFeeRequest) (*QueryLevelFeeResponse, error) + // Queries a list of levelFee items. + LevelFees(context.Context, *QueryLevelFeesRequest) (*QueryLevelFeesResponse, error) + // Queries a actionLevelFee by index. + ActionLevelFee(context.Context, *QueryActionLevelFeeRequest) (*QueryActionLevelFeeResponse, error) + // Queries a list of actionLevelFee items. + ActionLevelFees(context.Context, *QueryActionLevelFeesRequest) (*QueryActionLevelFeesResponse, error) + // Queries a list of checkFees items. + CheckFees(context.Context, *QueryCheckFeesRequest) (*QueryCheckFeesResponse, error) + // Queries a list of balances items. + Balances(context.Context, *QueryBalancesRequest) (*QueryBalancesResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) ExchangeRate(ctx context.Context, req *QueryExchangeRateRequest) (*QueryExchangeRateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExchangeRate not implemented") +} +func (*UnimplementedQueryServer) LevelFee(ctx context.Context, req *QueryLevelFeeRequest) (*QueryLevelFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LevelFee not implemented") +} +func (*UnimplementedQueryServer) LevelFees(ctx context.Context, req *QueryLevelFeesRequest) (*QueryLevelFeesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LevelFees not implemented") +} +func (*UnimplementedQueryServer) ActionLevelFee(ctx context.Context, req *QueryActionLevelFeeRequest) (*QueryActionLevelFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ActionLevelFee not implemented") +} +func (*UnimplementedQueryServer) ActionLevelFees(ctx context.Context, req *QueryActionLevelFeesRequest) (*QueryActionLevelFeesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ActionLevelFees not implemented") +} +func (*UnimplementedQueryServer) CheckFees(ctx context.Context, req *QueryCheckFeesRequest) (*QueryCheckFeesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CheckFees not implemented") +} +func (*UnimplementedQueryServer) Balances(ctx context.Context, req *QueryBalancesRequest) (*QueryBalancesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Balances not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_ExchangeRate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryExchangeRateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ExchangeRate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Query/ExchangeRate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ExchangeRate(ctx, req.(*QueryExchangeRateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_LevelFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryLevelFeeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).LevelFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Query/LevelFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).LevelFee(ctx, req.(*QueryLevelFeeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_LevelFees_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryLevelFeesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).LevelFees(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Query/LevelFees", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).LevelFees(ctx, req.(*QueryLevelFeesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_ActionLevelFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryActionLevelFeeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ActionLevelFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Query/ActionLevelFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ActionLevelFee(ctx, req.(*QueryActionLevelFeeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_ActionLevelFees_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryActionLevelFeesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ActionLevelFees(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Query/ActionLevelFees", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ActionLevelFees(ctx, req.(*QueryActionLevelFeesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_CheckFees_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCheckFeesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CheckFees(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Query/CheckFees", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CheckFees(ctx, req.(*QueryCheckFeesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Balances_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryBalancesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Balances(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Query/Balances", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Balances(ctx, req.(*QueryBalancesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.gentlemint.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ExchangeRate", + Handler: _Query_ExchangeRate_Handler, + }, + { + MethodName: "LevelFee", + Handler: _Query_LevelFee_Handler, + }, + { + MethodName: "LevelFees", + Handler: _Query_LevelFees_Handler, + }, + { + MethodName: "ActionLevelFee", + Handler: _Query_ActionLevelFee_Handler, + }, + { + MethodName: "ActionLevelFees", + Handler: _Query_ActionLevelFees_Handler, + }, + { + MethodName: "CheckFees", + Handler: _Query_CheckFees_Handler, + }, + { + MethodName: "Balances", + Handler: _Query_Balances_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "gentlemint/query.proto", +} + +func (m *QueryExchangeRateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryExchangeRateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryExchangeRateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryExchangeRateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryExchangeRateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryExchangeRateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Rate) > 0 { + i -= len(m.Rate) + copy(dAtA[i:], m.Rate) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Rate))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryLevelFeeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLevelFeeRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLevelFeeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryLevelFeeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLevelFeeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLevelFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.LevelFee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryLevelFeesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLevelFeesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLevelFeesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryLevelFeesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryLevelFeesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryLevelFeesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.LevelFees) > 0 { + for iNdEx := len(m.LevelFees) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.LevelFees[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryActionLevelFeeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryActionLevelFeeRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryActionLevelFeeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryActionLevelFeeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryActionLevelFeeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryActionLevelFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Fee) > 0 { + i -= len(m.Fee) + copy(dAtA[i:], m.Fee) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Fee))) + i-- + dAtA[i] = 0x1a + } + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0x12 + } + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryActionLevelFeesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryActionLevelFeesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryActionLevelFeesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryActionLevelFeesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryActionLevelFeesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryActionLevelFeesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ActionLevelFee) > 0 { + for iNdEx := len(m.ActionLevelFee) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ActionLevelFee[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryCheckFeesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCheckFeesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCheckFeesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Actions) > 0 { + for iNdEx := len(m.Actions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Actions[iNdEx]) + copy(dAtA[i:], m.Actions[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Actions[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryCheckFeesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCheckFeesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCheckFeesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CostLoadingFee != nil { + { + size, err := m.CostLoadingFee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.SufficientFundForFee { + i-- + if m.SufficientFundForFee { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.SufficientFee { + i-- + if m.SufficientFee { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.ConvertedFee != nil { + { + size, err := m.ConvertedFee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryBalancesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryBalancesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryBalancesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryBalancesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryBalancesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryBalancesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Coins) > 0 { + for iNdEx := len(m.Coins) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Coins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryExchangeRateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryExchangeRateResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Rate) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryLevelFeeRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Level) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryLevelFeeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.LevelFee.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryLevelFeesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryLevelFeesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.LevelFees) > 0 { + for _, e := range m.LevelFees { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryActionLevelFeeRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryActionLevelFeeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.Level) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.Fee) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryActionLevelFeesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryActionLevelFeesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ActionLevelFee) > 0 { + for _, e := range m.ActionLevelFee { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryCheckFeesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if len(m.Actions) > 0 { + for _, s := range m.Actions { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryCheckFeesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ConvertedFee != nil { + l = m.ConvertedFee.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if m.SufficientFee { + n += 2 + } + if m.SufficientFundForFee { + n += 2 + } + if m.CostLoadingFee != nil { + l = m.CostLoadingFee.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryBalancesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryBalancesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Coins) > 0 { + for _, e := range m.Coins { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryExchangeRateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryExchangeRateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryExchangeRateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryExchangeRateResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryExchangeRateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryExchangeRateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLevelFeeRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLevelFeeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLevelFeeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLevelFeeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLevelFeeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLevelFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LevelFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LevelFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLevelFeesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLevelFeesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLevelFeesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryLevelFeesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryLevelFeesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryLevelFeesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LevelFees", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LevelFees = append(m.LevelFees, LevelFeeDetail{}) + if err := m.LevelFees[len(m.LevelFees)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryActionLevelFeeRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryActionLevelFeeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryActionLevelFeeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryActionLevelFeeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryActionLevelFeeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryActionLevelFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Fee = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryActionLevelFeesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryActionLevelFeesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryActionLevelFeesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryActionLevelFeesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryActionLevelFeesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryActionLevelFeesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ActionLevelFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ActionLevelFee = append(m.ActionLevelFee, ActionLevelFee{}) + if err := m.ActionLevelFee[len(m.ActionLevelFee)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCheckFeesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryCheckFeesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCheckFeesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Actions = append(m.Actions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCheckFeesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryCheckFeesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCheckFeesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConvertedFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConvertedFee == nil { + m.ConvertedFee = &types.Coin{} + } + if err := m.ConvertedFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SufficientFee", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SufficientFee = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SufficientFundForFee", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SufficientFundForFee = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CostLoadingFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CostLoadingFee == nil { + m.CostLoadingFee = &types.DecCoin{} + } + if err := m.CostLoadingFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryBalancesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryBalancesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryBalancesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryBalancesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryBalancesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryBalancesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Coins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Coins = append(m.Coins, &types.DecCoin{}) + if err := m.Coins[len(m.Coins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/gentlemint/types/query.pb.gw.go b/x/gentlemint/types/query.pb.gw.go new file mode 100644 index 00000000..7f444aa9 --- /dev/null +++ b/x/gentlemint/types/query.pb.gw.go @@ -0,0 +1,651 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: gentlemint/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_ExchangeRate_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryExchangeRateRequest + var metadata runtime.ServerMetadata + + msg, err := client.ExchangeRate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ExchangeRate_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryExchangeRateRequest + var metadata runtime.ServerMetadata + + msg, err := server.ExchangeRate(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_LevelFee_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLevelFeeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["level"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "level") + } + + protoReq.Level, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "level", err) + } + + msg, err := client.LevelFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_LevelFee_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLevelFeeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["level"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "level") + } + + protoReq.Level, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "level", err) + } + + msg, err := server.LevelFee(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_LevelFees_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLevelFeesRequest + var metadata runtime.ServerMetadata + + msg, err := client.LevelFees(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_LevelFees_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryLevelFeesRequest + var metadata runtime.ServerMetadata + + msg, err := server.LevelFees(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_ActionLevelFee_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryActionLevelFeeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["action"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "action") + } + + protoReq.Action, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "action", err) + } + + msg, err := client.ActionLevelFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ActionLevelFee_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryActionLevelFeeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["action"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "action") + } + + protoReq.Action, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "action", err) + } + + msg, err := server.ActionLevelFee(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_ActionLevelFees_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryActionLevelFeesRequest + var metadata runtime.ServerMetadata + + msg, err := client.ActionLevelFees(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ActionLevelFees_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryActionLevelFeesRequest + var metadata runtime.ServerMetadata + + msg, err := server.ActionLevelFees(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_CheckFees_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_CheckFees_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCheckFeesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CheckFees_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CheckFees(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_CheckFees_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCheckFeesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CheckFees_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CheckFees(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_Balances_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_Balances_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryBalancesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Balances_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Balances(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Balances_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryBalancesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Balances_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Balances(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_ExchangeRate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ExchangeRate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ExchangeRate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_LevelFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_LevelFee_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_LevelFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_LevelFees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_LevelFees_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_LevelFees_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ActionLevelFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ActionLevelFee_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ActionLevelFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ActionLevelFees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ActionLevelFees_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ActionLevelFees_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CheckFees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CheckFees_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CheckFees_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Balances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Balances_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Balances_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_ExchangeRate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_ExchangeRate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ExchangeRate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_LevelFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_LevelFee_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_LevelFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_LevelFees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_LevelFees_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_LevelFees_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ActionLevelFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_ActionLevelFee_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ActionLevelFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ActionLevelFees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_ActionLevelFees_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ActionLevelFees_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CheckFees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_CheckFees_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CheckFees_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Balances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Balances_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Balances_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_ExchangeRate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "gentlemint", "exchangeRate"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_LevelFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "gentlemint", "levelFee", "level"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_LevelFees_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "gentlemint", "levelFee"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_ActionLevelFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"shareledger", "gentlemint", "actionLevelFee", "action"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_ActionLevelFees_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "gentlemint", "actionLevelFee"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_CheckFees_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "gentlemint", "checkFees"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_Balances_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"shareledger", "gentlemint", "balances"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Query_ExchangeRate_0 = runtime.ForwardResponseMessage + + forward_Query_LevelFee_0 = runtime.ForwardResponseMessage + + forward_Query_LevelFees_0 = runtime.ForwardResponseMessage + + forward_Query_ActionLevelFee_0 = runtime.ForwardResponseMessage + + forward_Query_ActionLevelFees_0 = runtime.ForwardResponseMessage + + forward_Query_CheckFees_0 = runtime.ForwardResponseMessage + + forward_Query_Balances_0 = runtime.ForwardResponseMessage +) diff --git a/x/gentlemint/types/tx.pb.go b/x/gentlemint/types/tx.pb.go new file mode 100644 index 00000000..98702ef3 --- /dev/null +++ b/x/gentlemint/types/tx.pb.go @@ -0,0 +1,4290 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: gentlemint/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgBuyShr struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Amount string `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"` +} + +func (m *MsgBuyShr) Reset() { *m = MsgBuyShr{} } +func (m *MsgBuyShr) String() string { return proto.CompactTextString(m) } +func (*MsgBuyShr) ProtoMessage() {} +func (*MsgBuyShr) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{0} +} +func (m *MsgBuyShr) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBuyShr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBuyShr.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBuyShr) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBuyShr.Merge(m, src) +} +func (m *MsgBuyShr) XXX_Size() int { + return m.Size() +} +func (m *MsgBuyShr) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBuyShr.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBuyShr proto.InternalMessageInfo + +func (m *MsgBuyShr) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgBuyShr) GetAmount() string { + if m != nil { + return m.Amount + } + return "" +} + +type MsgBuyShrResponse struct { + Log string `protobuf:"bytes,1,opt,name=log,proto3" json:"log,omitempty"` +} + +func (m *MsgBuyShrResponse) Reset() { *m = MsgBuyShrResponse{} } +func (m *MsgBuyShrResponse) String() string { return proto.CompactTextString(m) } +func (*MsgBuyShrResponse) ProtoMessage() {} +func (*MsgBuyShrResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{1} +} +func (m *MsgBuyShrResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBuyShrResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBuyShrResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBuyShrResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBuyShrResponse.Merge(m, src) +} +func (m *MsgBuyShrResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgBuyShrResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBuyShrResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBuyShrResponse proto.InternalMessageInfo + +func (m *MsgBuyShrResponse) GetLog() string { + if m != nil { + return m.Log + } + return "" +} + +type MsgSetExchange struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Rate string `protobuf:"bytes,2,opt,name=rate,proto3" json:"rate,omitempty"` +} + +func (m *MsgSetExchange) Reset() { *m = MsgSetExchange{} } +func (m *MsgSetExchange) String() string { return proto.CompactTextString(m) } +func (*MsgSetExchange) ProtoMessage() {} +func (*MsgSetExchange) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{2} +} +func (m *MsgSetExchange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSetExchange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSetExchange.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSetExchange) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSetExchange.Merge(m, src) +} +func (m *MsgSetExchange) XXX_Size() int { + return m.Size() +} +func (m *MsgSetExchange) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSetExchange.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSetExchange proto.InternalMessageInfo + +func (m *MsgSetExchange) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgSetExchange) GetRate() string { + if m != nil { + return m.Rate + } + return "" +} + +type MsgSetExchangeResponse struct { +} + +func (m *MsgSetExchangeResponse) Reset() { *m = MsgSetExchangeResponse{} } +func (m *MsgSetExchangeResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSetExchangeResponse) ProtoMessage() {} +func (*MsgSetExchangeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{3} +} +func (m *MsgSetExchangeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSetExchangeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSetExchangeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSetExchangeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSetExchangeResponse.Merge(m, src) +} +func (m *MsgSetExchangeResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSetExchangeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSetExchangeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSetExchangeResponse proto.InternalMessageInfo + +type MsgSetLevelFee struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Level string `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"` + Fee types.DecCoin `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee"` +} + +func (m *MsgSetLevelFee) Reset() { *m = MsgSetLevelFee{} } +func (m *MsgSetLevelFee) String() string { return proto.CompactTextString(m) } +func (*MsgSetLevelFee) ProtoMessage() {} +func (*MsgSetLevelFee) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{4} +} +func (m *MsgSetLevelFee) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSetLevelFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSetLevelFee.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSetLevelFee) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSetLevelFee.Merge(m, src) +} +func (m *MsgSetLevelFee) XXX_Size() int { + return m.Size() +} +func (m *MsgSetLevelFee) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSetLevelFee.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSetLevelFee proto.InternalMessageInfo + +func (m *MsgSetLevelFee) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgSetLevelFee) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +func (m *MsgSetLevelFee) GetFee() types.DecCoin { + if m != nil { + return m.Fee + } + return types.DecCoin{} +} + +type MsgSetLevelFeeResponse struct { +} + +func (m *MsgSetLevelFeeResponse) Reset() { *m = MsgSetLevelFeeResponse{} } +func (m *MsgSetLevelFeeResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSetLevelFeeResponse) ProtoMessage() {} +func (*MsgSetLevelFeeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{5} +} +func (m *MsgSetLevelFeeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSetLevelFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSetLevelFeeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSetLevelFeeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSetLevelFeeResponse.Merge(m, src) +} +func (m *MsgSetLevelFeeResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSetLevelFeeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSetLevelFeeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSetLevelFeeResponse proto.InternalMessageInfo + +type MsgDeleteLevelFee struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Level string `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"` +} + +func (m *MsgDeleteLevelFee) Reset() { *m = MsgDeleteLevelFee{} } +func (m *MsgDeleteLevelFee) String() string { return proto.CompactTextString(m) } +func (*MsgDeleteLevelFee) ProtoMessage() {} +func (*MsgDeleteLevelFee) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{6} +} +func (m *MsgDeleteLevelFee) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgDeleteLevelFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgDeleteLevelFee.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgDeleteLevelFee) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgDeleteLevelFee.Merge(m, src) +} +func (m *MsgDeleteLevelFee) XXX_Size() int { + return m.Size() +} +func (m *MsgDeleteLevelFee) XXX_DiscardUnknown() { + xxx_messageInfo_MsgDeleteLevelFee.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgDeleteLevelFee proto.InternalMessageInfo + +func (m *MsgDeleteLevelFee) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgDeleteLevelFee) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +type MsgDeleteLevelFeeResponse struct { +} + +func (m *MsgDeleteLevelFeeResponse) Reset() { *m = MsgDeleteLevelFeeResponse{} } +func (m *MsgDeleteLevelFeeResponse) String() string { return proto.CompactTextString(m) } +func (*MsgDeleteLevelFeeResponse) ProtoMessage() {} +func (*MsgDeleteLevelFeeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{7} +} +func (m *MsgDeleteLevelFeeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgDeleteLevelFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgDeleteLevelFeeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgDeleteLevelFeeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgDeleteLevelFeeResponse.Merge(m, src) +} +func (m *MsgDeleteLevelFeeResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgDeleteLevelFeeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgDeleteLevelFeeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgDeleteLevelFeeResponse proto.InternalMessageInfo + +type MsgSetActionLevelFee struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Action string `protobuf:"bytes,2,opt,name=action,proto3" json:"action,omitempty"` + Level string `protobuf:"bytes,3,opt,name=level,proto3" json:"level,omitempty"` +} + +func (m *MsgSetActionLevelFee) Reset() { *m = MsgSetActionLevelFee{} } +func (m *MsgSetActionLevelFee) String() string { return proto.CompactTextString(m) } +func (*MsgSetActionLevelFee) ProtoMessage() {} +func (*MsgSetActionLevelFee) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{8} +} +func (m *MsgSetActionLevelFee) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSetActionLevelFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSetActionLevelFee.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSetActionLevelFee) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSetActionLevelFee.Merge(m, src) +} +func (m *MsgSetActionLevelFee) XXX_Size() int { + return m.Size() +} +func (m *MsgSetActionLevelFee) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSetActionLevelFee.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSetActionLevelFee proto.InternalMessageInfo + +func (m *MsgSetActionLevelFee) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgSetActionLevelFee) GetAction() string { + if m != nil { + return m.Action + } + return "" +} + +func (m *MsgSetActionLevelFee) GetLevel() string { + if m != nil { + return m.Level + } + return "" +} + +type MsgSetActionLevelFeeResponse struct { +} + +func (m *MsgSetActionLevelFeeResponse) Reset() { *m = MsgSetActionLevelFeeResponse{} } +func (m *MsgSetActionLevelFeeResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSetActionLevelFeeResponse) ProtoMessage() {} +func (*MsgSetActionLevelFeeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{9} +} +func (m *MsgSetActionLevelFeeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSetActionLevelFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSetActionLevelFeeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSetActionLevelFeeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSetActionLevelFeeResponse.Merge(m, src) +} +func (m *MsgSetActionLevelFeeResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSetActionLevelFeeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSetActionLevelFeeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSetActionLevelFeeResponse proto.InternalMessageInfo + +type MsgDeleteActionLevelFee struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Action string `protobuf:"bytes,2,opt,name=action,proto3" json:"action,omitempty"` +} + +func (m *MsgDeleteActionLevelFee) Reset() { *m = MsgDeleteActionLevelFee{} } +func (m *MsgDeleteActionLevelFee) String() string { return proto.CompactTextString(m) } +func (*MsgDeleteActionLevelFee) ProtoMessage() {} +func (*MsgDeleteActionLevelFee) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{10} +} +func (m *MsgDeleteActionLevelFee) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgDeleteActionLevelFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgDeleteActionLevelFee.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgDeleteActionLevelFee) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgDeleteActionLevelFee.Merge(m, src) +} +func (m *MsgDeleteActionLevelFee) XXX_Size() int { + return m.Size() +} +func (m *MsgDeleteActionLevelFee) XXX_DiscardUnknown() { + xxx_messageInfo_MsgDeleteActionLevelFee.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgDeleteActionLevelFee proto.InternalMessageInfo + +func (m *MsgDeleteActionLevelFee) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgDeleteActionLevelFee) GetAction() string { + if m != nil { + return m.Action + } + return "" +} + +type MsgDeleteActionLevelFeeResponse struct { +} + +func (m *MsgDeleteActionLevelFeeResponse) Reset() { *m = MsgDeleteActionLevelFeeResponse{} } +func (m *MsgDeleteActionLevelFeeResponse) String() string { return proto.CompactTextString(m) } +func (*MsgDeleteActionLevelFeeResponse) ProtoMessage() {} +func (*MsgDeleteActionLevelFeeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{11} +} +func (m *MsgDeleteActionLevelFeeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgDeleteActionLevelFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgDeleteActionLevelFeeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgDeleteActionLevelFeeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgDeleteActionLevelFeeResponse.Merge(m, src) +} +func (m *MsgDeleteActionLevelFeeResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgDeleteActionLevelFeeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgDeleteActionLevelFeeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgDeleteActionLevelFeeResponse proto.InternalMessageInfo + +type MsgLoadFee struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Shrp *types.DecCoin `protobuf:"bytes,2,opt,name=shrp,proto3" json:"shrp,omitempty"` +} + +func (m *MsgLoadFee) Reset() { *m = MsgLoadFee{} } +func (m *MsgLoadFee) String() string { return proto.CompactTextString(m) } +func (*MsgLoadFee) ProtoMessage() {} +func (*MsgLoadFee) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{12} +} +func (m *MsgLoadFee) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgLoadFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgLoadFee.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgLoadFee) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgLoadFee.Merge(m, src) +} +func (m *MsgLoadFee) XXX_Size() int { + return m.Size() +} +func (m *MsgLoadFee) XXX_DiscardUnknown() { + xxx_messageInfo_MsgLoadFee.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgLoadFee proto.InternalMessageInfo + +func (m *MsgLoadFee) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgLoadFee) GetShrp() *types.DecCoin { + if m != nil { + return m.Shrp + } + return nil +} + +type MsgLoadFeeResponse struct { +} + +func (m *MsgLoadFeeResponse) Reset() { *m = MsgLoadFeeResponse{} } +func (m *MsgLoadFeeResponse) String() string { return proto.CompactTextString(m) } +func (*MsgLoadFeeResponse) ProtoMessage() {} +func (*MsgLoadFeeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{13} +} +func (m *MsgLoadFeeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgLoadFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgLoadFeeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgLoadFeeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgLoadFeeResponse.Merge(m, src) +} +func (m *MsgLoadFeeResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgLoadFeeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgLoadFeeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgLoadFeeResponse proto.InternalMessageInfo + +type MsgLoad struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + Coins github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,3,rep,name=coins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"coins"` +} + +func (m *MsgLoad) Reset() { *m = MsgLoad{} } +func (m *MsgLoad) String() string { return proto.CompactTextString(m) } +func (*MsgLoad) ProtoMessage() {} +func (*MsgLoad) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{14} +} +func (m *MsgLoad) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgLoad) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgLoad.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgLoad) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgLoad.Merge(m, src) +} +func (m *MsgLoad) XXX_Size() int { + return m.Size() +} +func (m *MsgLoad) XXX_DiscardUnknown() { + xxx_messageInfo_MsgLoad.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgLoad proto.InternalMessageInfo + +func (m *MsgLoad) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgLoad) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *MsgLoad) GetCoins() github_com_cosmos_cosmos_sdk_types.DecCoins { + if m != nil { + return m.Coins + } + return nil +} + +type MsgLoadResponse struct { +} + +func (m *MsgLoadResponse) Reset() { *m = MsgLoadResponse{} } +func (m *MsgLoadResponse) String() string { return proto.CompactTextString(m) } +func (*MsgLoadResponse) ProtoMessage() {} +func (*MsgLoadResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{15} +} +func (m *MsgLoadResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgLoadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgLoadResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgLoadResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgLoadResponse.Merge(m, src) +} +func (m *MsgLoadResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgLoadResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgLoadResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgLoadResponse proto.InternalMessageInfo + +type MsgSend struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + Coins github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,3,rep,name=coins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"coins"` +} + +func (m *MsgSend) Reset() { *m = MsgSend{} } +func (m *MsgSend) String() string { return proto.CompactTextString(m) } +func (*MsgSend) ProtoMessage() {} +func (*MsgSend) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{16} +} +func (m *MsgSend) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSend.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSend) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSend.Merge(m, src) +} +func (m *MsgSend) XXX_Size() int { + return m.Size() +} +func (m *MsgSend) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSend.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSend proto.InternalMessageInfo + +func (m *MsgSend) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgSend) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *MsgSend) GetCoins() github_com_cosmos_cosmos_sdk_types.DecCoins { + if m != nil { + return m.Coins + } + return nil +} + +type MsgSendResponse struct { +} + +func (m *MsgSendResponse) Reset() { *m = MsgSendResponse{} } +func (m *MsgSendResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSendResponse) ProtoMessage() {} +func (*MsgSendResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{17} +} +func (m *MsgSendResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSendResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSendResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSendResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSendResponse.Merge(m, src) +} +func (m *MsgSendResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSendResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSendResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSendResponse proto.InternalMessageInfo + +type MsgBurn struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Coins github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,2,rep,name=coins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"coins"` +} + +func (m *MsgBurn) Reset() { *m = MsgBurn{} } +func (m *MsgBurn) String() string { return proto.CompactTextString(m) } +func (*MsgBurn) ProtoMessage() {} +func (*MsgBurn) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{18} +} +func (m *MsgBurn) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurn.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurn) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurn.Merge(m, src) +} +func (m *MsgBurn) XXX_Size() int { + return m.Size() +} +func (m *MsgBurn) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurn.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurn proto.InternalMessageInfo + +func (m *MsgBurn) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *MsgBurn) GetCoins() github_com_cosmos_cosmos_sdk_types.DecCoins { + if m != nil { + return m.Coins + } + return nil +} + +type MsgBurnResponse struct { +} + +func (m *MsgBurnResponse) Reset() { *m = MsgBurnResponse{} } +func (m *MsgBurnResponse) String() string { return proto.CompactTextString(m) } +func (*MsgBurnResponse) ProtoMessage() {} +func (*MsgBurnResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d3542f4930ea9a46, []int{19} +} +func (m *MsgBurnResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurnResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurnResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurnResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurnResponse.Merge(m, src) +} +func (m *MsgBurnResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgBurnResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurnResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurnResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgBuyShr)(nil), "shareledger.gentlemint.MsgBuyShr") + proto.RegisterType((*MsgBuyShrResponse)(nil), "shareledger.gentlemint.MsgBuyShrResponse") + proto.RegisterType((*MsgSetExchange)(nil), "shareledger.gentlemint.MsgSetExchange") + proto.RegisterType((*MsgSetExchangeResponse)(nil), "shareledger.gentlemint.MsgSetExchangeResponse") + proto.RegisterType((*MsgSetLevelFee)(nil), "shareledger.gentlemint.MsgSetLevelFee") + proto.RegisterType((*MsgSetLevelFeeResponse)(nil), "shareledger.gentlemint.MsgSetLevelFeeResponse") + proto.RegisterType((*MsgDeleteLevelFee)(nil), "shareledger.gentlemint.MsgDeleteLevelFee") + proto.RegisterType((*MsgDeleteLevelFeeResponse)(nil), "shareledger.gentlemint.MsgDeleteLevelFeeResponse") + proto.RegisterType((*MsgSetActionLevelFee)(nil), "shareledger.gentlemint.MsgSetActionLevelFee") + proto.RegisterType((*MsgSetActionLevelFeeResponse)(nil), "shareledger.gentlemint.MsgSetActionLevelFeeResponse") + proto.RegisterType((*MsgDeleteActionLevelFee)(nil), "shareledger.gentlemint.MsgDeleteActionLevelFee") + proto.RegisterType((*MsgDeleteActionLevelFeeResponse)(nil), "shareledger.gentlemint.MsgDeleteActionLevelFeeResponse") + proto.RegisterType((*MsgLoadFee)(nil), "shareledger.gentlemint.MsgLoadFee") + proto.RegisterType((*MsgLoadFeeResponse)(nil), "shareledger.gentlemint.MsgLoadFeeResponse") + proto.RegisterType((*MsgLoad)(nil), "shareledger.gentlemint.MsgLoad") + proto.RegisterType((*MsgLoadResponse)(nil), "shareledger.gentlemint.MsgLoadResponse") + proto.RegisterType((*MsgSend)(nil), "shareledger.gentlemint.MsgSend") + proto.RegisterType((*MsgSendResponse)(nil), "shareledger.gentlemint.MsgSendResponse") + proto.RegisterType((*MsgBurn)(nil), "shareledger.gentlemint.MsgBurn") + proto.RegisterType((*MsgBurnResponse)(nil), "shareledger.gentlemint.MsgBurnResponse") +} + +func init() { proto.RegisterFile("gentlemint/tx.proto", fileDescriptor_d3542f4930ea9a46) } + +var fileDescriptor_d3542f4930ea9a46 = []byte{ + // 719 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xcd, 0x6e, 0xd3, 0x4c, + 0x14, 0x8d, 0xeb, 0xb4, 0x51, 0x6f, 0xa5, 0x7e, 0x5f, 0xfd, 0x45, 0xfd, 0x8c, 0xa9, 0x9c, 0xd6, + 0x12, 0x50, 0xfe, 0x6c, 0xfa, 0x23, 0xb1, 0x02, 0x89, 0xb4, 0xb0, 0xa1, 0x91, 0x50, 0x2a, 0x21, + 0x60, 0x41, 0xe5, 0x38, 0xb7, 0x4e, 0x44, 0x32, 0x13, 0x79, 0x26, 0xa5, 0xdd, 0xf1, 0x00, 0x2c, + 0x78, 0x0a, 0x16, 0x3c, 0x49, 0x97, 0x5d, 0xb2, 0x02, 0xd4, 0x6e, 0x78, 0x0c, 0xe4, 0xb1, 0x3d, + 0x71, 0xd3, 0x32, 0x6e, 0x41, 0x42, 0x62, 0x95, 0x99, 0xf8, 0xdc, 0x73, 0x8e, 0xef, 0xcc, 0x3d, + 0x32, 0xfc, 0x17, 0x22, 0xe1, 0x3d, 0xec, 0x77, 0x09, 0xf7, 0xf8, 0xbe, 0x3b, 0x88, 0x28, 0xa7, + 0xc6, 0x3c, 0xeb, 0xf8, 0x11, 0xf6, 0xb0, 0x1d, 0x62, 0xe4, 0x8e, 0x00, 0x96, 0x95, 0x03, 0xf7, + 0x70, 0x0f, 0x7b, 0x3b, 0xbb, 0x88, 0x49, 0x8d, 0xb5, 0x94, 0x7b, 0xe6, 0x07, 0xbc, 0x4b, 0xc9, + 0xce, 0x38, 0xa4, 0x1a, 0xd2, 0x90, 0x8a, 0xa5, 0x17, 0xaf, 0xd2, 0x7f, 0xed, 0x80, 0xb2, 0x3e, + 0x65, 0x5e, 0xcb, 0x67, 0xe8, 0xed, 0xad, 0xb4, 0x90, 0xfb, 0x2b, 0x5e, 0x40, 0xbb, 0x24, 0x79, + 0xee, 0x3c, 0x80, 0xe9, 0x06, 0x0b, 0xeb, 0xc3, 0x83, 0xed, 0x4e, 0x64, 0x98, 0x50, 0x09, 0x22, + 0xf4, 0x39, 0x8d, 0x4c, 0x6d, 0x51, 0x5b, 0x9e, 0x6e, 0x66, 0x5b, 0x63, 0x1e, 0xa6, 0xfc, 0x3e, + 0x1d, 0x12, 0x6e, 0x4e, 0x88, 0x07, 0xe9, 0xce, 0xb9, 0x06, 0x73, 0xb2, 0xbc, 0x89, 0x6c, 0x40, + 0x09, 0x43, 0xe3, 0x5f, 0xd0, 0x7b, 0x34, 0x4c, 0x29, 0xe2, 0xa5, 0xf3, 0x10, 0x66, 0x1b, 0x2c, + 0xdc, 0x46, 0xfe, 0x78, 0x3f, 0xe8, 0xf8, 0x24, 0x44, 0x85, 0x94, 0x01, 0xe5, 0xc8, 0xe7, 0x98, + 0x0a, 0x89, 0xb5, 0x63, 0xc2, 0xfc, 0xe9, 0xfa, 0x4c, 0xcb, 0xd9, 0xcb, 0x98, 0xb7, 0xe2, 0x76, + 0x3c, 0x41, 0x15, 0x73, 0x15, 0x26, 0x45, 0xd3, 0x52, 0xea, 0x64, 0x63, 0xac, 0x83, 0xbe, 0x8b, + 0x68, 0xea, 0x8b, 0xda, 0xf2, 0xcc, 0xea, 0x82, 0x9b, 0xf4, 0xcb, 0x8d, 0xfb, 0xe5, 0xa6, 0xfd, + 0x72, 0x37, 0x31, 0xd8, 0xa0, 0x5d, 0x52, 0x2f, 0x1f, 0x7e, 0xa9, 0x95, 0x9a, 0x31, 0x7c, 0xe4, + 0x28, 0xd3, 0x95, 0x8e, 0x36, 0x44, 0x4b, 0x36, 0xb1, 0x87, 0x1c, 0x7f, 0xd5, 0x94, 0x73, 0x15, + 0xae, 0x9c, 0x21, 0x91, 0x0a, 0xaf, 0xa1, 0x9a, 0x68, 0x3f, 0x12, 0x37, 0xe1, 0x02, 0x22, 0xf1, + 0xf1, 0x09, 0xac, 0x3c, 0x3e, 0xb1, 0x1b, 0x89, 0xeb, 0x79, 0x71, 0x1b, 0x16, 0xce, 0xe3, 0x97, + 0xfa, 0x4f, 0xe1, 0x7f, 0x69, 0xee, 0x77, 0x2d, 0x38, 0x4b, 0x50, 0xfb, 0x09, 0x99, 0xd4, 0x7b, + 0x01, 0xd0, 0x60, 0xe1, 0x16, 0xf5, 0xdb, 0x6a, 0x89, 0x7b, 0x50, 0x66, 0x9d, 0x68, 0x20, 0x04, + 0x0a, 0x8e, 0xb2, 0x29, 0x90, 0x4e, 0x15, 0x8c, 0x11, 0xb3, 0xd4, 0xfb, 0xa8, 0x41, 0x25, 0xfd, + 0x5b, 0xa1, 0x66, 0x42, 0xc5, 0x6f, 0xb7, 0x23, 0x64, 0x2c, 0x7d, 0xa3, 0x6c, 0x6b, 0x84, 0x30, + 0x19, 0x4f, 0x18, 0x33, 0xf5, 0x45, 0xbd, 0xf0, 0x4e, 0xad, 0xc5, 0x77, 0xea, 0xd3, 0xd7, 0xda, + 0xed, 0xb0, 0xcb, 0x3b, 0xc3, 0x96, 0x1b, 0xd0, 0xbe, 0x97, 0xce, 0x6c, 0xf2, 0x73, 0x97, 0xb5, + 0xdf, 0x78, 0xfc, 0x60, 0x80, 0x2c, 0xab, 0x61, 0xcd, 0x84, 0xdf, 0x99, 0x83, 0x7f, 0x52, 0x9f, + 0xe3, 0xde, 0xb7, 0x91, 0xfc, 0x15, 0xde, 0x63, 0x9f, 0xd2, 0xfb, 0xfb, 0xc4, 0x7b, 0x7d, 0x18, + 0x11, 0x85, 0x77, 0xe9, 0x70, 0xe2, 0x8f, 0x38, 0x8c, 0xdd, 0x64, 0x0e, 0x57, 0xbf, 0x57, 0x40, + 0x6f, 0xb0, 0xd0, 0x78, 0x0e, 0x53, 0x69, 0x64, 0x2e, 0xb9, 0xe7, 0xa7, 0xb9, 0x2b, 0x63, 0xd1, + 0xba, 0x59, 0x08, 0x91, 0xc9, 0x89, 0x30, 0x93, 0x0f, 0xc9, 0xeb, 0x8a, 0xca, 0x1c, 0xce, 0x72, + 0x2f, 0x86, 0x1b, 0x93, 0x91, 0x43, 0x5b, 0x20, 0x93, 0xe1, 0x8a, 0x64, 0xc6, 0xe7, 0xd6, 0x20, + 0x30, 0x3b, 0x16, 0x83, 0xaa, 0x56, 0x9c, 0x86, 0x5a, 0x2b, 0x17, 0x86, 0x4a, 0xbd, 0xb7, 0x30, + 0x77, 0x36, 0x14, 0xef, 0xa8, 0x4d, 0x9f, 0x46, 0x5b, 0xeb, 0x97, 0x41, 0x4b, 0xe1, 0x77, 0x1a, + 0x54, 0xcf, 0x8d, 0x43, 0xaf, 0xf0, 0x25, 0xc6, 0xf4, 0xef, 0x5f, 0xb2, 0x40, 0x5a, 0x78, 0x09, + 0x95, 0x2c, 0x20, 0x1d, 0x05, 0x47, 0x8a, 0xb1, 0x6e, 0x15, 0x63, 0x24, 0xf5, 0x33, 0x28, 0x8b, + 0x28, 0xac, 0x15, 0xd4, 0x58, 0x37, 0x0a, 0x00, 0x79, 0x46, 0x11, 0x50, 0x35, 0x65, 0xb7, 0x89, + 0x9a, 0x31, 0x1f, 0x1d, 0x31, 0xa3, 0x88, 0x8d, 0x9a, 0x72, 0xd6, 0x22, 0xa2, 0x64, 0xcc, 0x8f, + 0x7a, 0xbd, 0x71, 0x78, 0x6c, 0x6b, 0x47, 0xc7, 0xb6, 0xf6, 0xed, 0xd8, 0xd6, 0x3e, 0x9c, 0xd8, + 0xa5, 0xa3, 0x13, 0xbb, 0xf4, 0xf9, 0xc4, 0x2e, 0xbd, 0x5a, 0xcb, 0x65, 0x89, 0x20, 0x8b, 0xba, + 0x24, 0xf4, 0x72, 0xb4, 0xde, 0xbe, 0x97, 0xff, 0xee, 0x8b, 0xc3, 0xa5, 0x35, 0x25, 0x3e, 0xb7, + 0xd6, 0x7e, 0x04, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xe2, 0x93, 0xe3, 0x12, 0x0a, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + BuyShr(ctx context.Context, in *MsgBuyShr, opts ...grpc.CallOption) (*MsgBuyShrResponse, error) + SetExchange(ctx context.Context, in *MsgSetExchange, opts ...grpc.CallOption) (*MsgSetExchangeResponse, error) + SetLevelFee(ctx context.Context, in *MsgSetLevelFee, opts ...grpc.CallOption) (*MsgSetLevelFeeResponse, error) + DeleteLevelFee(ctx context.Context, in *MsgDeleteLevelFee, opts ...grpc.CallOption) (*MsgDeleteLevelFeeResponse, error) + SetActionLevelFee(ctx context.Context, in *MsgSetActionLevelFee, opts ...grpc.CallOption) (*MsgSetActionLevelFeeResponse, error) + DeleteActionLevelFee(ctx context.Context, in *MsgDeleteActionLevelFee, opts ...grpc.CallOption) (*MsgDeleteActionLevelFeeResponse, error) + LoadFee(ctx context.Context, in *MsgLoadFee, opts ...grpc.CallOption) (*MsgLoadFeeResponse, error) + Load(ctx context.Context, in *MsgLoad, opts ...grpc.CallOption) (*MsgLoadResponse, error) + Send(ctx context.Context, in *MsgSend, opts ...grpc.CallOption) (*MsgSendResponse, error) + Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) BuyShr(ctx context.Context, in *MsgBuyShr, opts ...grpc.CallOption) (*MsgBuyShrResponse, error) { + out := new(MsgBuyShrResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/BuyShr", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) SetExchange(ctx context.Context, in *MsgSetExchange, opts ...grpc.CallOption) (*MsgSetExchangeResponse, error) { + out := new(MsgSetExchangeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/SetExchange", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) SetLevelFee(ctx context.Context, in *MsgSetLevelFee, opts ...grpc.CallOption) (*MsgSetLevelFeeResponse, error) { + out := new(MsgSetLevelFeeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/SetLevelFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) DeleteLevelFee(ctx context.Context, in *MsgDeleteLevelFee, opts ...grpc.CallOption) (*MsgDeleteLevelFeeResponse, error) { + out := new(MsgDeleteLevelFeeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/DeleteLevelFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) SetActionLevelFee(ctx context.Context, in *MsgSetActionLevelFee, opts ...grpc.CallOption) (*MsgSetActionLevelFeeResponse, error) { + out := new(MsgSetActionLevelFeeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/SetActionLevelFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) DeleteActionLevelFee(ctx context.Context, in *MsgDeleteActionLevelFee, opts ...grpc.CallOption) (*MsgDeleteActionLevelFeeResponse, error) { + out := new(MsgDeleteActionLevelFeeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/DeleteActionLevelFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) LoadFee(ctx context.Context, in *MsgLoadFee, opts ...grpc.CallOption) (*MsgLoadFeeResponse, error) { + out := new(MsgLoadFeeResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/LoadFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) Load(ctx context.Context, in *MsgLoad, opts ...grpc.CallOption) (*MsgLoadResponse, error) { + out := new(MsgLoadResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/Load", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) Send(ctx context.Context, in *MsgSend, opts ...grpc.CallOption) (*MsgSendResponse, error) { + out := new(MsgSendResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/Send", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) { + out := new(MsgBurnResponse) + err := c.cc.Invoke(ctx, "/shareledger.gentlemint.Msg/Burn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + BuyShr(context.Context, *MsgBuyShr) (*MsgBuyShrResponse, error) + SetExchange(context.Context, *MsgSetExchange) (*MsgSetExchangeResponse, error) + SetLevelFee(context.Context, *MsgSetLevelFee) (*MsgSetLevelFeeResponse, error) + DeleteLevelFee(context.Context, *MsgDeleteLevelFee) (*MsgDeleteLevelFeeResponse, error) + SetActionLevelFee(context.Context, *MsgSetActionLevelFee) (*MsgSetActionLevelFeeResponse, error) + DeleteActionLevelFee(context.Context, *MsgDeleteActionLevelFee) (*MsgDeleteActionLevelFeeResponse, error) + LoadFee(context.Context, *MsgLoadFee) (*MsgLoadFeeResponse, error) + Load(context.Context, *MsgLoad) (*MsgLoadResponse, error) + Send(context.Context, *MsgSend) (*MsgSendResponse, error) + Burn(context.Context, *MsgBurn) (*MsgBurnResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) BuyShr(ctx context.Context, req *MsgBuyShr) (*MsgBuyShrResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BuyShr not implemented") +} +func (*UnimplementedMsgServer) SetExchange(ctx context.Context, req *MsgSetExchange) (*MsgSetExchangeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetExchange not implemented") +} +func (*UnimplementedMsgServer) SetLevelFee(ctx context.Context, req *MsgSetLevelFee) (*MsgSetLevelFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetLevelFee not implemented") +} +func (*UnimplementedMsgServer) DeleteLevelFee(ctx context.Context, req *MsgDeleteLevelFee) (*MsgDeleteLevelFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteLevelFee not implemented") +} +func (*UnimplementedMsgServer) SetActionLevelFee(ctx context.Context, req *MsgSetActionLevelFee) (*MsgSetActionLevelFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetActionLevelFee not implemented") +} +func (*UnimplementedMsgServer) DeleteActionLevelFee(ctx context.Context, req *MsgDeleteActionLevelFee) (*MsgDeleteActionLevelFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteActionLevelFee not implemented") +} +func (*UnimplementedMsgServer) LoadFee(ctx context.Context, req *MsgLoadFee) (*MsgLoadFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LoadFee not implemented") +} +func (*UnimplementedMsgServer) Load(ctx context.Context, req *MsgLoad) (*MsgLoadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Load not implemented") +} +func (*UnimplementedMsgServer) Send(ctx context.Context, req *MsgSend) (*MsgSendResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Send not implemented") +} +func (*UnimplementedMsgServer) Burn(ctx context.Context, req *MsgBurn) (*MsgBurnResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Burn not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_BuyShr_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgBuyShr) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).BuyShr(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/BuyShr", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).BuyShr(ctx, req.(*MsgBuyShr)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_SetExchange_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSetExchange) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SetExchange(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/SetExchange", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SetExchange(ctx, req.(*MsgSetExchange)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_SetLevelFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSetLevelFee) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SetLevelFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/SetLevelFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SetLevelFee(ctx, req.(*MsgSetLevelFee)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_DeleteLevelFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgDeleteLevelFee) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).DeleteLevelFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/DeleteLevelFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).DeleteLevelFee(ctx, req.(*MsgDeleteLevelFee)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_SetActionLevelFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSetActionLevelFee) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SetActionLevelFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/SetActionLevelFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SetActionLevelFee(ctx, req.(*MsgSetActionLevelFee)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_DeleteActionLevelFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgDeleteActionLevelFee) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).DeleteActionLevelFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/DeleteActionLevelFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).DeleteActionLevelFee(ctx, req.(*MsgDeleteActionLevelFee)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_LoadFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgLoadFee) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).LoadFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/LoadFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).LoadFee(ctx, req.(*MsgLoadFee)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_Load_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgLoad) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).Load(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/Load", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).Load(ctx, req.(*MsgLoad)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_Send_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSend) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).Send(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/Send", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).Send(ctx, req.(*MsgSend)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_Burn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgBurn) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).Burn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.gentlemint.Msg/Burn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).Burn(ctx, req.(*MsgBurn)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.gentlemint.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "BuyShr", + Handler: _Msg_BuyShr_Handler, + }, + { + MethodName: "SetExchange", + Handler: _Msg_SetExchange_Handler, + }, + { + MethodName: "SetLevelFee", + Handler: _Msg_SetLevelFee_Handler, + }, + { + MethodName: "DeleteLevelFee", + Handler: _Msg_DeleteLevelFee_Handler, + }, + { + MethodName: "SetActionLevelFee", + Handler: _Msg_SetActionLevelFee_Handler, + }, + { + MethodName: "DeleteActionLevelFee", + Handler: _Msg_DeleteActionLevelFee_Handler, + }, + { + MethodName: "LoadFee", + Handler: _Msg_LoadFee_Handler, + }, + { + MethodName: "Load", + Handler: _Msg_Load_Handler, + }, + { + MethodName: "Send", + Handler: _Msg_Send_Handler, + }, + { + MethodName: "Burn", + Handler: _Msg_Burn_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "gentlemint/tx.proto", +} + +func (m *MsgBuyShr) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBuyShr) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBuyShr) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Amount) > 0 { + i -= len(m.Amount) + copy(dAtA[i:], m.Amount) + i = encodeVarintTx(dAtA, i, uint64(len(m.Amount))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgBuyShrResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBuyShrResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBuyShrResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Log) > 0 { + i -= len(m.Log) + copy(dAtA[i:], m.Log) + i = encodeVarintTx(dAtA, i, uint64(len(m.Log))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSetExchange) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSetExchange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSetExchange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Rate) > 0 { + i -= len(m.Rate) + copy(dAtA[i:], m.Rate) + i = encodeVarintTx(dAtA, i, uint64(len(m.Rate))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSetExchangeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSetExchangeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSetExchangeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgSetLevelFee) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSetLevelFee) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSetLevelFee) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Fee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintTx(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSetLevelFeeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSetLevelFeeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSetLevelFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgDeleteLevelFee) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgDeleteLevelFee) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgDeleteLevelFee) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintTx(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgDeleteLevelFeeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgDeleteLevelFeeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgDeleteLevelFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgSetActionLevelFee) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSetActionLevelFee) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSetActionLevelFee) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Level) > 0 { + i -= len(m.Level) + copy(dAtA[i:], m.Level) + i = encodeVarintTx(dAtA, i, uint64(len(m.Level))) + i-- + dAtA[i] = 0x1a + } + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintTx(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSetActionLevelFeeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSetActionLevelFeeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSetActionLevelFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgDeleteActionLevelFee) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgDeleteActionLevelFee) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgDeleteActionLevelFee) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintTx(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgDeleteActionLevelFeeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgDeleteActionLevelFeeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgDeleteActionLevelFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgLoadFee) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgLoadFee) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgLoadFee) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Shrp != nil { + { + size, err := m.Shrp.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgLoadFeeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgLoadFeeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgLoadFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgLoad) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgLoad) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgLoad) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Coins) > 0 { + for iNdEx := len(m.Coins) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Coins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTx(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgLoadResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgLoadResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgLoadResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgSend) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSend) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSend) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Coins) > 0 { + for iNdEx := len(m.Coins) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Coins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTx(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSendResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSendResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSendResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgBurn) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurn) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurn) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Coins) > 0 { + for iNdEx := len(m.Coins) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Coins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgBurnResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurnResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurnResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgBuyShr) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Amount) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgBuyShrResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Log) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgSetExchange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Rate) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgSetExchangeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgSetLevelFee) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Level) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Fee.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgSetLevelFeeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgDeleteLevelFee) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Level) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgDeleteLevelFeeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgSetActionLevelFee) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Action) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Level) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgSetActionLevelFeeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgDeleteActionLevelFee) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Action) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgDeleteActionLevelFeeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgLoadFee) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Shrp != nil { + l = m.Shrp.Size() + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgLoadFeeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgLoad) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Coins) > 0 { + for _, e := range m.Coins { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgLoadResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgSend) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Coins) > 0 { + for _, e := range m.Coins { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgSendResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgBurn) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Coins) > 0 { + for _, e := range m.Coins { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgBurnResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgBuyShr) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgBuyShr: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBuyShr: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Amount = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgBuyShrResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgBuyShrResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBuyShrResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Log = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSetExchange) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSetExchange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSetExchange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSetExchangeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSetExchangeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSetExchangeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSetLevelFee) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSetLevelFee: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSetLevelFee: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Fee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSetLevelFeeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSetLevelFeeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSetLevelFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDeleteLevelFee) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgDeleteLevelFee: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDeleteLevelFee: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDeleteLevelFeeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgDeleteLevelFeeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDeleteLevelFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSetActionLevelFee) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSetActionLevelFee: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSetActionLevelFee: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Level = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSetActionLevelFeeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSetActionLevelFeeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSetActionLevelFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDeleteActionLevelFee) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgDeleteActionLevelFee: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDeleteActionLevelFee: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDeleteActionLevelFeeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgDeleteActionLevelFeeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDeleteActionLevelFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgLoadFee) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgLoadFee: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgLoadFee: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shrp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Shrp == nil { + m.Shrp = &types.DecCoin{} + } + if err := m.Shrp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgLoadFeeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgLoadFeeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgLoadFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgLoad) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgLoad: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgLoad: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Coins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Coins = append(m.Coins, types.DecCoin{}) + if err := m.Coins[len(m.Coins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgLoadResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgLoadResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgLoadResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSend) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSend: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSend: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Coins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Coins = append(m.Coins, types.DecCoin{}) + if err := m.Coins[len(m.Coins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSendResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgSendResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSendResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgBurn) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgBurn: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBurn: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Coins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Coins = append(m.Coins, types.DecCoin{}) + if err := m.Coins[len(m.Coins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgBurnResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgBurnResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBurnResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/gentlemint/types/types.go b/x/gentlemint/types/types.go index 3611edc9..ab1254f4 100644 --- a/x/gentlemint/types/types.go +++ b/x/gentlemint/types/types.go @@ -1,74 +1 @@ package types - -import ( - "fmt" - "strings" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - StatusSHRPLoaderActived = "actived" - StatusSHRPLoaderInactived = "inactived" - defaultSHRPLoaderStatus = StatusSHRPLoaderInactived - SHRP = "shrp" - CENT = "cent" - SHR = "shr" -) - -type SHRPLoader struct { - Status string `json:"status"` -} - -func NewSHRPLoader() SHRPLoader { - return SHRPLoader{ - Status: defaultSHRPLoaderStatus, - } -} - -func (sl SHRPLoader) String() string { - return strings.TrimSpace(fmt.Sprintf(`Status %s`, sl.Status)) -} - -// Status -const ( - Active = "active" - Inactive = "inactive" -) - -type AccState struct { - Address sdk.AccAddress `json:"address"` - Status string `json:"status"` -} - -func NewAccState(addr sdk.AccAddress, status string) AccState { - if status != Active && status != Inactive { - panic("Status is wrong") - } - return AccState{ - Address: addr, - Status: status, - } -} - -func (ids AccState) String() string { - return strings.TrimSpace(fmt.Sprintf(`%s:%s`, ids.Address.String(), ids.Status)) -} - -func (ids *AccState) Activate() { - ids.Status = Active -} - -func (ids AccState) IsEmpty() bool { - if len(ids.Address.Bytes()) == 0 || len(ids.Status) == 0 { - return true - } - return false -} - -func (ids AccState) IsActive() bool { - if ids.IsEmpty() { - return false - } - return ids.Status == Active -} diff --git a/x/id/client/cli/query.go b/x/id/client/cli/query.go new file mode 100644 index 00000000..98718573 --- /dev/null +++ b/x/id/client/cli/query.go @@ -0,0 +1,34 @@ +package cli + +import ( + "fmt" + // "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + // "github.com/cosmos/cosmos-sdk/client/flags" + // sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/sharering/shareledger/x/id/types" +) + +// GetQueryCmd returns the cli query commands for this module +func GetQueryCmd(queryRoute string) *cobra.Command { + // Group id queries under a subcommand + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand(CmdIdByAddress()) + + cmd.AddCommand(CmdIdById()) + + // this line is used by starport scaffolding # 1 + + return cmd +} diff --git a/x/id/client/cli/query_id_by_address.go b/x/id/client/cli/query_id_by_address.go new file mode 100644 index 00000000..4f322bdf --- /dev/null +++ b/x/id/client/cli/query_id_by_address.go @@ -0,0 +1,54 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/id/types" +) + +var _ = strconv.Itoa(0) + +func CmdIdByAddress() *cobra.Command { + cmd := &cobra.Command{ + Use: "info-by-address [address]", + Short: "Query for id information", + Long: strings.TrimSpace(fmt.Sprintf(` +Query id information of an account by owner address +Example: +$ %s query %s info-by-address shareledger1s432u6zv95wpluxhf4qru2ewy58kc3w4tkzm3v`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqAddress := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryIdByAddressRequest{ + + Address: reqAddress, + } + + res, err := queryClient.IdByAddress(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/id/client/cli/query_id_by_id.go b/x/id/client/cli/query_id_by_id.go new file mode 100644 index 00000000..2b913395 --- /dev/null +++ b/x/id/client/cli/query_id_by_id.go @@ -0,0 +1,54 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/id/types" +) + +var _ = strconv.Itoa(0) + +func CmdIdById() *cobra.Command { + cmd := &cobra.Command{ + Use: "info-by-id [id]", + Short: "Query for id information", + Long: strings.TrimSpace(fmt.Sprintf(` +Query id information of an account by owner id +Example: +$ %s query %s info-by-id 123e4567-e89b-12d3-a456-426655440000`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + reqId := args[0] + + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryIdByIdRequest{ + + Id: reqId, + } + + res, err := queryClient.IdById(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/id/client/cli/tx.go b/x/id/client/cli/tx.go new file mode 100644 index 00000000..77099cc7 --- /dev/null +++ b/x/id/client/cli/tx.go @@ -0,0 +1,39 @@ +package cli + +import ( + "fmt" + "time" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + // "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/sharering/shareledger/x/id/types" +) + +var ( + DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) +) + +const ( + flagPacketTimeoutTimestamp = "packet-timeout-timestamp" +) + +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand(CmdCreateId()) + cmd.AddCommand(CmdCreateIds()) + cmd.AddCommand(CmdUpdateId()) + cmd.AddCommand(CmdReplaceIdOwner()) + // this line is used by starport scaffolding # 1 + + return cmd +} diff --git a/x/id/client/cli/tx_create_id.go b/x/id/client/cli/tx_create_id.go new file mode 100644 index 00000000..a6e6cdbf --- /dev/null +++ b/x/id/client/cli/tx_create_id.go @@ -0,0 +1,56 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/id/types" +) + +var _ = strconv.Itoa(0) + +func CmdCreateId() *cobra.Command { + cmd := &cobra.Command{ + Use: "create [id] [backup-address] [owner-address] [extra-data]", + Short: "CreateAsset new id", + Long: strings.TrimSpace(fmt.Sprintf(` +CreateAsset a new Id by given information +Example: +$ %s tx %s create uid-159654 shareledger1s432u6zv95wpluxhf4qru2ewy58kc3w4tkzm3v shareledger1s432u6zv95wpluxhf4qru2ewy58kc3w4tkzm3v http://sharering.network`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(4), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argId := args[0] + argBackupAddress := args[1] + argOwnerAddress := args[2] + argExtraData := args[3] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgCreateId( + clientCtx.GetFromAddress().String(), + argBackupAddress, + argExtraData, + argId, + argOwnerAddress, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/id/client/cli/tx_create_ids.go b/x/id/client/cli/tx_create_ids.go new file mode 100644 index 00000000..f08cddd4 --- /dev/null +++ b/x/id/client/cli/tx_create_ids.go @@ -0,0 +1,57 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/version" + "github.com/sharering/shareledger/x/id/types" +) + +var _ = strconv.Itoa(0) + +func CmdCreateIds() *cobra.Command { + cmd := &cobra.Command{ + Use: "create-ids [id] [backup-address] [owner-address] [extra-data]", + Short: "create ids", + Long: strings.TrimSpace(fmt.Sprintf(` +CreateAsset new batch of IDs by given information +Example: +$ %s tx %s create uid-159654,uid-159655 shareledger1s432..,shareledgerzv95wpluxhf.. shareledger1s432,shareledgerzv95wpluxhf.. http://sharering.network/id1,http://sharering.network/id2`, version.Name, types.ModuleName)), + Args: cobra.ExactArgs(4), + RunE: func(cmd *cobra.Command, args []string) (err error) { + sep := "," + argId := strings.Split(args[0], sep) + argBackupAddress := strings.Split(args[1], sep) + argOwnerAddress := strings.Split(args[2], sep) + argExtraData := strings.Split(args[3], sep) + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgCreateIds( + clientCtx.GetFromAddress().String(), + argBackupAddress, + argExtraData, + argId, + argOwnerAddress, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/id/client/cli/tx_replace_id_owner.go b/x/id/client/cli/tx_replace_id_owner.go new file mode 100644 index 00000000..e416537a --- /dev/null +++ b/x/id/client/cli/tx_replace_id_owner.go @@ -0,0 +1,45 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/id/types" +) + +var _ = strconv.Itoa(0) + +func CmdReplaceIdOwner() *cobra.Command { + cmd := &cobra.Command{ + Use: "replace [id] [new-owner-address]", + Short: "Replace owner of an ID", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argId := args[0] + argOwnerAddress := args[1] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgReplaceIdOwner( + clientCtx.GetFromAddress().String(), + argId, + argOwnerAddress, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/id/client/cli/tx_update_id.go b/x/id/client/cli/tx_update_id.go new file mode 100644 index 00000000..38b7b356 --- /dev/null +++ b/x/id/client/cli/tx_update_id.go @@ -0,0 +1,45 @@ +package cli + +import ( + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/sharering/shareledger/x/id/types" +) + +var _ = strconv.Itoa(0) + +func CmdUpdateId() *cobra.Command { + cmd := &cobra.Command{ + Use: "update [id] [extra-data]", + Short: "UpdateAsset information of an ID", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argId := args[0] + argExtraData := args[1] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgUpdateId( + clientCtx.GetFromAddress().String(), + argId, + argExtraData, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/id/client/tests/cli_test.go b/x/id/client/tests/cli_test.go new file mode 100644 index 00000000..9edc5a7e --- /dev/null +++ b/x/id/client/tests/cli_test.go @@ -0,0 +1,23 @@ +package tests + +import ( + "github.com/sharering/shareledger/cmd/Shareledgerd/cli" + "sync" + "testing" + + "github.com/sharering/shareledger/testutil/network" + "github.com/stretchr/testify/suite" +) + +var runOnce = sync.Once{} + +func init() { + runOnce.Do(func() { + cli.InitMiddleWare() + }) +} +func TestIDModuleIntegration(t *testing.T) { + networkConf := network.ShareLedgerTestingConfig() + networkConf.NumValidators = 1 + suite.Run(t, NewIDIntegrationTestSuite(networkConf)) +} diff --git a/x/id/client/tests/suite.go b/x/id/client/tests/suite.go new file mode 100644 index 00000000..9024d98a --- /dev/null +++ b/x/id/client/tests/suite.go @@ -0,0 +1,491 @@ +package tests + +import ( + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + netutilts "github.com/sharering/shareledger/testutil/network" + idtypes "github.com/sharering/shareledger/x/id/types" + "github.com/stretchr/testify/suite" + "os" + "strings" + + "github.com/sharering/shareledger/x/electoral/client/tests" +) + +type IDIntegrationTestSuite struct { + suite.Suite + + cfg network.Config + dir string + network *network.Network +} + +func NewIDIntegrationTestSuite(cfg network.Config) *IDIntegrationTestSuite { + return &IDIntegrationTestSuite{cfg: cfg} +} +func (s *IDIntegrationTestSuite) setupTestMaterial() { + + out, _ := tests.ExCmdEnrollAccountOperator( + s.network.Validators[0].ClientCtx, + []string{netutilts.Accounts[netutilts.KeyOperator].String()}, + netutilts.MakeByAccount(netutilts.KeyAuthority), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee2, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init operator fail %v", res.String()) + + initIDSig := []struct { + accID string + id string + idOwner string + idBackup string + idData string + }{ + { + id: "[owner_Acc1_Backup_Acc2]existed_replace_owner_id_1", + idData: "existed_replace_owner_id_data_1", + idOwner: netutilts.Accounts[netutilts.KeyAccount1].String(), + idBackup: netutilts.Accounts[netutilts.KeyAccount2].String(), + accID: netutilts.KeyAccount1, + }, + { + accID: netutilts.KeyIDSigner, + }, + { + id: "[owner_Acc3_Backup_Acc4]existed_replace_owner_id_2", + idData: "existed_replace_owner_id_data_2", + idOwner: netutilts.Accounts[netutilts.KeyAccount3].String(), + idBackup: netutilts.Accounts[netutilts.KeyAccount4].String(), + accID: netutilts.KeyAccount3, + }, + { + id: "[owner_Acc5_Backup_Acc6]existed_update_id_1", + idData: "existed_update_id_data_2", + accID: netutilts.KeyAccount5, + idOwner: netutilts.Accounts[netutilts.KeyAccount5].String(), + idBackup: netutilts.Accounts[netutilts.KeyAccount6].String(), + }, + { + id: "[owner_Acc6_Backup_Acc6]existed_update_id_1", + idData: "existed_update_id_data_1", + accID: netutilts.KeyAccount5, + idOwner: netutilts.Accounts[netutilts.KeyAccount6].String(), + idBackup: netutilts.Accounts[netutilts.KeyAccount6].String(), + }, + { + id: "[owner_Acc7_Backup_Acc8]existed_update_id_2", + idData: "existed_update_id_data_2", + accID: netutilts.KeyAccount7, + idOwner: netutilts.Accounts[netutilts.KeyAccount7].String(), + idBackup: netutilts.Accounts[netutilts.KeyAccount8].String(), + }, + } + + for _, id := range initIDSig { + if id.accID != "" { + out, _ = tests.ExCmdEnrollIdSigner( + s.network.Validators[0].ClientCtx, + []string{netutilts.Accounts[id.accID].String()}, + netutilts.MakeByAccount(netutilts.KeyOperator), + netutilts.SkipConfirmation, + netutilts.BlockBroadcast, + netutilts.SHRFee2, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res = netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init id signer fail %v", res.String()) + } + if id.id != "" { + out, _ = CmdExNewID(s.network.Validators[0].ClientCtx, id.id, id.idBackup, id.idOwner, id.idData, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(id.accID), + netutilts.BlockBroadcast, + netutilts.SHRFee2, + ) + s.Require().NoError(s.network.WaitForNextBlock()) + res = netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(netutilts.ShareLedgerSuccessCode, res.Code, "init id fail %v", res.String()) + } + + } +} +func (s *IDIntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite for booking module") + + kb, dir := netutilts.GetTestingGenesis(s.T(), &s.cfg) + s.dir = dir + + s.network = network.New(s.T(), s.cfg) + _, err := s.network.WaitForHeight(1) + s.Require().NoError(err) + + //override the keyring by our keyring information + s.network.Validators[0].ClientCtx.Keyring = kb + + s.T().Log("setting up id data....") + s.setupTestMaterial() + s.T().Log("setting up integration test suite successfully") +} +func (s *IDIntegrationTestSuite) TearDownSuite() { + s.NoError(os.RemoveAll(s.dir), "tearing down fail") + s.network.Cleanup() + s.T().Log("tearing down integration test suite") +} + +func (s *IDIntegrationTestSuite) TestCreateID() { + + validatorCtx := s.network.Validators[0].ClientCtx + type ( + TestCase struct { + d string + iId string + iBackupAddr string + iOwnerAddr string + iExData string + txFee int + txCreator string + oErr error + oRes *sdk.TxResponse + oId *idtypes.Id + } + ) + + testSuite := []TestCase{ + { + d: "create_the_valid_id_should_be_success", + iId: "ID_1", + iOwnerAddr: "shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4", + iBackupAddr: "shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4", + iExData: "the ex_data", + txCreator: netutilts.KeyIDSigner, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oId: &idtypes.Id{ + Id: "ID_1", + Data: &idtypes.BaseID{ + IssuerAddress: netutilts.Accounts[netutilts.KeyIDSigner].String(), + BackupAddress: "shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4", + OwnerAddress: "shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4", + ExtraData: "the ex_data", + }, + }, + }, + { + d: "create_the_valid_id_but_caller_is_not_id_signer", + iId: "ID_1", + iOwnerAddr: "shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4", + iBackupAddr: "shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4", + iExData: "the ex_data", + txCreator: netutilts.KeyAccount2, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExNewID(validatorCtx, tc.iId, tc.iBackupAddr, tc.iOwnerAddr, tc.iExData, + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator), + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txFee), + ) + if tc.oErr != nil { + s.NotNilf(err, "this case need return error") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "create ID fail %s", out) + } + if tc.oId != nil { + out = CmdExGetID(validatorCtx, s.T(), tc.iId, + netutilts.JSONFlag, + ) + idData := IDJsonUnmarshal(s.T(), out.Bytes()) + + s.Equalf(tc.oId.Id, idData.Id, "id not equal") + s.Equalf(tc.oId.GetData().GetExtraData(), idData.GetData().GetExtraData(), "data not equal") + s.Equal(tc.oId.GetData().BackupAddress, idData.ToBaseID().BackupAddress) + s.Equal(tc.oId.GetData().OwnerAddress, idData.ToBaseID().OwnerAddress) + s.Equal(netutilts.Accounts[netutilts.KeyIDSigner].String(), idData.ToBaseID().IssuerAddress) + } + }) + } + +} + +func (s *IDIntegrationTestSuite) TestCreateIDInBatch() { + + type ( + TestCase struct { + d string + iIds []string + iBackupAddrs []string + iOwnerAddrs []string + iExDatas []string + txFee int + txCreator string + oErr error + oRes *sdk.TxResponse + oId []idtypes.Id + } + ) + + testSuite := []TestCase{ + { + d: "create_the_valid_id_should_be_success", + iIds: []string{"batch_ID_1", "batch_ID_2", "batch_ID_3"}, + iOwnerAddrs: []string{ + "shareledger1ghrpxfgfy0kdnas8lsr9wjq3q0hg0m3cs3n8n8", + "shareledger17papd8h9glkvx0ff0lexn9u42689y63ffrtxs2", + "shareledger1hq7wjjgeymvs3q4vmkvac3dghfsjwvjvf8jdaw"}, + iBackupAddrs: []string{ + "shareledger1ghrpxfgfy0kdnas8lsr9wjq3q0hg0m3cs3n8n8", + "shareledger17papd8h9glkvx0ff0lexn9u42689y63ffrtxs2", + "shareledger1hq7wjjgeymvs3q4vmkvac3dghfsjwvjvf8jdaw"}, + iExDatas: []string{"ex_data_1", "ex_data_2", "ex_data_3"}, + txCreator: netutilts.KeyIDSigner, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oId: []idtypes.Id{ + { + Id: "batch_ID_1", + Data: &idtypes.BaseID{ + IssuerAddress: netutilts.Accounts[netutilts.KeyIDSigner].String(), + BackupAddress: "shareledger1ghrpxfgfy0kdnas8lsr9wjq3q0hg0m3cs3n8n8", + OwnerAddress: "shareledger1ghrpxfgfy0kdnas8lsr9wjq3q0hg0m3cs3n8n8", + ExtraData: "ex_data_1", + }, + }, + { + Id: "batch_ID_2", + Data: &idtypes.BaseID{ + IssuerAddress: netutilts.Accounts[netutilts.KeyIDSigner].String(), + BackupAddress: "shareledger17papd8h9glkvx0ff0lexn9u42689y63ffrtxs2", + OwnerAddress: "shareledger17papd8h9glkvx0ff0lexn9u42689y63ffrtxs2", + ExtraData: "ex_data_2", + }, + }, + { + Id: "batch_ID_3", + Data: &idtypes.BaseID{ + IssuerAddress: netutilts.Accounts[netutilts.KeyIDSigner].String(), + BackupAddress: "shareledger1hq7wjjgeymvs3q4vmkvac3dghfsjwvjvf8jdaw", + OwnerAddress: "shareledger1hq7wjjgeymvs3q4vmkvac3dghfsjwvjvf8jdaw", + ExtraData: "ex_data_3", + }, + }, + }, + }, + { + d: "create_id_but_creator_is_not_authorizer", + iIds: []string{"batch_ID_4"}, + iOwnerAddrs: []string{"shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4"}, + iBackupAddrs: []string{"shareledger1pclpkwn6vc6lmrmv7407cd7em4cypdekc6kvn4"}, + iExDatas: []string{"the ex_data"}, + txCreator: netutilts.KeyAccount2, + txFee: 2, + oErr: nil, + oRes: &sdk.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExNewIDInBatch(validatorCtx, + strings.Join(tc.iIds, ","), + strings.Join(tc.iBackupAddrs, ","), + strings.Join(tc.iOwnerAddrs, ","), + strings.Join(tc.iExDatas, ","), + netutilts.JSONFlag, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator), + netutilts.BlockBroadcast, + netutilts.SHRFee(tc.txFee), + ) + if tc.oErr != nil { + s.NotNilf(err, "this case need return error") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "create ID fail %s", out) + } + if len(tc.oId) != 0 { + for _, i := range tc.oId { + out = CmdExGetID(validatorCtx, s.T(), i.GetId(), + netutilts.JSONFlag, + ) + idData := IDJsonUnmarshal(s.T(), out.Bytes()) + + s.Equalf(i.Id, idData.Id, "id not equal") + s.Equalf(i.GetData().GetExtraData(), idData.GetData().GetExtraData(), "data not equal") + s.Equal(i.GetData().BackupAddress, idData.ToBaseID().BackupAddress) + s.Equal(i.GetData().OwnerAddress, idData.ToBaseID().OwnerAddress) + s.Equal(netutilts.Accounts[netutilts.KeyIDSigner].String(), i.ToBaseID().IssuerAddress) + } + + } + }) + } + +} + +func (s *IDIntegrationTestSuite) TestUpdateID() { + testSuite := []struct { + d string + iID string + iData string + txFee int + txCreator string + oErr error + oRes *sdk.TxResponse + oId *idtypes.Id + }{ + { + d: "update_id_data_success", + iID: "[owner_Acc5_Backup_Acc6]existed_update_id_1", + iData: "update_to_new_1", + txFee: 2, + txCreator: netutilts.KeyAccount5, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oId: &idtypes.Id{ + Id: "[owner_Acc5_Backup_Acc6]existed_update_id_1", + Data: &idtypes.BaseID{ + ExtraData: "update_to_new_1", + }, + }, + }, { + d: "update_id_data_caller_is_not_id_signer", + iID: "[owner_Acc7_Backup_Acc8]existed_update_id_2", + iData: "update_to_new_2", + txFee: 2, + txCreator: netutilts.KeyAccount2, + oErr: nil, + oRes: &sdk.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + oId: &idtypes.Id{ + Id: "[owner_Acc7_Backup_Acc8]existed_update_id_2", + Data: &idtypes.BaseID{ + ExtraData: "existed_update_id_data_2", + }, + }, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExUpdateID(validatorCtx, tc.iID, tc.iData, + netutilts.SkipConfirmation, + netutilts.MakeByAccount(tc.txCreator), + netutilts.BlockBroadcast, + netutilts.JSONFlag, + netutilts.SHRFee(tc.txFee)) + if tc.oErr != nil { + s.NotNilf(err, "error is required in this case") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "update ID fail %s", out) + } + if tc.oId != nil { + out = CmdExGetID(validatorCtx, s.T(), tc.iID, + netutilts.JSONFlag, + ) + idData := IDJsonUnmarshal(s.T(), out.Bytes()) + s.Equalf(tc.oId.GetData().GetExtraData(), idData.GetData().GetExtraData(), "data not equal") + } + }) + } + +} + +func (s *IDIntegrationTestSuite) TestReplaceOwner() { + + testSuite := []struct { + d string + iID string + iNewAddr string + txFee int + txCreator string + oErr error + oRes *sdk.TxResponse + oId *idtypes.Id + }{ + { + d: "replace_id_owner_data_success", + iID: "[owner_Acc1_Backup_Acc2]existed_replace_owner_id_1", + iNewAddr: netutilts.Accounts[netutilts.KeyAccount2].String(), + txFee: 2, + txCreator: netutilts.KeyAccount2, + oErr: nil, + oRes: &sdk.TxResponse{Code: netutilts.ShareLedgerSuccessCode}, + oId: &idtypes.Id{ + Id: "[owner_Acc1_Backup_Acc2]existed_replace_owner_id_1", + Data: &idtypes.BaseID{ + OwnerAddress: netutilts.Accounts[netutilts.KeyAccount2].String(), + }, + }, + }, + { + d: "replace_id_owner_data_caller_is_not_backup", + iID: "[owner_Acc3_Backup_Acc4]existed_replace_owner_id_2", + iNewAddr: netutilts.Accounts[netutilts.KeyAccount4].String(), + txFee: 2, + txCreator: netutilts.KeyAccount5, + oErr: nil, + oRes: &sdk.TxResponse{Code: sdkerrors.ErrUnauthorized.ABCICode()}, + oId: &idtypes.Id{ + Id: "[owner_Acc3_Backup_Acc4]existed_replace_owner_id_2", + Data: &idtypes.BaseID{ + OwnerAddress: netutilts.Accounts[netutilts.KeyAccount3].String(), + }, + }, + }, + { + d: "replace_id_owner_but_backup_already_hold_another_id", + iID: "[owner_Acc5_Backup_Acc6]existed_update_id_1", + iNewAddr: netutilts.Accounts[netutilts.KeyAccount6].String(), + txFee: 2, + txCreator: netutilts.KeyAccount6, + oErr: nil, + oRes: &sdk.TxResponse{Code: idtypes.ErrOwnerHasID.ABCICode()}, + oId: &idtypes.Id{ + Id: "[owner_Acc5_Backup_Acc6]existed_update_id_1", + Data: &idtypes.BaseID{ + OwnerAddress: netutilts.Accounts[netutilts.KeyAccount5].String(), + }, + }, + }, + } + validatorCtx := s.network.Validators[0].ClientCtx + for _, tc := range testSuite { + s.Run(tc.d, func() { + out, err := CmdExReplaceIdOwner(validatorCtx, tc.iID, tc.iNewAddr, + netutilts.MakeByAccount(tc.txCreator), + netutilts.SkipConfirmation, netutilts.JSONFlag, netutilts.SHRFee(tc.txFee), netutilts.BlockBroadcast) + if tc.oErr != nil { + s.NotNilf(err, "require error in this case") + } + if tc.oRes != nil { + txResponse := netutilts.ParseStdOut(s.T(), out.Bytes()) + s.Equalf(tc.oRes.Code, txResponse.Code, "update ID fail %s", out) + } + if tc.oId != nil { + out = CmdExGetID(validatorCtx, s.T(), tc.iID, + netutilts.JSONFlag, + ) + idData := IDJsonUnmarshal(s.T(), out.Bytes()) + s.Equalf(tc.oId.GetData().GetOwnerAddress(), idData.GetData().GetOwnerAddress(), "owner not equal") + } + }) + } + +} diff --git a/x/id/client/tests/test_helpers.go b/x/id/client/tests/test_helpers.go new file mode 100644 index 00000000..637ec97a --- /dev/null +++ b/x/id/client/tests/test_helpers.go @@ -0,0 +1,74 @@ +package tests + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/stretchr/testify/require" + "github.com/tendermint/spm/cosmoscmd" + + "github.com/sharering/shareledger/app" + "github.com/sharering/shareledger/x/id/client/cli" + "github.com/sharering/shareledger/x/id/types" +) + +func CmdExNewID(clientCtx client.Context, userID, backupAddress, addressOwner, exData string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{userID, backupAddress, addressOwner, exData} + args = append(args, extraFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdCreateId(), args) +} + +func CmdExNewIDInBatch(clientCtx client.Context, userIDs, backupAddresses, addressOwners, exDatas string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{userIDs, backupAddresses, addressOwners, exDatas} + args = append(args, extraFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdCreateIds(), args) +} + +func CmdExGetID(clientCtx client.Context, t *testing.T, userID string, extraFlags ...string) testutil.BufferWriter { + args := []string{userID} + args = append(args, extraFlags...) + out, err := clitestutil.ExecTestCLICmd(clientCtx, cli.CmdIdById(), args) + if err != nil { + t.Errorf("fail get id: %v", err) + } + + return out +} + +func CmdExUpdateID(clientCtx client.Context, userID, exData string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{userID, exData} + args = append(args, extraFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdUpdateId(), args) +} + +func CmdExReplaceIdOwner(clientCtx client.Context, userID, newAddress string, extraFlags ...string) (testutil.BufferWriter, error) { + args := []string{userID, newAddress} + args = append(args, extraFlags...) + + return clitestutil.ExecTestCLICmd(clientCtx, cli.CmdReplaceIdOwner(), args) +} + +func CmdExGetIDByAddress(clientCtx client.Context, t *testing.T, addr string, extraFlags ...string) testutil.BufferWriter { + args := []string{addr} + args = append(args, extraFlags...) + out, err := clitestutil.ExecTestCLICmd(clientCtx, cli.CmdIdByAddress(), args) + if err != nil { + t.Errorf("fail get id: %v", err) + } + + return out +} + +func IDJsonUnmarshal(t *testing.T, data []byte) types.Id { + var a types.QueryIdByIdResponse + encCfg := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) + err := encCfg.Marshaler.UnmarshalJSON(data, &a) + require.NoError(t, err) + return *a.Id + +} diff --git a/x/id/genesis.go b/x/id/genesis.go new file mode 100644 index 00000000..82e68192 --- /dev/null +++ b/x/id/genesis.go @@ -0,0 +1,31 @@ +package id + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/id/keeper" + "github.com/sharering/shareledger/x/id/types" +) + +// InitGenesis initializes the capability module's state from a provided genesis +// state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + // this line is used by starport scaffolding # genesis/module/init + for _, id := range genState.IDs { + k.SetID(ctx, id) + } +} + +// ExportGenesis returns the capability module's exported genesis. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() + + // this line is used by starport scaffolding # genesis/module/export + cb := func(id types.Id) bool { + genesis.IDs = append(genesis.IDs, &id) + return false + } + + k.IterateID(ctx, cb) + + return genesis +} diff --git a/x/id/genesis_test.go b/x/id/genesis_test.go new file mode 100644 index 00000000..7a84f711 --- /dev/null +++ b/x/id/genesis_test.go @@ -0,0 +1,23 @@ +package id_test + +import ( + "testing" + + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/id" + "github.com/sharering/shareledger/x/id/types" + "github.com/stretchr/testify/require" +) + +func TestGenesis(t *testing.T) { + genesisState := types.GenesisState{ + // this line is used by starport scaffolding # genesis/test/state + } + + k, ctx := keepertest.IdKeeper(t) + id.InitGenesis(ctx, *k, genesisState) + got := id.ExportGenesis(ctx, *k) + require.NotNil(t, got) + + // this line is used by starport scaffolding # genesis/test/assert +} diff --git a/x/id/handler.go b/x/id/handler.go new file mode 100644 index 00000000..2c5d99c0 --- /dev/null +++ b/x/id/handler.go @@ -0,0 +1,38 @@ +package id + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/id/keeper" + "github.com/sharering/shareledger/x/id/types" +) + +// NewHandler ... +func NewHandler(k keeper.Keeper) sdk.Handler { + msgServer := keeper.NewMsgServerImpl(k) + + return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + ctx = ctx.WithEventManager(sdk.NewEventManager()) + + switch msg := msg.(type) { + case *types.MsgCreateId: + res, err := msgServer.CreateId(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgCreateIds: + res, err := msgServer.CreateIds(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgUpdateId: + res, err := msgServer.UpdateId(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgReplaceIdOwner: + res, err := msgServer.ReplaceIdOwner(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + // this line is used by starport scaffolding # 1 + default: + errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) + return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + } + } +} diff --git a/x/id/keeper/grpc_query.go b/x/id/keeper/grpc_query.go new file mode 100644 index 00000000..4d54d7b0 --- /dev/null +++ b/x/id/keeper/grpc_query.go @@ -0,0 +1,7 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/id/types" +) + +var _ types.QueryServer = Keeper{} diff --git a/x/id/keeper/grpc_query_id_by_address.go b/x/id/keeper/grpc_query_id_by_address.go new file mode 100644 index 00000000..eadeee7e --- /dev/null +++ b/x/id/keeper/grpc_query_id_by_address.go @@ -0,0 +1,28 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/id/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) IdByAddress(goCtx context.Context, req *types.QueryIdByAddressRequest) (*types.QueryIdByAddressResponse, error) { + address, err := sdk.AccAddressFromBech32(req.Address) + + if req == nil || len(req.Address) == 0 || err != nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Process the query + id, found := k.GetFullIDByAddress(ctx, address) + if !found { + return nil, status.Error(codes.NotFound, "id not found") + } + + return &types.QueryIdByAddressResponse{Id: id}, nil +} diff --git a/x/id/keeper/grpc_query_id_by_id.go b/x/id/keeper/grpc_query_id_by_id.go new file mode 100644 index 00000000..d92a5063 --- /dev/null +++ b/x/id/keeper/grpc_query_id_by_id.go @@ -0,0 +1,26 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/id/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) IdById(goCtx context.Context, req *types.QueryIdByIdRequest) (*types.QueryIdByIdResponse, error) { + if req == nil || len(req.Id) == 0 || len(req.Id) > types.MAX_ID_LEN { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Process the query + id, found := k.GetFullIDByIDString(ctx, req.Id) + if !found { + return nil, status.Error(codes.NotFound, "id not found") + } + + return &types.QueryIdByIdResponse{Id: id}, nil +} diff --git a/x/id/keeper/id.go b/x/id/keeper/id.go new file mode 100644 index 00000000..abba8bdc --- /dev/null +++ b/x/id/keeper/id.go @@ -0,0 +1,103 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/id/types" +) + +func (k Keeper) SetID(ctx sdk.Context, id *types.Id) { + baseStore := ctx.KVStore(k.storeKey) + + // address -> id + addressStore := prefix.NewStore(baseStore, types.KeyPrefix(types.AddressKeyPrefix)) + a, _ := sdk.AccAddressFromBech32(id.Data.OwnerAddress) + addressStore.Set(a, []byte(id.Id)) + + // id -> {ID} + basedId := id.ToBaseID() + idStore := prefix.NewStore(baseStore, types.KeyPrefix(types.IDKeyPrefix)) + idStore.Set([]byte(id.Id), types.MustMarshalBaseID(k.cdc, &basedId)) +} + +func (k Keeper) GetBaseID(ctx sdk.Context, id []byte) (types.BaseID, bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.IDKeyPrefix)) + bz := store.Get(id) + + if len(bz) == 0 { + return types.BaseID{}, false + } + + bid := types.MustUnmarshalBaseID(k.cdc, bz) + return bid, true +} + +func (k Keeper) GetFullIDByAddress(ctx sdk.Context, ownerAddr sdk.AccAddress) (*types.Id, bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AddressKeyPrefix)) + + id := store.Get(ownerAddr) + if len(id) == 0 { + // TODO + return nil, false + } + + bid, found := k.GetBaseID(ctx, id) + if !found { + return nil, false + } + + rs := types.NewIDFromBaseID(string(id), &bid) + return &rs, true +} + +func (k Keeper) GetIdByAddress(ctx sdk.Context, ownerAddr sdk.AccAddress) []byte { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AddressKeyPrefix)) + + id := store.Get(ownerAddr) + + return id +} + +func (k Keeper) GetFullIDByIDString(ctx sdk.Context, id string) (*types.Id, bool) { + bid, found := k.GetBaseID(ctx, []byte(id)) + if !found { + return nil, false + } + rs := types.NewIDFromBaseID(id, &bid) + return &rs, true +} + +// Check if an ID is existed or not. Then check the owner has id or not +func (k Keeper) IsExist(ctx sdk.Context, id *types.Id) bool { + baseStore := ctx.KVStore(k.storeKey) + + // Check owner id + addressStore := prefix.NewStore(baseStore, types.KeyPrefix(types.AddressKeyPrefix)) + a, _ := sdk.AccAddressFromBech32(id.Data.OwnerAddress) + idBytes := addressStore.Get(a) + + if len(idBytes) != 0 { + return true + } + + // Check id + idStore := prefix.NewStore(baseStore, types.KeyPrefix(types.IDKeyPrefix)) + bz := idStore.Get([]byte(id.Id)) + + return len(bz) != 0 +} + +func (k Keeper) IterateID(ctx sdk.Context, cb func(id types.Id) bool) { + store := ctx.KVStore(k.storeKey) + iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefix(types.IDKeyPrefix)) + + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + bId := types.MustUnmarshalBaseID(k.cdc, iterator.Value()) + idKey := iterator.Key()[len(types.IDKeyPrefix):] + id := types.NewIDFromBaseID(string(idKey), &bId) + if cb(id) { + break + } + } +} diff --git a/x/id/keeper/keeper.go b/x/id/keeper/keeper.go new file mode 100644 index 00000000..b78a6fc2 --- /dev/null +++ b/x/id/keeper/keeper.go @@ -0,0 +1,35 @@ +package keeper + +import ( + "fmt" + + "github.com/tendermint/tendermint/libs/log" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/sharering/shareledger/x/id/types" +) + +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey sdk.StoreKey + memKey sdk.StoreKey + } +) + +func NewKeeper( + cdc codec.BinaryCodec, + storeKey, + memKey sdk.StoreKey, +) *Keeper { + return &Keeper{ + cdc: cdc, + storeKey: storeKey, + memKey: memKey, + } +} + +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) +} diff --git a/x/id/keeper/msg_server.go b/x/id/keeper/msg_server.go new file mode 100644 index 00000000..12dad4e4 --- /dev/null +++ b/x/id/keeper/msg_server.go @@ -0,0 +1,17 @@ +package keeper + +import ( + "github.com/sharering/shareledger/x/id/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} diff --git a/x/id/keeper/msg_server_create_id.go b/x/id/keeper/msg_server_create_id.go new file mode 100644 index 00000000..4fe64c30 --- /dev/null +++ b/x/id/keeper/msg_server_create_id.go @@ -0,0 +1,41 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/id/types" +) + +func (k msgServer) CreateId(goCtx context.Context, msg *types.MsgCreateId) (*types.MsgCreateIdResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + id := msg.ToID() + + // check existing + if k.IsExist(ctx, &id) { + return nil, sdkerrors.Wrap(types.ErrIdExisted, id.String()) + } + + k.SetID(ctx, &id) + + // Emit 2 events + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.EventCreateID, + sdk.NewAttribute(types.EventAttrIssuer, msg.IssuerAddress), + sdk.NewAttribute(types.EventAttrOwner, msg.OwnerAddress), + sdk.NewAttribute(types.EventAttrId, msg.Id), + ), + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.IssuerAddress), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventCreateID), + ), + }) + + return &types.MsgCreateIdResponse{}, nil +} diff --git a/x/id/keeper/msg_server_create_id_batch.go b/x/id/keeper/msg_server_create_id_batch.go new file mode 100644 index 00000000..6908fc2e --- /dev/null +++ b/x/id/keeper/msg_server_create_id_batch.go @@ -0,0 +1,53 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/id/types" +) + +func (k msgServer) CreateIds(goCtx context.Context, msg *types.MsgCreateIds) (*types.MsgCreateIdsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + for i := 0; i < len(msg.Id); i++ { + data := types.BaseID{ + IssuerAddress: msg.IssuerAddress, + BackupAddress: msg.BackupAddress[i], + OwnerAddress: msg.OwnerAddress[i], + ExtraData: msg.ExtraData[i], + } + + id := types.Id{ + Id: msg.Id[i], + Data: &data, + } + + // check id existing + if k.IsExist(ctx, &id) { + return nil, sdkerrors.Wrap(types.ErrIdExisted, id.String()) + } + + k.SetID(ctx, &id) + event := sdk.NewEvent( + types.EventCreateID, + sdk.NewAttribute(types.EventAttrIssuer, msg.IssuerAddress), + sdk.NewAttribute(types.EventAttrOwner, msg.OwnerAddress[i]), + sdk.NewAttribute(types.EventAttrId, msg.Id[i]), + ) + ctx.EventManager().EmitEvent(event) + } + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.IssuerAddress), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventCreateIDs), + ), + }) + + return &types.MsgCreateIdsResponse{}, nil +} diff --git a/x/id/keeper/msg_server_replace_id_owner.go b/x/id/keeper/msg_server_replace_id_owner.go new file mode 100644 index 00000000..7b7d9bd0 --- /dev/null +++ b/x/id/keeper/msg_server_replace_id_owner.go @@ -0,0 +1,54 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/id/types" +) + +func (k msgServer) ReplaceIdOwner(goCtx context.Context, msg *types.MsgReplaceIdOwner) (*types.MsgReplaceIdOwnerResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + id, found := k.GetFullIDByIDString(ctx, msg.Id) + if !found { + return nil, sdkerrors.Wrap(types.ErrIdNotExisted, msg.Id) + } + + // check if the new owner has id or not + a, err := sdk.AccAddressFromBech32(msg.OwnerAddress) + if err != nil { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.OwnerAddress) + } + idOfNewOwner := k.GetIdByAddress(ctx, a) + if len(idOfNewOwner) > 0 { + return nil, sdkerrors.Wrap(types.ErrOwnerHasID, msg.OwnerAddress) + } + + // check right backup + if id.Data.BackupAddress != msg.BackupAddress { + return nil, sdkerrors.Wrap(types.ErrWrongBackupAddr, msg.BackupAddress) + } + + // update owner + id.Data.OwnerAddress = msg.OwnerAddress + k.SetID(ctx, id) + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.EventReplaceIDOwner, + sdk.NewAttribute(types.EventAttrOwner, msg.OwnerAddress), + sdk.NewAttribute(types.EventAttrId, msg.Id), + ), + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.BackupAddress), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventReplaceIDOwner), + ), + }) + + return &types.MsgReplaceIdOwnerResponse{}, nil +} diff --git a/x/id/keeper/msg_server_test.go b/x/id/keeper/msg_server_test.go new file mode 100644 index 00000000..41c1a0be --- /dev/null +++ b/x/id/keeper/msg_server_test.go @@ -0,0 +1,16 @@ +package keeper_test + +import ( + "context" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + keepertest "github.com/sharering/shareledger/testutil/keeper" + "github.com/sharering/shareledger/x/id/keeper" + "github.com/sharering/shareledger/x/id/types" +) + +func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) { + k, ctx := keepertest.IdKeeper(t) + return keeper.NewMsgServerImpl(*k), sdk.WrapSDKContext(ctx) +} diff --git a/x/id/keeper/msg_server_update_id.go b/x/id/keeper/msg_server_update_id.go new file mode 100644 index 00000000..66f6323a --- /dev/null +++ b/x/id/keeper/msg_server_update_id.go @@ -0,0 +1,44 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/x/id/types" +) + +func (k msgServer) UpdateId(goCtx context.Context, msg *types.MsgUpdateId) (*types.MsgUpdateIdResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // TODO: Handling the message + id, found := k.GetFullIDByIDString(ctx, msg.Id) + if !found { + return nil, sdkerrors.Wrap(types.ErrIdNotExisted, msg.Id) + } + + // check owner permission + if id.Data.OwnerAddress != msg.IssuerAddress { + return nil, sdkerrors.Wrap(types.ErrNotOwner, msg.IssuerAddress) + } + + // update extra data + id.Data.ExtraData = msg.ExtraData + k.SetID(ctx, id) + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.EventUpdateID, + sdk.NewAttribute(types.EventAttrIssuer, msg.IssuerAddress), + sdk.NewAttribute(types.EventAttrId, msg.Id), + ), + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.IssuerAddress), + sdk.NewAttribute(sdk.AttributeKeyAction, types.EventUpdateID), + ), + }) + + return &types.MsgUpdateIdResponse{}, nil +} diff --git a/x/id/module.go b/x/id/module.go new file mode 100644 index 00000000..06678753 --- /dev/null +++ b/x/id/module.go @@ -0,0 +1,169 @@ +package id + +import ( + "context" + "encoding/json" + "fmt" + + // this line is used by starport scaffolding # 1 + + "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/sharering/shareledger/x/id/client/cli" + "github.com/sharering/shareledger/x/id/keeper" + "github.com/sharering/shareledger/x/id/types" +) + +var ( + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} +) + +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- + +// AppModuleBasic implements the AppModuleBasic interface for the capability module. +type AppModuleBasic struct { + cdc codec.BinaryCodec +} + +func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the capability module's name. +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +// RegisterInterfaces registers the module's interface types +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) +} + +// DefaultGenesis returns the capability module's default genesis state. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) +} + +// ValidateGenesis performs genesis state validation for the capability module. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) + } + return genState.Validate() +} + +// RegisterRESTRoutes registers the capability module's REST service handlers. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { +} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + // this line is used by starport scaffolding # 2 + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) +} + +// GetTxCmd returns the capability module's root tx command. +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() +} + +// GetQueryCmd returns the capability module's root query command. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(types.StoreKey) +} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- + +// AppModule implements the AppModule interface for the capability module. +type AppModule struct { + AppModuleBasic + + keeper keeper.Keeper +} + +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { + return AppModule{ + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, + } +} + +// Name returns the capability module's name. +func (am AppModule) Name() string { + return am.AppModuleBasic.Name() +} + +// Route returns the capability module's message routing key. +func (am AppModule) Route() sdk.Route { + return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) +} + +// QuerierRoute returns the capability module's query routing key. +func (AppModule) QuerierRoute() string { return types.QuerierRoute } + +// LegacyQuerierHandler returns the capability module's Querier. +func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { + return nil +} + +// RegisterServices registers a GRPC query service to respond to the +// module-specific GRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) +} + +// RegisterInvariants registers the capability module's invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the capability module's genesis initialization It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, am.keeper, genState) + + return []abci.ValidatorUpdate{} +} + +// ExportGenesis returns the capability 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) + return cdc.MustMarshalJSON(genState) +} + +// ConsensusVersion implements ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 2 } + +// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. +func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} + +// EndBlock executes all ABCI EndBlock logic respective to the capability module. It +// returns no validator updates. +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} +} diff --git a/x/id/types/base_id.pb.go b/x/id/types/base_id.pb.go new file mode 100644 index 00000000..94e0c8b0 --- /dev/null +++ b/x/id/types/base_id.pb.go @@ -0,0 +1,471 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: id/base_id.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type BaseID struct { + IssuerAddress string `protobuf:"bytes,1,opt,name=issuerAddress,proto3" json:"issuerAddress,omitempty"` + BackupAddress string `protobuf:"bytes,2,opt,name=backupAddress,proto3" json:"backupAddress,omitempty"` + OwnerAddress string `protobuf:"bytes,3,opt,name=ownerAddress,proto3" json:"ownerAddress,omitempty"` + ExtraData string `protobuf:"bytes,4,opt,name=extraData,proto3" json:"extraData,omitempty"` +} + +func (m *BaseID) Reset() { *m = BaseID{} } +func (m *BaseID) String() string { return proto.CompactTextString(m) } +func (*BaseID) ProtoMessage() {} +func (*BaseID) Descriptor() ([]byte, []int) { + return fileDescriptor_66bf163b848e8af2, []int{0} +} +func (m *BaseID) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BaseID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BaseID.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BaseID) XXX_Merge(src proto.Message) { + xxx_messageInfo_BaseID.Merge(m, src) +} +func (m *BaseID) XXX_Size() int { + return m.Size() +} +func (m *BaseID) XXX_DiscardUnknown() { + xxx_messageInfo_BaseID.DiscardUnknown(m) +} + +var xxx_messageInfo_BaseID proto.InternalMessageInfo + +func (m *BaseID) GetIssuerAddress() string { + if m != nil { + return m.IssuerAddress + } + return "" +} + +func (m *BaseID) GetBackupAddress() string { + if m != nil { + return m.BackupAddress + } + return "" +} + +func (m *BaseID) GetOwnerAddress() string { + if m != nil { + return m.OwnerAddress + } + return "" +} + +func (m *BaseID) GetExtraData() string { + if m != nil { + return m.ExtraData + } + return "" +} + +func init() { + proto.RegisterType((*BaseID)(nil), "shareledger.id.BaseID") +} + +func init() { proto.RegisterFile("id/base_id.proto", fileDescriptor_66bf163b848e8af2) } + +var fileDescriptor_66bf163b848e8af2 = []byte{ + // 210 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc8, 0x4c, 0xd1, 0x4f, + 0x4a, 0x2c, 0x4e, 0x8d, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x2b, 0xce, + 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0xcb, 0x4c, 0x51, 0x9a, 0xc6, 0xc8, + 0xc5, 0xe6, 0x94, 0x58, 0x9c, 0xea, 0xe9, 0x22, 0xa4, 0xc2, 0xc5, 0x9b, 0x59, 0x5c, 0x5c, 0x9a, + 0x5a, 0xe4, 0x98, 0x92, 0x52, 0x94, 0x5a, 0x5c, 0x2c, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x84, + 0x2a, 0x08, 0x52, 0x95, 0x94, 0x98, 0x9c, 0x5d, 0x5a, 0x00, 0x53, 0xc5, 0x04, 0x51, 0x85, 0x22, + 0x28, 0xa4, 0xc4, 0xc5, 0x93, 0x5f, 0x9e, 0x87, 0x30, 0x8a, 0x19, 0xac, 0x08, 0x45, 0x4c, 0x48, + 0x86, 0x8b, 0x33, 0xb5, 0xa2, 0xa4, 0x28, 0xd1, 0x25, 0xb1, 0x24, 0x51, 0x82, 0x05, 0xac, 0x00, + 0x21, 0xe0, 0xe4, 0x7a, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, + 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0xda, 0xe9, + 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x60, 0xdf, 0x14, 0x65, 0xe6, 0xa5, + 0xeb, 0x23, 0xf9, 0x4b, 0xbf, 0x42, 0x3f, 0x33, 0x45, 0xbf, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, + 0x0d, 0xec, 0x6d, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf7, 0xef, 0x6a, 0xb6, 0x0a, 0x01, + 0x00, 0x00, +} + +func (m *BaseID) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BaseID) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BaseID) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ExtraData) > 0 { + i -= len(m.ExtraData) + copy(dAtA[i:], m.ExtraData) + i = encodeVarintBaseId(dAtA, i, uint64(len(m.ExtraData))) + i-- + dAtA[i] = 0x22 + } + if len(m.OwnerAddress) > 0 { + i -= len(m.OwnerAddress) + copy(dAtA[i:], m.OwnerAddress) + i = encodeVarintBaseId(dAtA, i, uint64(len(m.OwnerAddress))) + i-- + dAtA[i] = 0x1a + } + if len(m.BackupAddress) > 0 { + i -= len(m.BackupAddress) + copy(dAtA[i:], m.BackupAddress) + i = encodeVarintBaseId(dAtA, i, uint64(len(m.BackupAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.IssuerAddress) > 0 { + i -= len(m.IssuerAddress) + copy(dAtA[i:], m.IssuerAddress) + i = encodeVarintBaseId(dAtA, i, uint64(len(m.IssuerAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintBaseId(dAtA []byte, offset int, v uint64) int { + offset -= sovBaseId(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *BaseID) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IssuerAddress) + if l > 0 { + n += 1 + l + sovBaseId(uint64(l)) + } + l = len(m.BackupAddress) + if l > 0 { + n += 1 + l + sovBaseId(uint64(l)) + } + l = len(m.OwnerAddress) + if l > 0 { + n += 1 + l + sovBaseId(uint64(l)) + } + l = len(m.ExtraData) + if l > 0 { + n += 1 + l + sovBaseId(uint64(l)) + } + return n +} + +func sovBaseId(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozBaseId(x uint64) (n int) { + return sovBaseId(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *BaseID) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBaseId + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: BaseID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BaseID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IssuerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBaseId + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBaseId + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBaseId + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IssuerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBaseId + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBaseId + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBaseId + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BackupAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBaseId + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBaseId + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBaseId + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OwnerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraData", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBaseId + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBaseId + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBaseId + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtraData = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipBaseId(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthBaseId + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipBaseId(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBaseId + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBaseId + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBaseId + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthBaseId + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupBaseId + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthBaseId + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthBaseId = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowBaseId = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupBaseId = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/id/types/codec.go b/x/id/types/codec.go new file mode 100644 index 00000000..a843ac90 --- /dev/null +++ b/x/id/types/codec.go @@ -0,0 +1,39 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgCreateId{}, "id/CreateId", nil) + cdc.RegisterConcrete(&MsgCreateIds{}, "id/CreateIds", nil) + cdc.RegisterConcrete(&MsgUpdateId{}, "id/UpdateId", nil) + cdc.RegisterConcrete(&MsgReplaceIdOwner{}, "id/ReplaceIdOwner", nil) + // this line is used by starport scaffolding # 2 +} + +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCreateId{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCreateIds{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgUpdateId{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgReplaceIdOwner{}, + ) + // this line is used by starport scaffolding # 3 + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} + +var ( + amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) +) diff --git a/x/id/types/errors.go b/x/id/types/errors.go new file mode 100644 index 00000000..c56e3951 --- /dev/null +++ b/x/id/types/errors.go @@ -0,0 +1,17 @@ +package types + +// DONTCOVER + +import ( + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +// x/id module sentinel errors +var ( + ErrIdNotExisted = sdkerrors.Register(ModuleName, 41, "Id does not exist") + ErrIdExisted = sdkerrors.Register(ModuleName, 42, "Id existed") + InvalidData = sdkerrors.Register(ModuleName, 43, "Invalid data") + ErrWrongBackupAddr = sdkerrors.Register(ModuleName, 44, "Wrong backup address") + ErrOwnerHasID = sdkerrors.Register(ModuleName, 45, "This address already own an ID") + ErrNotOwner = sdkerrors.Register(ModuleName, 46, "No permission to update this ID") +) diff --git a/x/id/types/events.go b/x/id/types/events.go new file mode 100644 index 00000000..8509ba64 --- /dev/null +++ b/x/id/types/events.go @@ -0,0 +1,13 @@ +package types + +// ID events +const ( + EventCreateID = "create_id" + EventCreateIDs = "create_ids" + EventUpdateID = "update_id" + EventReplaceIDOwner = "replace_id_owner" + + EventAttrIssuer = "issuer" + EventAttrId = "id" + EventAttrOwner = "owner" +) diff --git a/x/id/types/expected_keepers.go b/x/id/types/expected_keepers.go new file mode 100644 index 00000000..ab1254f4 --- /dev/null +++ b/x/id/types/expected_keepers.go @@ -0,0 +1 @@ +package types diff --git a/x/id/types/genesis.go b/x/id/types/genesis.go new file mode 100644 index 00000000..02b0f90b --- /dev/null +++ b/x/id/types/genesis.go @@ -0,0 +1,22 @@ +package types + +// this line is used by starport scaffolding # genesis/types/import + +// DefaultIndex is the default capability global index +const DefaultIndex uint64 = 1 + +// DefaultGenesis returns the default Capability genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{ + // this line is used by starport scaffolding # genesis/types/default + IDs: make([]*Id, 0), + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + // this line is used by starport scaffolding # genesis/types/validate + + return nil +} diff --git a/x/id/types/genesis.pb.go b/x/id/types/genesis.pb.go new file mode 100644 index 00000000..b31ea5ad --- /dev/null +++ b/x/id/types/genesis.pb.go @@ -0,0 +1,330 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: id/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the id module's genesis state. +type GenesisState struct { + // this line is used by starport scaffolding # genesis/proto/state + IDs []*Id `protobuf:"bytes,1,rep,name=IDs,proto3" json:"IDs,omitempty"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_72e3be7daeaac3c7, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetIDs() []*Id { + if m != nil { + return m.IDs + } + return nil +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "shareledger.id.GenesisState") +} + +func init() { proto.RegisterFile("id/genesis.proto", fileDescriptor_72e3be7daeaac3c7) } + +var fileDescriptor_72e3be7daeaac3c7 = []byte{ + // 188 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc8, 0x4c, 0xd1, 0x4f, + 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x2b, 0xce, + 0x48, 0x2c, 0x4a, 0xcd, 0x49, 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0xcb, 0x4c, 0x91, 0x12, 0x49, 0xcf, + 0x4f, 0xcf, 0x07, 0x4b, 0xe9, 0x83, 0x58, 0x10, 0x55, 0x52, 0xdc, 0x99, 0x29, 0xfa, 0x99, 0x29, + 0x10, 0x8e, 0x92, 0x15, 0x17, 0x8f, 0x3b, 0xc4, 0x8c, 0xe0, 0x92, 0xc4, 0x92, 0x54, 0x21, 0x2d, + 0x2e, 0x66, 0x4f, 0x97, 0x62, 0x09, 0x46, 0x05, 0x66, 0x0d, 0x6e, 0x23, 0x21, 0x3d, 0x54, 0x03, + 0xf5, 0x3c, 0x53, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x0c, 0x02, 0x29, 0x72, 0x72, 0x3d, 0xf1, + 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, + 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xed, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, + 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xb0, 0x11, 0x45, 0x99, 0x79, 0xe9, 0xfa, 0x48, 0x86, 0xe9, 0x57, + 0xe8, 0x67, 0xa6, 0xe8, 0x97, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0x5d, 0x62, 0x0c, 0x08, + 0x00, 0x00, 0xff, 0xff, 0xfe, 0x3b, 0x81, 0xe0, 0xd0, 0x00, 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.IDs) > 0 { + for iNdEx := len(m.IDs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.IDs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.IDs) > 0 { + for _, e := range m.IDs { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IDs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IDs = append(m.IDs, &Id{}) + if err := m.IDs[len(m.IDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/id/types/genesis_test.go b/x/id/types/genesis_test.go new file mode 100644 index 00000000..14a66fb6 --- /dev/null +++ b/x/id/types/genesis_test.go @@ -0,0 +1,39 @@ +package types_test + +import ( + "testing" + + "github.com/sharering/shareledger/x/id/types" + "github.com/stretchr/testify/require" +) + +func TestGenesisState_Validate(t *testing.T) { + for _, tc := range []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + { + desc: "valid genesis state", + genState: &types.GenesisState{ + // this line is used by starport scaffolding # types/genesis/validField + }, + valid: true, + }, + // this line is used by starport scaffolding # types/genesis/testcase + } { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/x/id/types/id.go b/x/id/types/id.go new file mode 100644 index 00000000..bd4a6b62 --- /dev/null +++ b/x/id/types/id.go @@ -0,0 +1,32 @@ +package types + +import "github.com/cosmos/cosmos-sdk/codec" + +// MustMarshalBaseID encodes data for storage +func MustMarshalBaseID(cdc codec.BinaryCodec, id *BaseID) []byte { + return cdc.MustMarshal(id) +} + +// MustUnmarshalBaseID decodes data from storage value. Throw exception when there is error +func MustUnmarshalBaseID(cdc codec.BinaryCodec, value []byte) BaseID { + var id BaseID + cdc.MustUnmarshal(value, &id) + + return id +} + +func (id *Id) ToBaseID() BaseID { + return BaseID{ + IssuerAddress: id.Data.IssuerAddress, + BackupAddress: id.Data.BackupAddress, + OwnerAddress: id.Data.OwnerAddress, + ExtraData: id.Data.ExtraData, + } +} + +func NewIDFromBaseID(id string, bid *BaseID) Id { + return Id{ + Id: id, + Data: bid, + } +} diff --git a/x/id/types/id.pb.go b/x/id/types/id.pb.go new file mode 100644 index 00000000..dfd7343b --- /dev/null +++ b/x/id/types/id.pb.go @@ -0,0 +1,376 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: id/id.proto + +package types + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Id struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Data *BaseID `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *Id) Reset() { *m = Id{} } +func (m *Id) String() string { return proto.CompactTextString(m) } +func (*Id) ProtoMessage() {} +func (*Id) Descriptor() ([]byte, []int) { + return fileDescriptor_4ec0ede66f5e76b8, []int{0} +} +func (m *Id) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Id) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Id.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Id) XXX_Merge(src proto.Message) { + xxx_messageInfo_Id.Merge(m, src) +} +func (m *Id) XXX_Size() int { + return m.Size() +} +func (m *Id) XXX_DiscardUnknown() { + xxx_messageInfo_Id.DiscardUnknown(m) +} + +var xxx_messageInfo_Id proto.InternalMessageInfo + +func (m *Id) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Id) GetData() *BaseID { + if m != nil { + return m.Data + } + return nil +} + +func init() { + proto.RegisterType((*Id)(nil), "shareledger.id.Id") +} + +func init() { proto.RegisterFile("id/id.proto", fileDescriptor_4ec0ede66f5e76b8) } + +var fileDescriptor_4ec0ede66f5e76b8 = []byte{ + // 182 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xce, 0x4c, 0xd1, 0xcf, + 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x2b, 0xce, 0x48, 0x2c, 0x4a, 0xcd, 0x49, + 0x4d, 0x49, 0x4f, 0x2d, 0xd2, 0xcb, 0x4c, 0x91, 0x12, 0xc8, 0x4c, 0xd1, 0x4f, 0x4a, 0x2c, 0x4e, + 0x8d, 0x87, 0xa9, 0x50, 0x72, 0xe0, 0x62, 0xf2, 0x4c, 0x11, 0xe2, 0xe3, 0x62, 0xca, 0x4c, 0x91, + 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x62, 0xca, 0x4c, 0x11, 0xd2, 0xe2, 0x62, 0x49, 0x49, 0x2c, + 0x49, 0x94, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x36, 0x12, 0xd3, 0x43, 0x35, 0x46, 0xcf, 0x29, 0xb1, + 0x38, 0xd5, 0xd3, 0x25, 0x08, 0xac, 0xc6, 0xc9, 0xf5, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, + 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, + 0xe5, 0x18, 0xa2, 0xb4, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0xc1, + 0x26, 0x14, 0x65, 0xe6, 0xa5, 0xeb, 0x23, 0x99, 0xa5, 0x5f, 0xa1, 0x9f, 0x99, 0xa2, 0x5f, 0x52, + 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0x76, 0x8f, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x91, 0xab, + 0x72, 0xab, 0xc0, 0x00, 0x00, 0x00, +} + +func (m *Id) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Id) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Id) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintId(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintId(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintId(dAtA []byte, offset int, v uint64) int { + offset -= sovId(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Id) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovId(uint64(l)) + } + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovId(uint64(l)) + } + return n +} + +func sovId(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozId(x uint64) (n int) { + return sovId(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Id) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowId + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: Id: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Id: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowId + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthId + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthId + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowId + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthId + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthId + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Data == nil { + m.Data = &BaseID{} + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipId(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthId + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipId(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowId + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowId + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowId + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthId + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupId + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthId + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthId = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowId = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupId = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/id/types/keys.go b/x/id/types/keys.go new file mode 100644 index 00000000..7676fd83 --- /dev/null +++ b/x/id/types/keys.go @@ -0,0 +1,34 @@ +package types + +const ( + // ModuleName defines the module name + ModuleName = "id" + + // StoreKey defines the primary module store key + StoreKey = ModuleName + + // RouterKey is the message route for slashing + RouterKey = ModuleName + + // QuerierRoute defines the module's query routing key + QuerierRoute = ModuleName + + // MemStoreKey defines the in-memory store key + MemStoreKey = "mem_id" + + // ID message types + TypeMsgCreateID = "create_id" + TypeMsgCreateIDs = "create_ids" + TypeMsgUpdateID = "update_id" + TypeMsgReplaceIdOwner = "replace_id_owner" + + MAX_ID_LEN = 64 + MAX_ID_IN_BATCH = 20 + + AddressKeyPrefix = "Address/" + IDKeyPrefix = "ID/" +) + +func KeyPrefix(p string) []byte { + return []byte(p) +} diff --git a/x/id/types/message_create_id.go b/x/id/types/message_create_id.go new file mode 100644 index 00000000..49ec5217 --- /dev/null +++ b/x/id/types/message_create_id.go @@ -0,0 +1,83 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCreateId{} + +func NewMsgCreateId(issuerAddress string, backupAddress string, extraData string, id string, ownerAddress string) *MsgCreateId { + return &MsgCreateId{ + IssuerAddress: issuerAddress, + BackupAddress: backupAddress, + ExtraData: extraData, + Id: id, + OwnerAddress: ownerAddress, + } +} + +func (msg *MsgCreateId) Route() string { + return RouterKey +} + +func (msg *MsgCreateId) Type() string { + return TypeMsgCreateID +} + +func (msg *MsgCreateId) GetSigners() []sdk.AccAddress { + issuerAddress, err := sdk.AccAddressFromBech32(msg.IssuerAddress) + if err != nil { + panic(err) + } + return []sdk.AccAddress{issuerAddress} +} + +func (msg *MsgCreateId) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCreateId) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.IssuerAddress) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid issuerAddress address (%s)", err) + } + + if len(msg.Id) > MAX_ID_LEN || len(msg.Id) == 0 || len(msg.ExtraData) > MAX_ID_LEN { + return sdkerrors.Wrap(InvalidData, msg.String()) + } + + _, err = sdk.AccAddressFromBech32(msg.BackupAddress) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid Backup address (%s)", err) + } + + _, err = sdk.AccAddressFromBech32(msg.OwnerAddress) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid OwnerAddress address (%s)", err) + } + + return nil +} + +func (msg *MsgCreateId) ToBaseID() BaseID { + baseID := BaseID{ + IssuerAddress: msg.IssuerAddress, + BackupAddress: msg.BackupAddress, + OwnerAddress: msg.OwnerAddress, + ExtraData: msg.ExtraData, + } + + return baseID +} + +func (msg *MsgCreateId) ToID() Id { + baseID := msg.ToBaseID() + id := Id{ + Id: msg.Id, + Data: &baseID, + } + + return id +} diff --git a/x/id/types/message_create_id_batch.go b/x/id/types/message_create_id_batch.go new file mode 100644 index 00000000..9929c776 --- /dev/null +++ b/x/id/types/message_create_id_batch.go @@ -0,0 +1,83 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCreateIds{} + +func NewMsgCreateIds(issuerAddress string, backupAddress []string, extraData []string, id []string, ownerAddress []string) *MsgCreateIds { + return &MsgCreateIds{ + IssuerAddress: issuerAddress, + BackupAddress: backupAddress, + ExtraData: extraData, + Id: id, + OwnerAddress: ownerAddress, + } +} + +func (msg *MsgCreateIds) Route() string { + return RouterKey +} + +func (msg *MsgCreateIds) Type() string { + return TypeMsgCreateIDs +} + +func (msg *MsgCreateIds) GetSigners() []sdk.AccAddress { + issuerAddress, err := sdk.AccAddressFromBech32(msg.IssuerAddress) + if err != nil { + panic(err) + } + return []sdk.AccAddress{issuerAddress} +} + +func (msg *MsgCreateIds) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCreateIds) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.IssuerAddress) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid issuerAddress address (%s)", err) + } + + // check len + if len(msg.Id) == 0 || len(msg.BackupAddress) == 0 || len(msg.OwnerAddress) == 0 || len(msg.ExtraData) == 0 { + return sdkerrors.Wrap(InvalidData, msg.String()) + } + + maxLen := len(msg.Id) + if maxLen > MAX_ID_IN_BATCH || len(msg.BackupAddress) != maxLen || len(msg.OwnerAddress) != maxLen || len(msg.ExtraData) != maxLen { + return sdkerrors.Wrap(InvalidData, msg.String()) + } + + // Check id compose + for i := 0; i < maxLen; i++ { + // Check len + if len(msg.Id[i]) > MAX_ID_LEN || len(msg.Id[i]) == 0 || len(msg.ExtraData[i]) > MAX_ID_LEN { + return sdkerrors.Wrap(InvalidData, msg.String()) + } + + // Check address + _, err := sdk.AccAddressFromBech32(msg.OwnerAddress[i]) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid OwnerAddress address (%s)", err) + } + _, err = sdk.AccAddressFromBech32(msg.BackupAddress[i]) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid BackupAddress address (%s)", err) + } + + // Check duplicate + for j := i + 1; j < maxLen; j++ { + if msg.Id[j] == msg.Id[i] || msg.OwnerAddress[j] == msg.OwnerAddress[i] { + return sdkerrors.Wrap(InvalidData, msg.String()) + } + } + } + + return nil +} diff --git a/x/id/types/message_create_id_batch_test.go b/x/id/types/message_create_id_batch_test.go new file mode 100644 index 00000000..28b79e1e --- /dev/null +++ b/x/id/types/message_create_id_batch_test.go @@ -0,0 +1,71 @@ +package types + +import ( + "github.com/google/uuid" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgCreateIds_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgCreateIds + err error + }{ + { + name: "invalid address", + msg: MsgCreateIds{ + IssuerAddress: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgCreateIds{ + IssuerAddress: sample.AccAddress(), + BackupAddress: []string{sample.AccAddress()}, + ExtraData: []string{"data"}, + Id: []string{uuid.New().String()}, + OwnerAddress: []string{sample.AccAddress()}, + }, + }, + { + name: "valid data", + msg: MsgCreateIds{ + IssuerAddress: "shareledger1l3pg3zd0u5p3v5wfqavh0gsr83zep8kv5y900z", + BackupAddress: []string{ + "shareledger1zf6q3twxs9dgw0dhjz0msve5ez3638vgddvgar", + "shareledger1k57s3hqnky2pawny6lx0j8xnnjtshtcnpe6ewu", + "shareledger17vlzwgh6k7y3trday57fw6c4nrv6gnmfmj25qa", + }, + OwnerAddress: []string{ + "shareledger1zf6q3twxs9dgw0dhjz0msve5ez3638vgddvgar", + "shareledger1k57s3hqnky2pawny6lx0j8xnnjtshtcnpe6ewu", + "shareledger17vlzwgh6k7y3trday57fw6c4nrv6gnmfmj25qa", + }, + Id: []string{ + "id-1", + "id-2", + "id-3", + }, + ExtraData: []string{ + "hello1", + "hello2", + "hello3", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/id/types/message_create_id_test.go b/x/id/types/message_create_id_test.go new file mode 100644 index 00000000..2fa24cb1 --- /dev/null +++ b/x/id/types/message_create_id_test.go @@ -0,0 +1,44 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgCreateId_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgCreateId + err error + }{ + { + name: "invalid address", + msg: MsgCreateId{ + IssuerAddress: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgCreateId{ + IssuerAddress: sample.AccAddress(), + BackupAddress: sample.AccAddress(), + ExtraData: "extra-data", + Id: "id", + OwnerAddress: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/id/types/message_replace_id_owner.go b/x/id/types/message_replace_id_owner.go new file mode 100644 index 00000000..74db9998 --- /dev/null +++ b/x/id/types/message_replace_id_owner.go @@ -0,0 +1,54 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgReplaceIdOwner{} + +func NewMsgReplaceIdOwner(backupAddress string, id string, ownerAddress string) *MsgReplaceIdOwner { + return &MsgReplaceIdOwner{ + BackupAddress: backupAddress, + Id: id, + OwnerAddress: ownerAddress, + } +} + +func (msg *MsgReplaceIdOwner) Route() string { + return RouterKey +} + +func (msg *MsgReplaceIdOwner) Type() string { + return TypeMsgReplaceIdOwner +} + +func (msg *MsgReplaceIdOwner) GetSigners() []sdk.AccAddress { + backupAddress, err := sdk.AccAddressFromBech32(msg.BackupAddress) + if err != nil { + panic(err) + } + return []sdk.AccAddress{backupAddress} +} + +func (msg *MsgReplaceIdOwner) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgReplaceIdOwner) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.BackupAddress) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid backupAddress address (%s)", err) + } + + if len(msg.Id) > MAX_ID_LEN || len(msg.Id) == 0 { + return sdkerrors.Wrap(InvalidData, msg.Id) + } + + _, err = sdk.AccAddressFromBech32(msg.OwnerAddress) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid OwnerAddress address (%s)", err) + } + return nil +} diff --git a/x/id/types/message_replace_id_owner_test.go b/x/id/types/message_replace_id_owner_test.go new file mode 100644 index 00000000..bf686d2c --- /dev/null +++ b/x/id/types/message_replace_id_owner_test.go @@ -0,0 +1,42 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgReplaceIdOwner_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgReplaceIdOwner + err error + }{ + { + name: "invalid address", + msg: MsgReplaceIdOwner{ + BackupAddress: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgReplaceIdOwner{ + BackupAddress: sample.AccAddress(), + Id: "id", + OwnerAddress: sample.AccAddress(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/id/types/message_update_id.go b/x/id/types/message_update_id.go new file mode 100644 index 00000000..553a5149 --- /dev/null +++ b/x/id/types/message_update_id.go @@ -0,0 +1,50 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgUpdateId{} + +func NewMsgUpdateId(issuerAddress string, id string, extraData string) *MsgUpdateId { + return &MsgUpdateId{ + IssuerAddress: issuerAddress, + Id: id, + ExtraData: extraData, + } +} + +func (msg *MsgUpdateId) Route() string { + return RouterKey +} + +func (msg *MsgUpdateId) Type() string { + return TypeMsgUpdateID +} + +func (msg *MsgUpdateId) GetSigners() []sdk.AccAddress { + issuerAddress, err := sdk.AccAddressFromBech32(msg.IssuerAddress) + if err != nil { + panic(err) + } + return []sdk.AccAddress{issuerAddress} +} + +func (msg *MsgUpdateId) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgUpdateId) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.IssuerAddress) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid issuerAddress address (%s)", err) + } + + if len(msg.Id) > MAX_ID_LEN || len(msg.Id) == 0 || len(msg.ExtraData) > MAX_ID_LEN { + return sdkerrors.Wrap(InvalidData, msg.String()) + } + + return nil +} diff --git a/x/id/types/message_update_id_test.go b/x/id/types/message_update_id_test.go new file mode 100644 index 00000000..d2f38485 --- /dev/null +++ b/x/id/types/message_update_id_test.go @@ -0,0 +1,42 @@ +package types + +import ( + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/sharering/shareledger/testutil/sample" + "github.com/stretchr/testify/require" +) + +func TestMsgUpdateId_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgUpdateId + err error + }{ + { + name: "invalid address", + msg: MsgUpdateId{ + IssuerAddress: "invalid_address", + }, + err: sdkerrors.ErrInvalidAddress, + }, { + name: "valid address", + msg: MsgUpdateId{ + IssuerAddress: sample.AccAddress(), + Id: "id", + ExtraData: "extra-data", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/id/types/query.pb.go b/x/id/types/query.pb.go new file mode 100644 index 00000000..21a074db --- /dev/null +++ b/x/id/types/query.pb.go @@ -0,0 +1,971 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: id/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryIdByAddressRequest struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryIdByAddressRequest) Reset() { *m = QueryIdByAddressRequest{} } +func (m *QueryIdByAddressRequest) String() string { return proto.CompactTextString(m) } +func (*QueryIdByAddressRequest) ProtoMessage() {} +func (*QueryIdByAddressRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_98ef984c8d18723c, []int{0} +} +func (m *QueryIdByAddressRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdByAddressRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdByAddressRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdByAddressRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdByAddressRequest.Merge(m, src) +} +func (m *QueryIdByAddressRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryIdByAddressRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdByAddressRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdByAddressRequest proto.InternalMessageInfo + +type QueryIdByAddressResponse struct { + Id *Id `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *QueryIdByAddressResponse) Reset() { *m = QueryIdByAddressResponse{} } +func (m *QueryIdByAddressResponse) String() string { return proto.CompactTextString(m) } +func (*QueryIdByAddressResponse) ProtoMessage() {} +func (*QueryIdByAddressResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_98ef984c8d18723c, []int{1} +} +func (m *QueryIdByAddressResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdByAddressResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdByAddressResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdByAddressResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdByAddressResponse.Merge(m, src) +} +func (m *QueryIdByAddressResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryIdByAddressResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdByAddressResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdByAddressResponse proto.InternalMessageInfo + +func (m *QueryIdByAddressResponse) GetId() *Id { + if m != nil { + return m.Id + } + return nil +} + +type QueryIdByIdRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *QueryIdByIdRequest) Reset() { *m = QueryIdByIdRequest{} } +func (m *QueryIdByIdRequest) String() string { return proto.CompactTextString(m) } +func (*QueryIdByIdRequest) ProtoMessage() {} +func (*QueryIdByIdRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_98ef984c8d18723c, []int{2} +} +func (m *QueryIdByIdRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdByIdRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdByIdRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdByIdRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdByIdRequest.Merge(m, src) +} +func (m *QueryIdByIdRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryIdByIdRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdByIdRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdByIdRequest proto.InternalMessageInfo + +type QueryIdByIdResponse struct { + Id *Id `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *QueryIdByIdResponse) Reset() { *m = QueryIdByIdResponse{} } +func (m *QueryIdByIdResponse) String() string { return proto.CompactTextString(m) } +func (*QueryIdByIdResponse) ProtoMessage() {} +func (*QueryIdByIdResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_98ef984c8d18723c, []int{3} +} +func (m *QueryIdByIdResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryIdByIdResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryIdByIdResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryIdByIdResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryIdByIdResponse.Merge(m, src) +} +func (m *QueryIdByIdResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryIdByIdResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryIdByIdResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryIdByIdResponse proto.InternalMessageInfo + +func (m *QueryIdByIdResponse) GetId() *Id { + if m != nil { + return m.Id + } + return nil +} + +func init() { + proto.RegisterType((*QueryIdByAddressRequest)(nil), "shareledger.id.QueryIdByAddressRequest") + proto.RegisterType((*QueryIdByAddressResponse)(nil), "shareledger.id.QueryIdByAddressResponse") + proto.RegisterType((*QueryIdByIdRequest)(nil), "shareledger.id.QueryIdByIdRequest") + proto.RegisterType((*QueryIdByIdResponse)(nil), "shareledger.id.QueryIdByIdResponse") +} + +func init() { proto.RegisterFile("id/query.proto", fileDescriptor_98ef984c8d18723c) } + +var fileDescriptor_98ef984c8d18723c = []byte{ + // 388 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xbf, 0x4a, 0x2b, 0x41, + 0x14, 0xc6, 0x77, 0x17, 0x6e, 0xee, 0xcd, 0x04, 0x52, 0xcc, 0xbd, 0x90, 0xdc, 0x45, 0x36, 0xba, + 0x29, 0x8c, 0x0a, 0x3b, 0x24, 0x56, 0x0a, 0x0a, 0x06, 0x2c, 0x52, 0x9a, 0xd2, 0x6e, 0x36, 0x67, + 0x98, 0x0c, 0x24, 0x3b, 0x9b, 0x9d, 0x8d, 0x18, 0x42, 0x1a, 0x2b, 0xc5, 0x46, 0xf0, 0x05, 0xf2, + 0x38, 0x96, 0x01, 0x1b, 0x4b, 0x49, 0x2c, 0x7c, 0x0c, 0xd9, 0x3f, 0x09, 0x49, 0x24, 0x6a, 0x77, + 0xe6, 0xf0, 0xfd, 0xbe, 0xef, 0x9c, 0xc3, 0xa0, 0xbc, 0x00, 0xd2, 0xeb, 0xb3, 0x60, 0xe0, 0xf8, + 0x81, 0x0c, 0x25, 0xce, 0xab, 0x36, 0x0d, 0x58, 0x87, 0x01, 0x67, 0x81, 0x23, 0xc0, 0xdc, 0xe2, + 0x52, 0xf2, 0x0e, 0x23, 0xd4, 0x17, 0x84, 0x7a, 0x9e, 0x0c, 0x69, 0x28, 0xa4, 0xa7, 0x12, 0xb5, + 0xb9, 0xdf, 0x92, 0xaa, 0x2b, 0x15, 0x71, 0xa9, 0x62, 0x89, 0x0d, 0xb9, 0xaa, 0xba, 0x2c, 0xa4, + 0x55, 0xe2, 0x53, 0x2e, 0xbc, 0x58, 0x9c, 0x6a, 0xff, 0x71, 0xc9, 0x65, 0x5c, 0x92, 0xa8, 0x4a, + 0xbb, 0x39, 0x01, 0x44, 0x40, 0xf2, 0xb0, 0x4f, 0x50, 0xe1, 0x22, 0x32, 0x69, 0x40, 0x7d, 0x70, + 0x06, 0x10, 0x30, 0xa5, 0x9a, 0xac, 0xd7, 0x67, 0x2a, 0xc4, 0x45, 0xf4, 0x9b, 0x26, 0x9d, 0xa2, + 0xbe, 0xad, 0x57, 0xb2, 0xcd, 0xf9, 0xf3, 0xf8, 0xcf, 0xed, 0xb8, 0xa4, 0xbd, 0x8f, 0x4b, 0x9a, + 0x7d, 0x8a, 0x8a, 0x9f, 0x71, 0xe5, 0x4b, 0x4f, 0x31, 0x6c, 0x23, 0x43, 0x40, 0x8c, 0xe6, 0x6a, + 0xd8, 0x59, 0x5d, 0xd2, 0x69, 0x40, 0xd3, 0x10, 0x60, 0x3b, 0x08, 0x2f, 0xf8, 0x06, 0xcc, 0x93, + 0xf3, 0x0b, 0x32, 0x1b, 0xa9, 0x96, 0xf2, 0x8e, 0xd0, 0xdf, 0x15, 0xfd, 0xcf, 0xa3, 0x6a, 0x77, + 0x06, 0xfa, 0x15, 0xb3, 0xf8, 0x5e, 0x47, 0xb9, 0xa5, 0x81, 0xf1, 0xee, 0x3a, 0xb1, 0xe1, 0x22, + 0x66, 0xe5, 0x7b, 0x61, 0x32, 0x90, 0xbd, 0x77, 0xf3, 0xfc, 0xf6, 0x68, 0x94, 0xf1, 0x0e, 0x59, + 0x22, 0x88, 0x00, 0x92, 0x9e, 0x90, 0x0c, 0xd3, 0x62, 0x84, 0x03, 0x94, 0x49, 0xb6, 0xc1, 0xf6, + 0x46, 0xfb, 0xc5, 0x69, 0xcc, 0xf2, 0x97, 0x9a, 0x34, 0xbd, 0x14, 0xa7, 0xff, 0xc7, 0x85, 0xf5, + 0x74, 0x01, 0x64, 0x28, 0x60, 0x54, 0x3f, 0x7f, 0x9a, 0x5a, 0xfa, 0x64, 0x6a, 0xe9, 0xaf, 0x53, + 0x4b, 0x7f, 0x98, 0x59, 0xda, 0x64, 0x66, 0x69, 0x2f, 0x33, 0x4b, 0xbb, 0x3c, 0xe0, 0x22, 0x6c, + 0xf7, 0x5d, 0xa7, 0x25, 0xbb, 0x09, 0x1c, 0x08, 0x8f, 0xaf, 0xd8, 0x5c, 0x47, 0x2e, 0xe1, 0xc0, + 0x67, 0xca, 0xcd, 0xc4, 0x7f, 0xe8, 0xf0, 0x23, 0x00, 0x00, 0xff, 0xff, 0xad, 0x27, 0x16, 0x0c, + 0xd2, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Queries a list of idByAddress items. + IdByAddress(ctx context.Context, in *QueryIdByAddressRequest, opts ...grpc.CallOption) (*QueryIdByAddressResponse, error) + // Queries a list of idById items. + IdById(ctx context.Context, in *QueryIdByIdRequest, opts ...grpc.CallOption) (*QueryIdByIdResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) IdByAddress(ctx context.Context, in *QueryIdByAddressRequest, opts ...grpc.CallOption) (*QueryIdByAddressResponse, error) { + out := new(QueryIdByAddressResponse) + err := c.cc.Invoke(ctx, "/shareledger.id.Query/IdByAddress", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) IdById(ctx context.Context, in *QueryIdByIdRequest, opts ...grpc.CallOption) (*QueryIdByIdResponse, error) { + out := new(QueryIdByIdResponse) + err := c.cc.Invoke(ctx, "/shareledger.id.Query/IdById", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Queries a list of idByAddress items. + IdByAddress(context.Context, *QueryIdByAddressRequest) (*QueryIdByAddressResponse, error) + // Queries a list of idById items. + IdById(context.Context, *QueryIdByIdRequest) (*QueryIdByIdResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) IdByAddress(ctx context.Context, req *QueryIdByAddressRequest) (*QueryIdByAddressResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IdByAddress not implemented") +} +func (*UnimplementedQueryServer) IdById(ctx context.Context, req *QueryIdByIdRequest) (*QueryIdByIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IdById not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_IdByAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryIdByAddressRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).IdByAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.id.Query/IdByAddress", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).IdByAddress(ctx, req.(*QueryIdByAddressRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_IdById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryIdByIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).IdById(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.id.Query/IdById", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).IdById(ctx, req.(*QueryIdByIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.id.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "IdByAddress", + Handler: _Query_IdByAddress_Handler, + }, + { + MethodName: "IdById", + Handler: _Query_IdById_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "id/query.proto", +} + +func (m *QueryIdByAddressRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdByAddressRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdByAddressRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryIdByAddressResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdByAddressResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdByAddressResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Id != nil { + { + size, err := m.Id.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryIdByIdRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdByIdRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdByIdRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryIdByIdResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryIdByIdResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryIdByIdResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Id != nil { + { + size, err := m.Id.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryIdByAddressRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryIdByAddressResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != nil { + l = m.Id.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryIdByIdRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryIdByIdResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != nil { + l = m.Id.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryIdByAddressRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdByAddressRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdByAddressRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryIdByAddressResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdByAddressResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdByAddressResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Id == nil { + m.Id = &Id{} + } + if err := m.Id.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryIdByIdRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdByIdRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdByIdRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryIdByIdResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: QueryIdByIdResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryIdByIdResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Id == nil { + m.Id = &Id{} + } + if err := m.Id.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/id/types/query.pb.gw.go b/x/id/types/query.pb.gw.go new file mode 100644 index 00000000..fb1f214c --- /dev/null +++ b/x/id/types/query.pb.gw.go @@ -0,0 +1,290 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: id/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_IdByAddress_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdByAddressRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := client.IdByAddress(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_IdByAddress_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdByAddressRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.IdByAddress(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_IdById_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdByIdRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := client.IdById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_IdById_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryIdByIdRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.IdById(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_IdByAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_IdByAddress_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdByAddress_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_IdById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_IdById_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdById_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_IdByAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_IdByAddress_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdByAddress_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_IdById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_IdById_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_IdById_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_IdByAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2}, []string{"shareledger", "id", "address"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_IdById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1, 1, 0, 4, 1, 5, 1}, []string{"shareledger", "id"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Query_IdByAddress_0 = runtime.ForwardResponseMessage + + forward_Query_IdById_0 = runtime.ForwardResponseMessage +) diff --git a/x/id/types/tx.pb.go b/x/id/types/tx.pb.go new file mode 100644 index 00000000..9fd6b215 --- /dev/null +++ b/x/id/types/tx.pb.go @@ -0,0 +1,2137 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: id/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgCreateId struct { + IssuerAddress string `protobuf:"bytes,1,opt,name=issuerAddress,proto3" json:"issuerAddress,omitempty"` + BackupAddress string `protobuf:"bytes,2,opt,name=backupAddress,proto3" json:"backupAddress,omitempty"` + ExtraData string `protobuf:"bytes,3,opt,name=extraData,proto3" json:"extraData,omitempty"` + Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` + OwnerAddress string `protobuf:"bytes,5,opt,name=ownerAddress,proto3" json:"ownerAddress,omitempty"` +} + +func (m *MsgCreateId) Reset() { *m = MsgCreateId{} } +func (m *MsgCreateId) String() string { return proto.CompactTextString(m) } +func (*MsgCreateId) ProtoMessage() {} +func (*MsgCreateId) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{0} +} +func (m *MsgCreateId) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateId.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateId) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateId.Merge(m, src) +} +func (m *MsgCreateId) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateId) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateId.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateId proto.InternalMessageInfo + +func (m *MsgCreateId) GetIssuerAddress() string { + if m != nil { + return m.IssuerAddress + } + return "" +} + +func (m *MsgCreateId) GetBackupAddress() string { + if m != nil { + return m.BackupAddress + } + return "" +} + +func (m *MsgCreateId) GetExtraData() string { + if m != nil { + return m.ExtraData + } + return "" +} + +func (m *MsgCreateId) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *MsgCreateId) GetOwnerAddress() string { + if m != nil { + return m.OwnerAddress + } + return "" +} + +type MsgCreateIdResponse struct { +} + +func (m *MsgCreateIdResponse) Reset() { *m = MsgCreateIdResponse{} } +func (m *MsgCreateIdResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateIdResponse) ProtoMessage() {} +func (*MsgCreateIdResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{1} +} +func (m *MsgCreateIdResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateIdResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateIdResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateIdResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateIdResponse.Merge(m, src) +} +func (m *MsgCreateIdResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateIdResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateIdResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateIdResponse proto.InternalMessageInfo + +type MsgCreateIds struct { + IssuerAddress string `protobuf:"bytes,1,opt,name=issuerAddress,proto3" json:"issuerAddress,omitempty"` + BackupAddress []string `protobuf:"bytes,2,rep,name=backupAddress,proto3" json:"backupAddress,omitempty"` + ExtraData []string `protobuf:"bytes,3,rep,name=extraData,proto3" json:"extraData,omitempty"` + Id []string `protobuf:"bytes,4,rep,name=id,proto3" json:"id,omitempty"` + OwnerAddress []string `protobuf:"bytes,5,rep,name=ownerAddress,proto3" json:"ownerAddress,omitempty"` +} + +func (m *MsgCreateIds) Reset() { *m = MsgCreateIds{} } +func (m *MsgCreateIds) String() string { return proto.CompactTextString(m) } +func (*MsgCreateIds) ProtoMessage() {} +func (*MsgCreateIds) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{2} +} +func (m *MsgCreateIds) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateIds) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateIds.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateIds) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateIds.Merge(m, src) +} +func (m *MsgCreateIds) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateIds) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateIds.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateIds proto.InternalMessageInfo + +func (m *MsgCreateIds) GetIssuerAddress() string { + if m != nil { + return m.IssuerAddress + } + return "" +} + +func (m *MsgCreateIds) GetBackupAddress() []string { + if m != nil { + return m.BackupAddress + } + return nil +} + +func (m *MsgCreateIds) GetExtraData() []string { + if m != nil { + return m.ExtraData + } + return nil +} + +func (m *MsgCreateIds) GetId() []string { + if m != nil { + return m.Id + } + return nil +} + +func (m *MsgCreateIds) GetOwnerAddress() []string { + if m != nil { + return m.OwnerAddress + } + return nil +} + +type MsgCreateIdsResponse struct { +} + +func (m *MsgCreateIdsResponse) Reset() { *m = MsgCreateIdsResponse{} } +func (m *MsgCreateIdsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateIdsResponse) ProtoMessage() {} +func (*MsgCreateIdsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{3} +} +func (m *MsgCreateIdsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateIdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateIdsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateIdsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateIdsResponse.Merge(m, src) +} +func (m *MsgCreateIdsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateIdsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateIdsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateIdsResponse proto.InternalMessageInfo + +type MsgUpdateId struct { + IssuerAddress string `protobuf:"bytes,1,opt,name=issuerAddress,proto3" json:"issuerAddress,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + ExtraData string `protobuf:"bytes,3,opt,name=extraData,proto3" json:"extraData,omitempty"` +} + +func (m *MsgUpdateId) Reset() { *m = MsgUpdateId{} } +func (m *MsgUpdateId) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateId) ProtoMessage() {} +func (*MsgUpdateId) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{4} +} +func (m *MsgUpdateId) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateId.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateId) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateId.Merge(m, src) +} +func (m *MsgUpdateId) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateId) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateId.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateId proto.InternalMessageInfo + +func (m *MsgUpdateId) GetIssuerAddress() string { + if m != nil { + return m.IssuerAddress + } + return "" +} + +func (m *MsgUpdateId) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *MsgUpdateId) GetExtraData() string { + if m != nil { + return m.ExtraData + } + return "" +} + +type MsgUpdateIdResponse struct { +} + +func (m *MsgUpdateIdResponse) Reset() { *m = MsgUpdateIdResponse{} } +func (m *MsgUpdateIdResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateIdResponse) ProtoMessage() {} +func (*MsgUpdateIdResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{5} +} +func (m *MsgUpdateIdResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateIdResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateIdResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateIdResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateIdResponse.Merge(m, src) +} +func (m *MsgUpdateIdResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateIdResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateIdResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateIdResponse proto.InternalMessageInfo + +type MsgReplaceIdOwner struct { + BackupAddress string `protobuf:"bytes,1,opt,name=backupAddress,proto3" json:"backupAddress,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + OwnerAddress string `protobuf:"bytes,3,opt,name=ownerAddress,proto3" json:"ownerAddress,omitempty"` +} + +func (m *MsgReplaceIdOwner) Reset() { *m = MsgReplaceIdOwner{} } +func (m *MsgReplaceIdOwner) String() string { return proto.CompactTextString(m) } +func (*MsgReplaceIdOwner) ProtoMessage() {} +func (*MsgReplaceIdOwner) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{6} +} +func (m *MsgReplaceIdOwner) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgReplaceIdOwner) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgReplaceIdOwner.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgReplaceIdOwner) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgReplaceIdOwner.Merge(m, src) +} +func (m *MsgReplaceIdOwner) XXX_Size() int { + return m.Size() +} +func (m *MsgReplaceIdOwner) XXX_DiscardUnknown() { + xxx_messageInfo_MsgReplaceIdOwner.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgReplaceIdOwner proto.InternalMessageInfo + +func (m *MsgReplaceIdOwner) GetBackupAddress() string { + if m != nil { + return m.BackupAddress + } + return "" +} + +func (m *MsgReplaceIdOwner) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *MsgReplaceIdOwner) GetOwnerAddress() string { + if m != nil { + return m.OwnerAddress + } + return "" +} + +type MsgReplaceIdOwnerResponse struct { +} + +func (m *MsgReplaceIdOwnerResponse) Reset() { *m = MsgReplaceIdOwnerResponse{} } +func (m *MsgReplaceIdOwnerResponse) String() string { return proto.CompactTextString(m) } +func (*MsgReplaceIdOwnerResponse) ProtoMessage() {} +func (*MsgReplaceIdOwnerResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0e9bd79ac8ee1f8f, []int{7} +} +func (m *MsgReplaceIdOwnerResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgReplaceIdOwnerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgReplaceIdOwnerResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgReplaceIdOwnerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgReplaceIdOwnerResponse.Merge(m, src) +} +func (m *MsgReplaceIdOwnerResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgReplaceIdOwnerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgReplaceIdOwnerResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgReplaceIdOwnerResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCreateId)(nil), "shareledger.id.MsgCreateId") + proto.RegisterType((*MsgCreateIdResponse)(nil), "shareledger.id.MsgCreateIdResponse") + proto.RegisterType((*MsgCreateIds)(nil), "shareledger.id.MsgCreateIds") + proto.RegisterType((*MsgCreateIdsResponse)(nil), "shareledger.id.MsgCreateIdsResponse") + proto.RegisterType((*MsgUpdateId)(nil), "shareledger.id.MsgUpdateId") + proto.RegisterType((*MsgUpdateIdResponse)(nil), "shareledger.id.MsgUpdateIdResponse") + proto.RegisterType((*MsgReplaceIdOwner)(nil), "shareledger.id.MsgReplaceIdOwner") + proto.RegisterType((*MsgReplaceIdOwnerResponse)(nil), "shareledger.id.MsgReplaceIdOwnerResponse") +} + +func init() { proto.RegisterFile("id/tx.proto", fileDescriptor_0e9bd79ac8ee1f8f) } + +var fileDescriptor_0e9bd79ac8ee1f8f = []byte{ + // 405 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xcb, 0x4e, 0xf2, 0x40, + 0x14, 0x66, 0xda, 0xff, 0x37, 0x70, 0x40, 0x12, 0xc7, 0x4b, 0x10, 0x48, 0xa3, 0x95, 0x85, 0xc6, + 0xa4, 0x4d, 0xf4, 0x09, 0xbc, 0x2d, 0x48, 0x20, 0x24, 0x24, 0x6e, 0x5c, 0x98, 0x0c, 0xcc, 0xa4, + 0x4c, 0x04, 0xda, 0xcc, 0x94, 0x88, 0x6f, 0xe1, 0x7b, 0xe8, 0x83, 0xb8, 0x24, 0xae, 0x5c, 0x1a, + 0x78, 0x11, 0x43, 0xb1, 0xa5, 0x2d, 0xb5, 0x44, 0xb7, 0xe7, 0x7c, 0x73, 0xce, 0x77, 0x39, 0x19, + 0xc8, 0x73, 0x6a, 0xba, 0x63, 0xc3, 0x11, 0xb6, 0x6b, 0xe3, 0xa2, 0xec, 0x11, 0xc1, 0xfa, 0x8c, + 0x5a, 0x4c, 0x18, 0x9c, 0xea, 0x2f, 0x08, 0xf2, 0x4d, 0x69, 0x5d, 0x09, 0x46, 0x5c, 0x56, 0xa7, + 0xb8, 0x06, 0x9b, 0x5c, 0xca, 0x11, 0x13, 0x17, 0x94, 0x0a, 0x26, 0x65, 0x09, 0x1d, 0xa0, 0xe3, + 0x5c, 0x3b, 0x5a, 0x9c, 0xa3, 0x3a, 0xa4, 0xfb, 0x30, 0x72, 0x7c, 0x94, 0xb2, 0x40, 0x45, 0x8a, + 0xb8, 0x0a, 0x39, 0x36, 0x76, 0x05, 0xb9, 0x26, 0x2e, 0x29, 0xa9, 0x1e, 0x62, 0x59, 0xc0, 0x45, + 0x50, 0x38, 0x2d, 0xfd, 0xf3, 0xca, 0x0a, 0xa7, 0x58, 0x87, 0x82, 0xfd, 0x38, 0x5c, 0x2e, 0xfe, + 0xef, 0x75, 0x22, 0x35, 0x7d, 0x17, 0xb6, 0x43, 0x64, 0xdb, 0x4c, 0x3a, 0xf6, 0x50, 0x32, 0xfd, + 0x15, 0x41, 0x21, 0x54, 0x97, 0x7f, 0x57, 0xa1, 0xae, 0x55, 0xa1, 0x26, 0xab, 0x50, 0x7f, 0x54, + 0xa1, 0xae, 0xa8, 0xd8, 0x83, 0x9d, 0x30, 0xdb, 0x40, 0x06, 0xf1, 0xa2, 0xb8, 0x75, 0xe8, 0x6f, + 0xa2, 0x58, 0x10, 0x50, 0x02, 0x1b, 0x53, 0x4d, 0xff, 0x36, 0xd0, 0x5f, 0x11, 0x6c, 0x1e, 0xc0, + 0x56, 0x53, 0x5a, 0x6d, 0xe6, 0xf4, 0x49, 0x97, 0xd5, 0x69, 0x6b, 0xce, 0x76, 0xd5, 0x1e, 0x94, + 0x14, 0x72, 0x7c, 0x7f, 0xdc, 0x00, 0x35, 0x21, 0xc6, 0x0a, 0xec, 0xaf, 0xac, 0xf3, 0xb9, 0x9c, + 0xbd, 0x2b, 0xa0, 0x36, 0xa5, 0x85, 0x1b, 0x90, 0x0d, 0xae, 0xb2, 0x62, 0x44, 0xcf, 0xd6, 0x08, + 0xf9, 0x57, 0x3e, 0x4a, 0x69, 0xfa, 0x53, 0x71, 0x0b, 0x72, 0xcb, 0xf3, 0xa8, 0xa6, 0xbc, 0x90, + 0xe5, 0x5a, 0x5a, 0x37, 0x18, 0xd8, 0x80, 0x6c, 0x90, 0x54, 0x12, 0x3d, 0xbf, 0x99, 0x48, 0x2f, + 0x1e, 0x00, 0xbe, 0x87, 0x62, 0xcc, 0xfd, 0xc3, 0x84, 0x67, 0x51, 0x48, 0xf9, 0x64, 0x2d, 0xc4, + 0x9f, 0x7f, 0x79, 0xf3, 0x36, 0xd5, 0xd0, 0x64, 0xaa, 0xa1, 0xcf, 0xa9, 0x86, 0x9e, 0x67, 0x5a, + 0x66, 0x32, 0xd3, 0x32, 0x1f, 0x33, 0x2d, 0x73, 0x77, 0x6a, 0x71, 0xb7, 0x37, 0xea, 0x18, 0x5d, + 0x7b, 0x60, 0x7a, 0xe3, 0x04, 0x1f, 0x5a, 0x66, 0x68, 0xb0, 0x39, 0x36, 0xe7, 0x1f, 0xc8, 0x93, + 0xc3, 0x64, 0x67, 0xc3, 0xfb, 0x44, 0xce, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa4, 0x0a, 0x26, + 0xa8, 0x53, 0x04, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + CreateId(ctx context.Context, in *MsgCreateId, opts ...grpc.CallOption) (*MsgCreateIdResponse, error) + CreateIds(ctx context.Context, in *MsgCreateIds, opts ...grpc.CallOption) (*MsgCreateIdsResponse, error) + UpdateId(ctx context.Context, in *MsgUpdateId, opts ...grpc.CallOption) (*MsgUpdateIdResponse, error) + ReplaceIdOwner(ctx context.Context, in *MsgReplaceIdOwner, opts ...grpc.CallOption) (*MsgReplaceIdOwnerResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) CreateId(ctx context.Context, in *MsgCreateId, opts ...grpc.CallOption) (*MsgCreateIdResponse, error) { + out := new(MsgCreateIdResponse) + err := c.cc.Invoke(ctx, "/shareledger.id.Msg/CreateId", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) CreateIds(ctx context.Context, in *MsgCreateIds, opts ...grpc.CallOption) (*MsgCreateIdsResponse, error) { + out := new(MsgCreateIdsResponse) + err := c.cc.Invoke(ctx, "/shareledger.id.Msg/CreateIds", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) UpdateId(ctx context.Context, in *MsgUpdateId, opts ...grpc.CallOption) (*MsgUpdateIdResponse, error) { + out := new(MsgUpdateIdResponse) + err := c.cc.Invoke(ctx, "/shareledger.id.Msg/UpdateId", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) ReplaceIdOwner(ctx context.Context, in *MsgReplaceIdOwner, opts ...grpc.CallOption) (*MsgReplaceIdOwnerResponse, error) { + out := new(MsgReplaceIdOwnerResponse) + err := c.cc.Invoke(ctx, "/shareledger.id.Msg/ReplaceIdOwner", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + CreateId(context.Context, *MsgCreateId) (*MsgCreateIdResponse, error) + CreateIds(context.Context, *MsgCreateIds) (*MsgCreateIdsResponse, error) + UpdateId(context.Context, *MsgUpdateId) (*MsgUpdateIdResponse, error) + ReplaceIdOwner(context.Context, *MsgReplaceIdOwner) (*MsgReplaceIdOwnerResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) CreateId(ctx context.Context, req *MsgCreateId) (*MsgCreateIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateId not implemented") +} +func (*UnimplementedMsgServer) CreateIds(ctx context.Context, req *MsgCreateIds) (*MsgCreateIdsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateIds not implemented") +} +func (*UnimplementedMsgServer) UpdateId(ctx context.Context, req *MsgUpdateId) (*MsgUpdateIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateId not implemented") +} +func (*UnimplementedMsgServer) ReplaceIdOwner(ctx context.Context, req *MsgReplaceIdOwner) (*MsgReplaceIdOwnerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReplaceIdOwner not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_CreateId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateId(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.id.Msg/CreateId", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateId(ctx, req.(*MsgCreateId)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_CreateIds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateIds) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateIds(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.id.Msg/CreateIds", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateIds(ctx, req.(*MsgCreateIds)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_UpdateId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateId(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.id.Msg/UpdateId", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateId(ctx, req.(*MsgUpdateId)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_ReplaceIdOwner_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgReplaceIdOwner) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).ReplaceIdOwner(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/shareledger.id.Msg/ReplaceIdOwner", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).ReplaceIdOwner(ctx, req.(*MsgReplaceIdOwner)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "shareledger.id.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateId", + Handler: _Msg_CreateId_Handler, + }, + { + MethodName: "CreateIds", + Handler: _Msg_CreateIds_Handler, + }, + { + MethodName: "UpdateId", + Handler: _Msg_UpdateId_Handler, + }, + { + MethodName: "ReplaceIdOwner", + Handler: _Msg_ReplaceIdOwner_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "id/tx.proto", +} + +func (m *MsgCreateId) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateId) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateId) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OwnerAddress) > 0 { + i -= len(m.OwnerAddress) + copy(dAtA[i:], m.OwnerAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.OwnerAddress))) + i-- + dAtA[i] = 0x2a + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintTx(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x22 + } + if len(m.ExtraData) > 0 { + i -= len(m.ExtraData) + copy(dAtA[i:], m.ExtraData) + i = encodeVarintTx(dAtA, i, uint64(len(m.ExtraData))) + i-- + dAtA[i] = 0x1a + } + if len(m.BackupAddress) > 0 { + i -= len(m.BackupAddress) + copy(dAtA[i:], m.BackupAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.BackupAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.IssuerAddress) > 0 { + i -= len(m.IssuerAddress) + copy(dAtA[i:], m.IssuerAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.IssuerAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateIdResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateIdResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateIdResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgCreateIds) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateIds) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateIds) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OwnerAddress) > 0 { + for iNdEx := len(m.OwnerAddress) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.OwnerAddress[iNdEx]) + copy(dAtA[i:], m.OwnerAddress[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.OwnerAddress[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.Id) > 0 { + for iNdEx := len(m.Id) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Id[iNdEx]) + copy(dAtA[i:], m.Id[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.Id[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.ExtraData) > 0 { + for iNdEx := len(m.ExtraData) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ExtraData[iNdEx]) + copy(dAtA[i:], m.ExtraData[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.ExtraData[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.BackupAddress) > 0 { + for iNdEx := len(m.BackupAddress) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BackupAddress[iNdEx]) + copy(dAtA[i:], m.BackupAddress[iNdEx]) + i = encodeVarintTx(dAtA, i, uint64(len(m.BackupAddress[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.IssuerAddress) > 0 { + i -= len(m.IssuerAddress) + copy(dAtA[i:], m.IssuerAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.IssuerAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateIdsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateIdsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateIdsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgUpdateId) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateId) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateId) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ExtraData) > 0 { + i -= len(m.ExtraData) + copy(dAtA[i:], m.ExtraData) + i = encodeVarintTx(dAtA, i, uint64(len(m.ExtraData))) + i-- + dAtA[i] = 0x1a + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintTx(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.IssuerAddress) > 0 { + i -= len(m.IssuerAddress) + copy(dAtA[i:], m.IssuerAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.IssuerAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateIdResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateIdResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateIdResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgReplaceIdOwner) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgReplaceIdOwner) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgReplaceIdOwner) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OwnerAddress) > 0 { + i -= len(m.OwnerAddress) + copy(dAtA[i:], m.OwnerAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.OwnerAddress))) + i-- + dAtA[i] = 0x1a + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintTx(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.BackupAddress) > 0 { + i -= len(m.BackupAddress) + copy(dAtA[i:], m.BackupAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.BackupAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgReplaceIdOwnerResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgReplaceIdOwnerResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgReplaceIdOwnerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateId) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IssuerAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.BackupAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ExtraData) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.OwnerAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgCreateIdResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgCreateIds) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IssuerAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.BackupAddress) > 0 { + for _, s := range m.BackupAddress { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + if len(m.ExtraData) > 0 { + for _, s := range m.ExtraData { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + if len(m.Id) > 0 { + for _, s := range m.Id { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + if len(m.OwnerAddress) > 0 { + for _, s := range m.OwnerAddress { + l = len(s) + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgCreateIdsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgUpdateId) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IssuerAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ExtraData) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgUpdateIdResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgReplaceIdOwner) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BackupAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.OwnerAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgReplaceIdOwnerResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateId) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateId: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateId: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IssuerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IssuerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BackupAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraData", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtraData = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OwnerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateIdResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateIdResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateIdResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateIds) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateIds: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateIds: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IssuerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IssuerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BackupAddress = append(m.BackupAddress, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraData", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtraData = append(m.ExtraData, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OwnerAddress = append(m.OwnerAddress, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateIdsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgCreateIdsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateIdsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateId) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgUpdateId: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateId: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IssuerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IssuerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraData", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtraData = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateIdResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgUpdateIdResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateIdResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgReplaceIdOwner) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgReplaceIdOwner: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgReplaceIdOwner: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BackupAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OwnerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgReplaceIdOwnerResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return 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 fmt.Errorf("proto: MsgReplaceIdOwnerResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgReplaceIdOwnerResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/id/types/types.go b/x/id/types/types.go new file mode 100644 index 00000000..ab1254f4 --- /dev/null +++ b/x/id/types/types.go @@ -0,0 +1 @@ +package types diff --git a/x/identity/alias.go b/x/identity/alias.go deleted file mode 100644 index 492a1d05..00000000 --- a/x/identity/alias.go +++ /dev/null @@ -1,37 +0,0 @@ -package identity - -import ( - "github.com/sharering/shareledger/x/identity/keeper" - "github.com/sharering/shareledger/x/identity/types" -) - -const ( - ModuleName = types.ModuleName - RouterKey = types.RouterKey - StoreKey = types.StoreKey - QuerierRoute = types.QuerierRoute - TypeCreateIdMsg = types.TypeCreateIdMsg - TypeUpdateIdMsg = types.TypeUpdateIdMsg - TypeDeleteIdMsg = types.TypeDeleteIdMsg - TypeEnrollIdSignersMsg = types.TypeEnrollIDSignersMsg - TypeRevokeIdSignersMsg = types.TypeRevokeIDSignersMsg - IdSignerPrefix = keeper.IdSignerPrefix - IdPrefix = keeper.IdPrefix -) - -var ( - NewKeeper = keeper.NewKeeper - NewQuerier = keeper.NewQuerier - ModuleCdc = types.ModuleCdc - RegisterCodec = types.RegisterCodec -) - -type ( - Keeper = keeper.Keeper - MsgEnrollIDSigners = types.MsgEnrollIDSigners - MsgRevokeIDSigners = types.MsgRevokeIDSigners - MsgCreateId = types.MsgCreateId - MsgUpdateId = types.MsgUpdateId - MsgDeleteId = types.MsgDeleteId - IdSigner = types.IdSigner -) diff --git a/x/identity/client/cli/query.go b/x/identity/client/cli/query.go deleted file mode 100644 index a1e53156..00000000 --- a/x/identity/client/cli/query.go +++ /dev/null @@ -1,73 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/identity/types" - "github.com/spf13/cobra" -) - -func QueryCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - identityQueryCmd := &cobra.Command{ - Use: types.ModuleName, - Short: "Querying commands for the identity module", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - identityQueryCmd.AddCommand(flags.GetCommands( - CmdGetId(storeKey, cdc), - CmdGetIdSigner(storeKey, cdc), - )...) - - return identityQueryCmd -} - -func CmdGetId(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "id [address]", - Short: "get id from address", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - idKey := "Id" + addr.String() - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/id/%s", queryRoute, idKey), nil) - if err != nil { - return err - } - var out string - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} - -func CmdGetIdSigner(queryRoute string, cdc *codec.Codec) *cobra.Command { - return &cobra.Command{ - Use: "signer [address]", - Short: "get id signer from address", - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx := context.NewCLIContext().WithCodec(cdc) - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - idKey := "IdSigner" + addr.String() - res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/signer/%s", queryRoute, idKey), nil) - if err != nil { - return err - } - var out types.IdSigner - cdc.MustUnmarshalJSON(res, &out) - return cliCtx.PrintOutput(out) - }, - } -} diff --git a/x/identity/client/cli/tx.go b/x/identity/client/cli/tx.go deleted file mode 100644 index bc148d23..00000000 --- a/x/identity/client/cli/tx.go +++ /dev/null @@ -1,309 +0,0 @@ -package cli - -import ( - "bufio" - "fmt" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - - shareringUtils "github.com/ShareRing/modules/utils" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/identity/types" - - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" -) - -const ( - minShrFee = "1shr" -) - -func GetTxCmd(storeKey string, cdc *codec.Codec) *cobra.Command { - identityTxCmd := &cobra.Command{ - Use: types.ModuleName, - Short: "identity transaction subcommands", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - identityTxCmd.AddCommand(flags.PostCommands( - GetCmdEnrollIdSigners(cdc), - GetCmdEnrollIdSignersFromFile(cdc), - GetCmdRevokeIdSigners(cdc), - GetCmdCreateId(cdc), - GetCmdUpdateId(cdc), - GetCmdDeleteId(cdc), - )...) - - return identityTxCmd -} - -func GetCmdEnrollIdSigners(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-signer [address1] [address2] [address3]", - Short: "enroll id signers", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minShrFee) - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - var signerAddresses []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - signerAddresses = append(signerAddresses, addr) - } - msg := types.NewMsgEnrollIDSigners(cliCtx.GetFromAddress(), signerAddresses) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdEnrollIdSignersFromFile(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "enroll-signers-from-file [filepath]", - Short: "enroll id signers", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minShrFee) - addrList, err := shareringUtils.GetAddressFromFile(args[0]) - if err != nil { - return err - } - - listLength := len(addrList) - nloop := listLength / 5 - if nloop*5 > listLength { - nloop = nloop + 1 - } - for i := 0; i < nloop; i++ { - var loaderAddresses []sdk.AccAddress - m := 5 * i - n := 5*i + 5 - if n > listLength { - n = listLength - } - for _, a := range addrList[m:n] { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - loaderAddresses = append(loaderAddresses, addr) - } - - msg := types.NewMsgEnrollIDSigners(cliCtx.GetFromAddress(), loaderAddresses) - err = msg.ValidateBasic() - if err != nil { - return err - } - if err := utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}); err != nil { - return err - } - fmt.Printf("================ ENROLLED %d SIGNERS", n) - } - fmt.Printf("\nDONE ENROLL %d ID SIGNERS\n", listLength) - return nil - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdRevokeIdSigners(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "revoke-signer [address1] [address2] [address3]", - Short: "revoke id signers", - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minShrFee) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - var signerAddresses []sdk.AccAddress - for _, a := range args { - addr, err := sdk.AccAddressFromBech32(a) - if err != nil { - return err - } - signerAddresses = append(signerAddresses, addr) - } - msg := types.NewMsgRevokeIDSigners(cliCtx.GetFromAddress(), signerAddresses) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdCreateId(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "create [owner] [hash]", - Short: "create id", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minShrFee) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - msg := types.NewMsgCreateId(cliCtx.GetFromAddress(), addr, args[1]) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdUpdateId(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "update [owner] [hash]", - Short: "update id", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minShrFee) - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - msg := types.NewMsgUpdateId(cliCtx.GetFromAddress(), addr, args[1]) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} - -func GetCmdDeleteId(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "delete [owner]", - Short: "delete id", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - - keySeed := viper.GetString(shareringUtils.FlagKeySeed) - seed, err := shareringUtils.GetKeeySeedFromFile(keySeed) - if err != nil { - return err - } - - cliCtx, txBldr, err := shareringUtils.GetTxBldrAndCtxFromSeed(inBuf, cdc, seed) - if err != nil { - return err - } - - txBldr = txBldr.WithFees(minShrFee) - - if len(args) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "Empty signer address list") - } - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - msg := types.NewMsgDeleteId(cliCtx.GetFromAddress(), addr) - err = msg.ValidateBasic() - if err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(shareringUtils.FlagKeySeed, "", "path to key_seed.json") - return cmd -} diff --git a/x/identity/client/rest/rest.go b/x/identity/client/rest/rest.go deleted file mode 100644 index d3375203..00000000 --- a/x/identity/client/rest/rest.go +++ /dev/null @@ -1,13 +0,0 @@ -package rest - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/client/context" - - "github.com/gorilla/mux" -) - -func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, storeName string) { - r.HandleFunc(fmt.Sprintf("/%s", storeName), nil).Methods("GET") -} diff --git a/x/identity/client/rest/tx.go b/x/identity/client/rest/tx.go deleted file mode 100644 index 0062e0ca..00000000 --- a/x/identity/client/rest/tx.go +++ /dev/null @@ -1 +0,0 @@ -package rest diff --git a/x/identity/events.go b/x/identity/events.go deleted file mode 100644 index 6eab2936..00000000 --- a/x/identity/events.go +++ /dev/null @@ -1,10 +0,0 @@ -package identity - -const ( - EventTypeIDCreate = "IDCreate" - EventTypeIDUpdate = "IDUpdate" - EventTypeIDDelete = "IDDelete" - - AttributeAddress = "Address" - AttributeHash = "Hash" -) diff --git a/x/identity/genesis.go b/x/identity/genesis.go deleted file mode 100644 index ce9bfbcb..00000000 --- a/x/identity/genesis.go +++ /dev/null @@ -1,55 +0,0 @@ -package identity - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/identity/types" -) - -type GenesisState struct { - IDSigners []string - IDs map[string]string -} - -func NewGenesisState() GenesisState { - return GenesisState{} -} - -func ValidateGenesis(data GenesisState) error { - return nil -} - -func DefaultGenesisState() GenesisState { - return GenesisState{} -} - -func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { - for _, signerKey := range data.IDSigners { - keeper.SetIdSignerStatus(ctx, signerKey, types.IdSignerActive) - } - for idKey, hash := range data.IDs { - keeper.SetId(ctx, idKey, hash) - } -} - -func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState { - var idSignerKeys []string - cb := func(idSignerKey string, s types.IdSigner) bool { - if s.Status == types.IdSignerActive { - idSignerKeys = append(idSignerKeys, idSignerKey) - } - return false - } - k.IterateIdSigners(ctx, cb) - - ids := make(map[string]string) - cb2 := func(idKey, hash string) bool { - ids[idKey] = hash - return false - } - k.IterateIds(ctx, cb2) - - return GenesisState{ - IDSigners: idSignerKeys, - IDs: ids, - } -} diff --git a/x/identity/handler.go b/x/identity/handler.go deleted file mode 100644 index b6ef079f..00000000 --- a/x/identity/handler.go +++ /dev/null @@ -1,150 +0,0 @@ -package identity - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/sharering/shareledger/x/identity/types" -) - -func NewHandler(keeper Keeper) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, fmt.Sprintf("Unrecognized identity Msg type: %v [Deprecated: Old module]", msg.Type())) - // switch msg := msg.(type) { - // case MsgCreateId: - // return handleMsgCreateId(ctx, keeper, msg) - // case MsgUpdateId: - // return handleMsgUpdateId(ctx, keeper, msg) - // case MsgDeleteId: - // return handleMsgDeleteId(ctx, keeper, msg) - // case MsgEnrollIDSigners: - // return handleMsgEnrollIdSigners(ctx, keeper, msg) - // case MsgRevokeIDSigners: - // return handleMsgRevokeIdSigners(ctx, keeper, msg) - // default: - // return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, fmt.Sprintf("Unrecognized identity Msg type: %v", msg.Type())) - // } - } -} - -func handleMsgCreateId(ctx sdk.Context, keeper Keeper, msg MsgCreateId) (*sdk.Result, error) { - if !IsIdSigner(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not an Enrolled Id signer") - } - - addr := IdPrefix + msg.Owner.String() - if keeper.IsIdPresent(ctx, addr) { - return nil, types.ErrIdAlreadyExists - } - - keeper.SetId(ctx, addr, msg.Hash) - event := sdk.NewEvent( - EventTypeIDCreate, - sdk.NewAttribute(AttributeAddress, msg.Owner.String()), - sdk.NewAttribute(AttributeHash, msg.Hash), - ) - ctx.EventManager().EmitEvent(event) - return &sdk.Result{ - Log: msg.String(), - Events: ctx.EventManager().Events(), - }, nil -} - -func handleMsgUpdateId(ctx sdk.Context, keeper Keeper, msg MsgUpdateId) (*sdk.Result, error) { - if !IsIdSigner(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not an Enrolled Id signer") - } - - addr := IdPrefix + msg.Owner.String() - if !keeper.IsIdPresent(ctx, addr) { - return nil, types.ErrIdNotExists - } - - event := sdk.NewEvent( - EventTypeIDUpdate, - sdk.NewAttribute(AttributeAddress, msg.Owner.String()), - sdk.NewAttribute(AttributeHash, msg.Hash), - ) - ctx.EventManager().EmitEvent(event) - keeper.SetId(ctx, addr, msg.Hash) - return &sdk.Result{ - Log: msg.String(), - Events: ctx.EventManager().Events(), - }, nil -} - -func handleMsgDeleteId(ctx sdk.Context, keeper Keeper, msg MsgDeleteId) (*sdk.Result, error) { - if !IsIdSigner(ctx, msg.GetSigners()[0], keeper) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not an Enrolled Id signer") - } - - addr := IdPrefix + msg.Owner.String() - if !keeper.IsIdPresent(ctx, addr) { - return nil, types.ErrIdNotExists - } - keeper.DeleteId(ctx, addr) - event := sdk.NewEvent( - EventTypeIDDelete, - sdk.NewAttribute(AttributeAddress, msg.Owner.String()), - ) - ctx.EventManager().EmitEvent(event) - log := fmt.Sprintf("delete id for address %s", msg.Owner.String()) - return &sdk.Result{ - Log: log, - Events: ctx.EventManager().Events(), - }, nil -} - -func handleMsgEnrollIdSigners(ctx sdk.Context, keeper Keeper, msg MsgEnrollIDSigners) (*sdk.Result, error) { - if !keeper.IsAuthority(ctx, msg.GetSigners()[0]) { - return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "Approver's Address is not authority") - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - log := "signer addresses: " - signerAllowance := sdk.NewCoins(sdk.NewCoin("shr", sdk.NewInt(int64(20)))) - - for _, addr := range msg.IDSigners { - log = log + "," + addr.String() - signerKey := fmt.Sprintf("%s%s", IdSignerPrefix, addr.String()) - keeper.SetIdSignerStatus(ctx, signerKey, types.IdSignerActive) - if err := keeper.LoadCoins(ctx, addr, signerAllowance); err != nil { - return nil, err - } - } - log = "Successfully enrolled" + log - return &sdk.Result{ - Log: log, - }, nil -} - -func handleMsgRevokeIdSigners(ctx sdk.Context, keeper Keeper, msg MsgRevokeIDSigners) (*sdk.Result, error) { - if !keeper.IsAuthority(ctx, msg.GetSigners()[0]) { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Approver's Address is not authority") - } - if err := msg.ValidateBasic(); err != nil { - return nil, err - } - log := "signer addresses: " - for _, addr := range msg.IDSigners { - log = log + "," + addr.String() - signerKey := fmt.Sprintf("%s%s", IdSignerPrefix, addr.String()) - keeper.DeleteIdSigner(ctx, signerKey) - } - log = "Successfully revoked" + log - - return &sdk.Result{ - Log: log, - }, nil -} - -func IsIdSigner(ctx sdk.Context, address sdk.AccAddress, k Keeper) bool { - addr := IdSignerPrefix + address.String() - status := k.GetIdSignerStatus(ctx, addr) - if status == types.IdSignerActive { - return true - } - return false -} diff --git a/x/identity/keeper/keeper.go b/x/identity/keeper/keeper.go deleted file mode 100644 index 0d374418..00000000 --- a/x/identity/keeper/keeper.go +++ /dev/null @@ -1,140 +0,0 @@ -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/sharering/shareledger/x/gentlemint" - "github.com/sharering/shareledger/x/identity/types" -) - -type Keeper struct { - storeKey sdk.StoreKey - cdc *codec.Codec - gmKeeper gentlemint.Keeper -} - -const ( - IdSignerPrefix = "IdSigner" - IdPrefix = "Id" -) - -// NewKeeper creates new instances of the gentlemint Keeper -func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey, gmKeeper gentlemint.Keeper) Keeper { - return Keeper{ - cdc: cdc, - storeKey: storeKey, - gmKeeper: gmKeeper, - } -} - -func (k Keeper) GetIdSigner(ctx sdk.Context, address string) types.IdSigner { - if !k.IsIdSignerPresent(ctx, address) { - return types.NewIdSigner() - } - store := ctx.KVStore(k.storeKey) - bz := store.Get([]byte(address)) - var signer types.IdSigner - k.cdc.MustUnmarshalBinaryBare(bz, &signer) - return signer -} - -func (k Keeper) GetId(ctx sdk.Context, address string) string { - if !k.IsIdPresent(ctx, address) { - return "" - } - store := ctx.KVStore(k.storeKey) - bz := store.Get([]byte(address)) - return string(bz) -} - -func (k Keeper) SetIdSigner(ctx sdk.Context, address string, signer types.IdSigner) { - if signer.Status == "" { - return - } - store := ctx.KVStore(k.storeKey) - store.Set([]byte(address), k.cdc.MustMarshalBinaryBare(signer)) -} - -func (k Keeper) SetId(ctx sdk.Context, address string, hash string) { - if hash == "" { - return - } - store := ctx.KVStore(k.storeKey) - store.Set([]byte(address), []byte(hash)) -} - -func (k Keeper) GetIdSignerStatus(ctx sdk.Context, address string) string { - signer := k.GetIdSigner(ctx, address) - return signer.Status -} - -func (k Keeper) SetIdSignerStatus(ctx sdk.Context, address string, status string) { - signer := k.GetIdSigner(ctx, address) - signer.Status = status - k.SetIdSigner(ctx, address, signer) -} - -func (k Keeper) DeleteIdSigner(ctx sdk.Context, address string) { - store := ctx.KVStore(k.storeKey) - store.Delete([]byte(address)) -} - -func (k Keeper) DeleteId(ctx sdk.Context, address string) { - store := ctx.KVStore(k.storeKey) - store.Delete([]byte(address)) -} - -func (k Keeper) GetIdSignerIterator(ctx sdk.Context) sdk.Iterator { - store := ctx.KVStore(k.storeKey) - return sdk.KVStorePrefixIterator(store, []byte(IdSignerPrefix)) -} - -func (k Keeper) IterateIdSigners(ctx sdk.Context, cb func(signerKey string, signer types.IdSigner) bool) { - iterator := k.GetIdSignerIterator(ctx) - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - var signer types.IdSigner - signerKey := string(iterator.Key()) - k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &signer) - if cb(signerKey, signer) { - break - } - } -} - -func (k Keeper) GetIdIterator(ctx sdk.Context) sdk.Iterator { - store := ctx.KVStore(k.storeKey) - return sdk.KVStorePrefixIterator(store, []byte(IdPrefix)) -} - -func (k Keeper) IterateIds(ctx sdk.Context, cb func(idKey, hash string) bool) { - iterator := k.GetIdIterator(ctx) - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - idKey := string(iterator.Key()) - hash := string(iterator.Value()) - if cb(idKey, hash) { - break - } - } -} - -func (k Keeper) IsIdSignerPresent(ctx sdk.Context, address string) bool { - store := ctx.KVStore(k.storeKey) - return store.Has([]byte(address)) -} - -func (k Keeper) IsIdPresent(ctx sdk.Context, address string) bool { - store := ctx.KVStore(k.storeKey) - return store.Has([]byte(address)) -} - -func (k Keeper) LoadCoins(ctx sdk.Context, toAddr sdk.AccAddress, amt sdk.Coins) error { - return k.gmKeeper.LoadCoins(ctx, toAddr, amt) -} - -func (k Keeper) IsAuthority(ctx sdk.Context, addr sdk.AccAddress) bool { - authAddr := k.gmKeeper.GetAuthorityAccount(ctx) - - return authAddr == addr.String() -} diff --git a/x/identity/keeper/querier.go b/x/identity/keeper/querier.go deleted file mode 100644 index e63e8785..00000000 --- a/x/identity/keeper/querier.go +++ /dev/null @@ -1,45 +0,0 @@ -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - abci "github.com/tendermint/tendermint/abci/types" -) - -const ( - QueryID = "id" - QuerySigner = "signer" -) - -func NewQuerier(keeper Keeper) sdk.Querier { - return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err error) { - switch path[0] { - case QueryID: - return queryId(ctx, path[1:], req, keeper) - case QuerySigner: - return querySigner(ctx, path[1:], req, keeper) - default: - return nil, sdkerrors.ErrInvalidRequest - } - } -} - -func queryId(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - Id := keeper.GetId(ctx, path[0]) - res, err := codec.MarshalJSONIndent(keeper.cdc, Id) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} - -func querySigner(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, error) { - IdSigner := keeper.GetIdSigner(ctx, path[0]) - res, err := codec.MarshalJSONIndent(keeper.cdc, IdSigner) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) - } - return res, nil -} diff --git a/x/identity/module.go b/x/identity/module.go deleted file mode 100644 index 4747d557..00000000 --- a/x/identity/module.go +++ /dev/null @@ -1,116 +0,0 @@ -package identity - -import ( - "encoding/json" - - "github.com/gorilla/mux" - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/sharering/shareledger/x/identity/client/cli" - "github.com/sharering/shareledger/x/identity/client/rest" - - "github.com/cosmos/cosmos-sdk/client/context" - sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" -) - -// type check to ensure the interface is properly implemented -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} -) - -// app module Basics object -type AppModuleBasic struct{} - -func (AppModuleBasic) Name() string { - return ModuleName -} - -func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { - RegisterCodec(cdc) -} - -func (AppModuleBasic) DefaultGenesis() json.RawMessage { - return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) -} - -// Validation check of the Genesis -func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { - var data GenesisState - err := ModuleCdc.UnmarshalJSON(bz, &data) - if err != nil { - return err - } - // Once json successfully marshalled, passes along to genesis.go - return ValidateGenesis(data) -} - -// Register rest routes -func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { - rest.RegisterRoutes(ctx, rtr, StoreKey) -} - -// Get the root query command of this module -func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { - return cli.QueryCmd(StoreKey, cdc) -} - -// Get the root tx command of this module -func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetTxCmd(StoreKey, cdc) -} - -type AppModule struct { - AppModuleBasic - keeper Keeper -} - -// NewAppModule creates a new AppModule Object -func NewAppModule(k Keeper) AppModule { - return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, - } -} - -func (AppModule) Name() string { - return ModuleName -} - -func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} - -func (am AppModule) Route() string { - return RouterKey -} - -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(am.keeper) -} -func (am AppModule) QuerierRoute() string { - return QuerierRoute -} - -func (am AppModule) NewQuerierHandler() sdk.Querier { - return NewQuerier(am.keeper) -} - -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} - -func (am AppModule) EndBlock(sdk.Context, abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} -} - -func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState GenesisState - ModuleCdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} -} - -func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return ModuleCdc.MustMarshalJSON(gs) -} diff --git a/x/identity/types/codec.go b/x/identity/types/codec.go deleted file mode 100644 index 76675b4c..00000000 --- a/x/identity/types/codec.go +++ /dev/null @@ -1,21 +0,0 @@ -package types - -import ( - "github.com/cosmos/cosmos-sdk/codec" -) - -// ModuleCdc is the codec for the module -var ModuleCdc = codec.New() - -func init() { - RegisterCodec(ModuleCdc) -} - -// RegisterCodec registers concrete types on the Amino codec -func RegisterCodec(cdc *codec.Codec) { - cdc.RegisterConcrete(MsgCreateId{}, "identity/CreateId", nil) - cdc.RegisterConcrete(MsgUpdateId{}, "identity/UpdateId", nil) - cdc.RegisterConcrete(MsgDeleteId{}, "identity/DeleteId", nil) - cdc.RegisterConcrete(MsgEnrollIDSigners{}, "identity/EnrollIdSigners", nil) - cdc.RegisterConcrete(MsgRevokeIDSigners{}, "identity/RevokeIdSigners", nil) -} diff --git a/x/identity/types/errors.go b/x/identity/types/errors.go deleted file mode 100644 index 33797077..00000000 --- a/x/identity/types/errors.go +++ /dev/null @@ -1,10 +0,0 @@ -package types - -import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -var ( - ErrIdAlreadyExists = sdkerrors.New(ModuleName, 1, "Id already exists") - ErrIdNotExists = sdkerrors.New(ModuleName, 2, "Id does not exists") -) diff --git a/x/identity/types/key.go b/x/identity/types/key.go deleted file mode 100644 index 64b499a7..00000000 --- a/x/identity/types/key.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -const ( - // ModuleName is the name of the module - ModuleName = "identity" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey is the module name router key - RouterKey = ModuleName - - // QuerierRoute to be used for querierer msgs - QuerierRoute = ModuleName -) diff --git a/x/identity/types/msgs.go b/x/identity/types/msgs.go deleted file mode 100644 index 9ec3e5f0..00000000 --- a/x/identity/types/msgs.go +++ /dev/null @@ -1,232 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeCreateIdMsg = "create_id" - TypeUpdateIdMsg = "update_id" - TypeDeleteIdMsg = "delete_id" - TypeEnrollIDSignersMsg = "enroll_id_signers" - TypeRevokeIDSignersMsg = "revoke_id_signers" -) - -type MsgCreateId struct { - Approver sdk.AccAddress `json:"approver"` - Owner sdk.AccAddress `json:"owner"` - Hash string `json:"hash"` -} - -func NewMsgCreateId(approver, owner sdk.AccAddress, hash string) MsgCreateId { - return MsgCreateId{ - Approver: approver, - Owner: owner, - Hash: hash, - } -} - -func (msg MsgCreateId) Route() string { - return RouterKey -} - -func (msg MsgCreateId) Type() string { - return TypeCreateIdMsg -} - -func (msg MsgCreateId) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Approver address must not be empty") - } - if msg.Owner.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Owner address must not be empty") - } - return nil -} - -func (msg MsgCreateId) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgCreateId) String() string { - return fmt.Sprintf("Identity/MsgCreateId{Address:%s,Hash:%s}", msg.Owner.String(), msg.Hash) -} - -func (msg MsgCreateId) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgUpdateId struct { - Approver sdk.AccAddress `json:"approver"` - Owner sdk.AccAddress `json:"owner"` - Hash string `json:"hash"` -} - -func NewMsgUpdateId(approver, owner sdk.AccAddress, hash string) MsgUpdateId { - return MsgUpdateId{ - Approver: approver, - Owner: owner, - Hash: hash, - } -} - -func (msg MsgUpdateId) Route() string { - return RouterKey -} - -func (msg MsgUpdateId) Type() string { - return TypeUpdateIdMsg -} - -func (msg MsgUpdateId) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Approver address must not be empty") - } - if msg.Owner.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Owner address must not be empty") - } - return nil -} - -func (msg MsgUpdateId) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgUpdateId) String() string { - return fmt.Sprintf("Identity/MsgUpdateId{Address:%s,Hash:%s}", msg.Owner.String(), msg.Hash) -} - -func (msg MsgUpdateId) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgDeleteId struct { - Approver sdk.AccAddress `json:"approver"` - Owner sdk.AccAddress `json:"owner"` -} - -func NewMsgDeleteId(approver, owner sdk.AccAddress) MsgDeleteId { - return MsgDeleteId{ - Approver: approver, - Owner: owner, - } -} - -func (msg MsgDeleteId) Route() string { - return RouterKey -} - -func (msg MsgDeleteId) Type() string { - return TypeDeleteIdMsg -} - -func (msg MsgDeleteId) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Approver address must not be empty") - } - if msg.Owner.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Owner address must not be empty") - } - return nil -} - -func (msg MsgDeleteId) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgDeleteId) String() string { - return fmt.Sprintf("Identity/MsgDeleteId{Address:%s}", msg.Owner.String()) -} - -func (msg MsgDeleteId) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgEnrollIDSigners struct { - Approver sdk.AccAddress `json:"approver"` - IDSigners []sdk.AccAddress `json:"receiver"` -} - -func NewMsgEnrollIDSigners(approver sdk.AccAddress, signers []sdk.AccAddress) MsgEnrollIDSigners { - return MsgEnrollIDSigners{ - Approver: approver, - IDSigners: signers, - } -} - -func (msg MsgEnrollIDSigners) Route() string { - return RouterKey -} - -func (msg MsgEnrollIDSigners) Type() string { - return TypeEnrollIDSignersMsg -} - -func (msg MsgEnrollIDSigners) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.IDSigners) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The signers list are empty") - } - for _, addr := range msg.IDSigners { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Signer address empty") - } - } - return nil -} - -func (msg MsgEnrollIDSigners) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgEnrollIDSigners) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} - -type MsgRevokeIDSigners struct { - Approver sdk.AccAddress `json:"approver"` - IDSigners []sdk.AccAddress `json:"receiver"` -} - -func NewMsgRevokeIDSigners(approver sdk.AccAddress, signers []sdk.AccAddress) MsgRevokeIDSigners { - return MsgRevokeIDSigners{ - Approver: approver, - IDSigners: signers, - } -} - -func (msg MsgRevokeIDSigners) Route() string { - return RouterKey -} - -func (msg MsgRevokeIDSigners) Type() string { - return TypeRevokeIDSignersMsg -} - -func (msg MsgRevokeIDSigners) ValidateBasic() error { - if msg.Approver.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Approver.String()) - } - if len(msg.IDSigners) == 0 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "The signers list are empty") - } - for _, addr := range msg.IDSigners { - if addr.Empty() { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "Signer address empty") - } - } - return nil -} - -func (msg MsgRevokeIDSigners) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -func (msg MsgRevokeIDSigners) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Approver} -} diff --git a/x/identity/types/types.go b/x/identity/types/types.go deleted file mode 100644 index 7ec9866e..00000000 --- a/x/identity/types/types.go +++ /dev/null @@ -1,26 +0,0 @@ -package types - -import ( - "fmt" - "strings" -) - -const ( - IdSignerActive = "active" - IdSignerInactive = "inactive" - defaultSHRPLoaderStatus = IdSignerInactive -) - -type IdSigner struct { - Status string `json:"status"` -} - -func NewIdSigner() IdSigner { - return IdSigner{ - Status: defaultSHRPLoaderStatus, - } -} - -func (il IdSigner) String() string { - return strings.TrimSpace(fmt.Sprintf(`Status %s`, il.Status)) -} diff --git a/x/utils/demo/denom.go b/x/utils/demo/denom.go new file mode 100644 index 00000000..f1bd65f7 --- /dev/null +++ b/x/utils/demo/denom.go @@ -0,0 +1,155 @@ +package denom + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "math" +) + +func CheckSupport(denom string) error { + if _, found := supportedDenoms[denom]; !found { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "%v is not supported", denom) + } + return nil +} + +func CheckFeeSupportedCoin(dCoin sdk.DecCoin) error { + if dCoin.Denom != ShrP { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "%v denomination is not supported. Only support %v", dCoin.Denom, ShrP) + } + return nil +} + +func CheckSupportedCoins(dCoins sdk.DecCoins, coins sdk.Coins) error { + for _, c := range dCoins { + if _, found := supportedDenoms[c.Denom]; !found { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "%v is not supported", c) + } + } + for _, c := range coins { + if _, found := supportedDenoms[c.Denom]; !found { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "%v is not supported", c) + } + } + return nil +} + +const ( + Base = "nshr" + Shr = "shr" + + ShrP = "shrp" + BaseUSD = "cent" +) + +var ( + USDExponent = int64(100) + ShrExponent = int64(math.Pow(10, 9)) + + OneShr = sdk.NewCoins(sdk.NewCoin(Base, sdk.NewInt(ShrExponent))) + OneUSD = sdk.NewCoins(sdk.NewCoin(ShrP, sdk.NewInt(1))) + OneHundredCents = sdk.NewCoins(sdk.NewCoin(BaseUSD, sdk.NewInt(100))) +) + +var supportedDenoms = map[string]struct{}{ + Base: {}, + BaseUSD: {}, + Shr: {}, + ShrP: {}, +} + +func getBaseDenomUnits(usdRate sdk.Dec) map[string]sdk.Dec { + return map[string]sdk.Dec{ + Base: sdk.NewDec(1), + Shr: sdk.NewDec(ShrExponent), + BaseUSD: usdRate.Mul(sdk.NewDec(ShrExponent)).Quo(sdk.NewDec(USDExponent)), + ShrP: usdRate.Mul(sdk.NewDec(ShrExponent)), + } +} + +func NormalizeToBaseCoins(dcoins sdk.DecCoins, roundUp bool) (sdk.Coins, error) { + if err := dcoins.Validate(); err != nil { + return nil, err + } + if err := CheckSupportedCoins(dcoins, nil); err != nil { + return nil, err + } + // there is no need to set usd rate, since we only need to convert BaseUSD and Base + base, err := NormalizeToBaseCoin(Base, sdk.NewDecCoins( + sdk.NewDecCoinFromDec(Shr, dcoins.AmountOf(Shr)), + sdk.NewDecCoinFromDec(Base, dcoins.AmountOf(Base))), sdk.NewDec(1), roundUp) + + if err != nil { + return nil, err + } + baseUSD, err := NormalizeToBaseCoin(BaseUSD, sdk.NewDecCoins( + sdk.NewDecCoinFromDec(ShrP, dcoins.AmountOf(ShrP)), + sdk.NewDecCoinFromDec(BaseUSD, dcoins.AmountOf(BaseUSD))), sdk.NewDec(1), roundUp) + if err != nil { + return nil, err + } + + return sdk.NewCoins( + base, baseUSD, + ), err +} + +func NormalizeToBaseCoin(baseName string, dcoins sdk.DecCoins, usdRate sdk.Dec, roundUp bool) (coin sdk.Coin, err error) { + baseDecCoins, err := To(dcoins, baseName, usdRate) + if err != nil { + return + } + coin = sdk.NewCoin(baseName, baseDecCoins.Amount.TruncateInt()) + if roundUp { + coin = sdk.NewCoin(baseName, baseDecCoins.Amount.Ceil().TruncateInt()) + } + return +} + +// ToDisplayCoins convert coins to display coins which are Shr and ShrP +func ToDisplayCoins(coins sdk.Coins) sdk.DecCoins { + shr := sdk.NewDecCoins( + sdk.NewDecCoin(Base, coins.AmountOf(Base)), + sdk.NewDecCoin(Shr, coins.AmountOf(Shr)), + ) + dShr, _ := To(shr, Shr, sdk.NewDec(1)) + + shrp := sdk.NewDecCoins( + sdk.NewDecCoin(BaseUSD, coins.AmountOf(BaseUSD)), + sdk.NewDecCoin(ShrP, coins.AmountOf(ShrP)), + ) + dShrP, _ := To(shrp, ShrP, sdk.NewDec(1)) + + return sdk.NewDecCoins(dShr, dShrP) +} + +func To(coins sdk.DecCoins, dest string, usdRate sdk.Dec) (coin sdk.DecCoin, err error) { + if err = coins.Validate(); err != nil { + return + } + if err = CheckSupport(dest); err != nil { + return + } + baseUnits := getBaseDenomUnits(usdRate) + if err != nil { + return + } + + destUnit, found := baseUnits[dest] + if !found { + err = sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "%v is not supporter", dest) + return + } + + vd := sdk.NewDec(0) + for _, c := range coins { + srcUnit, found := baseUnits[c.Denom] + if !found { + err = sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "%v is not supporter", c.Denom) + return + } + vd = vd.Add(c.Amount.Mul(srcUnit).Quo(destUnit)) + } + coin = sdk.NewDecCoinFromDec(dest, vd) + return +} diff --git a/x/utils/demo/denom_test.go b/x/utils/demo/denom_test.go new file mode 100644 index 00000000..e55319c3 --- /dev/null +++ b/x/utils/demo/denom_test.go @@ -0,0 +1,96 @@ +package denom + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "testing" +) + +func TestNormalizeCoins(t *testing.T) { + type testCase struct { + i sdk.DecCoins + ib string + ic bool + o sdk.Coin + d string + } + rate := sdk.NewDec(200) + tcs := []testCase{ + { + i: sdk.NewDecCoinsFromCoins(sdk.NewCoin(ShrP, sdk.NewInt(1)), sdk.NewCoin(BaseUSD, sdk.NewInt(99))), + ib: Base, + o: sdk.NewCoin(Base, sdk.NewInt(398*ShrExponent)), + d: "1.99 shrp -> 398*ShrExponent ushr", + }, + { + i: sdk.NewDecCoins(sdk.NewDecCoinFromDec(Shr, sdk.MustNewDecFromStr("2.99"))), + ib: Base, + o: sdk.NewCoin(Base, sdk.NewInt(2990000000)), + d: "2.99 shr -> 2.99 * ShrExponent ushr", + }, + { + i: sdk.NewDecCoins( + sdk.NewDecCoin(ShrP, sdk.NewInt(1)), + sdk.NewDecCoin(BaseUSD, sdk.NewInt(99)), + sdk.NewDecCoinFromDec(Shr, sdk.MustNewDecFromStr("2.99")), + ), + ib: Base, + o: sdk.NewCoin(Base, sdk.NewInt(400990000000)), + d: "1.99 shrp 2.99 shr -> (2.99 + 398) * ShrExponent ushr", + }, + { + i: sdk.NewDecCoins( + sdk.NewDecCoin(ShrP, sdk.NewInt(1)), + sdk.NewDecCoin(BaseUSD, sdk.NewInt(99)), + sdk.NewDecCoinFromDec(Shr, sdk.MustNewDecFromStr("2.99")), + ), + ib: BaseUSD, + o: sdk.NewCoin(BaseUSD, sdk.NewInt(200)), + d: "1.99 shrp 2.99 shr -> 200 cent (from 200.495) - round down by default", + }, + } + for _, tc := range tcs { + r, _ := NormalizeToBaseCoin(tc.ib, tc.i, rate, tc.ic) + require.Equal(t, tc.o, r, tc.d) + } +} + +func TestToDisplayCoins(t *testing.T) { + type testCase struct { + i sdk.Coins + o sdk.DecCoins + d string + } + tcs := []testCase{ + { + i: sdk.NewCoins(), + o: sdk.NewDecCoins(), + d: "0 -> 0", + }, + { + i: sdk.NewCoins(sdk.NewCoin(Shr, sdk.NewInt(1)), sdk.NewCoin(ShrP, sdk.NewInt(1))), + o: sdk.NewDecCoins(sdk.NewDecCoinFromDec(Shr, sdk.NewDec(1)), sdk.NewDecCoinFromDec(ShrP, sdk.NewDec(1))), + d: "1shr 1shrp -> 1shr 1shrp", + }, + { + i: sdk.NewCoins(sdk.NewCoin(Base, sdk.NewInt(10)), sdk.NewCoin(BaseUSD, sdk.NewInt(10))), + o: sdk.NewDecCoins(sdk.NewDecCoinFromDec(Shr, sdk.MustNewDecFromStr("0.00000001")), sdk.NewDecCoinFromDec(ShrP, sdk.MustNewDecFromStr("0.1"))), + d: "10base 1cent -> 0.00000001shr 0.01shrp", + }, + { + i: sdk.NewCoins(sdk.NewCoin(Base, sdk.NewInt(2100000010)), sdk.NewCoin(BaseUSD, sdk.NewInt(131))), + o: sdk.NewDecCoins(sdk.NewDecCoinFromDec(Shr, sdk.MustNewDecFromStr("2.10000001")), sdk.NewDecCoinFromDec(ShrP, sdk.MustNewDecFromStr("1.31"))), + d: "2100000010base 131cent -> 2.10000001shr 1.31shrp", + }, + { + i: sdk.NewCoins(sdk.NewCoin(Shr, sdk.NewInt(1)), sdk.NewCoin(Base, sdk.NewInt(2100000010)), sdk.NewCoin(ShrP, sdk.NewInt(2)), sdk.NewCoin(BaseUSD, sdk.NewInt(131))), + o: sdk.NewDecCoins(sdk.NewDecCoinFromDec(Shr, sdk.MustNewDecFromStr("3.10000001")), sdk.NewDecCoinFromDec(ShrP, sdk.MustNewDecFromStr("3.31"))), + d: "1shr 2100000010base 2shrp 131cent -> 3.10000001shr 3.31shrp", + }, + } + + for _, tc := range tcs { + r := ToDisplayCoins(tc.i) + require.Equal(t, tc.o, r, tc.d) + } +} diff --git a/x/utils/utils.go b/x/utils/utils.go new file mode 100644 index 00000000..967bb8a9 --- /dev/null +++ b/x/utils/utils.go @@ -0,0 +1,65 @@ +package utils + +import ( + "encoding/json" + "io/ioutil" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +const ( + FlagKeySeed = "key-seed" + KeySeedUsage = "path to key_seed.json" +) + +func GetKeySeedFromFile(seedPath string) (string, error) { + seeds, err := ioutil.ReadFile(seedPath) + if err != nil { + return "", err + } + var a map[string]string + if err := json.Unmarshal(seeds, &a); err != nil { + return "", err + } + return a["secret"], nil +} + +func GetAddressFromFile(filepath string) ([]string, error) { + data, err := ioutil.ReadFile(filepath) + if err != nil { + return nil, err + } + var addrList []string + json.Unmarshal(data, &addrList) + return addrList, nil +} + +func CreateContextWithKeyBase(seed string, clientCtx client.Context) (client.Context, error) { + kb := keyring.NewInMemory() + keyName := "elon_musk_deer" + info, err := kb.NewAccount(keyName, seed, "", sdk.GetConfig().Seal().GetFullBIP44Path(), hd.Secp256k1) + if err != nil { + return client.Context{}, err + } + + clientCtx = clientCtx.WithFrom(keyName).WithFromName(info.GetName()).WithFromAddress(info.GetAddress()).WithKeyring(kb) + + return clientCtx, nil +} + +func CreateContextFromSeed(seedFile string, clientCtx client.Context) (client.Context, error) { + seed, err := GetKeySeedFromFile(seedFile) + if err != nil { + return client.Context{}, err + } + + clientCtx, err = CreateContextWithKeyBase(seed, clientCtx) + if err != nil { + return client.Context{}, err + } + + return clientCtx, nil +}