Merge pull request #360 from CosmWasm/codegen-queries

Use autogenerated protobuf code for queries
This commit is contained in:
Simon Warta 2020-08-10 15:03:16 +02:00 committed by GitHub
commit 1469bfa8c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 18378 additions and 143 deletions

View File

@ -1,5 +1,7 @@
build/
dist/
docs/
# protobuf code generation
proto/
tmp/

View File

@ -8,7 +8,7 @@ DEFINITIONS_FILE="$TMP_DIR/codecimpl.d.ts"
OUTPUT_DIR="./src/generated/"
pbts "$JS_SOURCE_FILE" -o "$DEFINITIONS_FILE"
tsc --removeComments --outDir "$OUTPUT_DIR" --allowJs "$JS_SOURCE_FILE"
yarn pbts "$JS_SOURCE_FILE" -o "$DEFINITIONS_FILE"
yarn tsc --removeComments --outDir "$OUTPUT_DIR" --allowJs "$JS_SOURCE_FILE"
cp "$DEFINITIONS_FILE" "$OUTPUT_DIR"
rm "$DEFINITIONS_FILE" "$JS_SOURCE_FILE"

View File

@ -13,7 +13,7 @@ SUFFIX=${REF}
mkdir -p "$COSMOS_DIR"
wget -qO "$ZIP_FILE" "https://github.com/cosmos/cosmos-sdk/archive/$REF.zip" \
&& unzip "$ZIP_FILE" "*.proto" -d "$COSMOS_DIR" \
&& mv "$COSMOS_SDK_DIR-$SUFFIX" "$COSMOS_SDK_DIR" \
&& rm "$ZIP_FILE"
wget -qO "$ZIP_FILE" "https://github.com/cosmos/cosmos-sdk/archive/$REF.zip"
unzip "$ZIP_FILE" "*.proto" -d "$COSMOS_DIR"
mv "$COSMOS_SDK_DIR-$SUFFIX" "$COSMOS_SDK_DIR"
rm "$ZIP_FILE"

View File

@ -9,7 +9,7 @@ TENDERMINT_PROTO_DIR="$ROOT_PROTO_DIR/third_party/proto/tendermint"
GOOGLE_PROTO_DIR="$ROOT_PROTO_DIR/third_party/proto/google"
mkdir -p "$GENERATED_DIR"
pbjs \
yarn pbjs \
-t static-module \
--es6 \
-w commonjs \

View File

@ -1,3 +1,7 @@
build/
dist/
docs/
# protobuf code generation
proto/
tmp/

View File

@ -28,14 +28,19 @@
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"move-types": "shx rm -rf ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"build": "shx rm -rf ./build && tsc && shx mkdir -p build/generated && shx cp ./src/generated/*.js ./build/generated && shx mkdir -p ./build/types/generated && shx cp ./src/generated/*.d.ts ./build/types/generated && yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test-node": "node jasmine-testrunner.js",
"test-firefox": "yarn pack-web && karma start --single-run --browsers Firefox",
"test-chrome": "yarn pack-web && karma start --single-run --browsers ChromeHeadless",
"test": "yarn build-or-skip && yarn test-node",
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js",
"preget-proto": "rm -rf proto",
"get-proto": "REF=master ./scripts/get-proto.sh",
"predefine-proto": "./scripts/predefine-proto.sh",
"define-proto": "./scripts/define-proto.sh",
"postdefine-proto": "prettier --write \"src/generated/codecimpl.*\""
},
"dependencies": {
"@cosmjs/encoding": "^0.22.0",
@ -43,6 +48,7 @@
"@cosmjs/math": "^0.22.0",
"@cosmjs/proto-signing": "^0.22.0",
"@cosmjs/tendermint-rpc": "^0.22.0",
"@cosmjs/utils": "^0.22.0"
"@cosmjs/utils": "^0.22.0",
"protobufjs": "~6.10.0"
}
}

View File

@ -0,0 +1,14 @@
#!/bin/bash
set -o errexit -o nounset -o pipefail
command -v shellcheck > /dev/null && shellcheck "$0"
TMP_DIR="./tmp"
JS_SOURCE_FILE="$TMP_DIR/codecimpl.js"
DEFINITIONS_FILE="$TMP_DIR/codecimpl.d.ts"
OUTPUT_DIR="./src/generated/"
yarn pbts "$JS_SOURCE_FILE" -o "$DEFINITIONS_FILE"
yarn tsc --removeComments --outDir "$OUTPUT_DIR" --allowJs "$JS_SOURCE_FILE"
cp "$DEFINITIONS_FILE" "$OUTPUT_DIR"
rm "$DEFINITIONS_FILE" "$JS_SOURCE_FILE"

View File

@ -0,0 +1,19 @@
#!/bin/bash
set -o errexit -o nounset -o pipefail
command -v shellcheck > /dev/null && shellcheck "$0"
PROTO_DIR="./proto"
COSMOS_DIR="$PROTO_DIR/cosmos"
COSMOS_SDK_DIR="$COSMOS_DIR/cosmos-sdk"
ZIP_FILE="$COSMOS_DIR/tmp.zip"
REF=${REF:-"master"}
SUFFIX=${REF}
[[ $SUFFIX =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]] && SUFFIX=${SUFFIX#v}
mkdir -p "$COSMOS_DIR"
wget -qO "$ZIP_FILE" "https://github.com/cosmos/cosmos-sdk/archive/$REF.zip"
unzip "$ZIP_FILE" "*.proto" -d "$COSMOS_DIR"
mv "$COSMOS_SDK_DIR-$SUFFIX" "$COSMOS_SDK_DIR"
rm "$ZIP_FILE"

View File

@ -0,0 +1,32 @@
#!/bin/bash
set -o errexit -o nounset -o pipefail
command -v shellcheck > /dev/null && shellcheck "$0"
GENERATED_DIR="./tmp"
ROOT_PROTO_DIR="./proto/cosmos/cosmos-sdk"
COSMOS_PROTO_DIR="$ROOT_PROTO_DIR/proto/cosmos"
TENDERMINT_PROTO_DIR="$ROOT_PROTO_DIR/third_party/proto/tendermint"
GOOGLE_PROTO_DIR="$ROOT_PROTO_DIR/third_party/proto/google"
mkdir -p "$GENERATED_DIR"
yarn pbjs \
-t static-module \
--es6 \
-w commonjs \
-o "$GENERATED_DIR/codecimpl.js" \
--sparse \
--no-beautify \
--no-delimited \
--no-verify \
--no-convert \
"$COSMOS_PROTO_DIR/cosmos.proto" \
"$COSMOS_PROTO_DIR/auth/{auth,query}.proto" \
"$COSMOS_PROTO_DIR/bank/{bank,query}.proto" \
"$COSMOS_PROTO_DIR/crypto/crypto.proto" \
"$COSMOS_PROTO_DIR/query/pagination.proto" \
"$COSMOS_PROTO_DIR/tx/tx.proto" \
"$COSMOS_PROTO_DIR/tx/signing/signing.proto" \
"$TENDERMINT_PROTO_DIR/abci/types/types.proto" \
"$TENDERMINT_PROTO_DIR/crypto/merkle/merkle.proto" \
"$TENDERMINT_PROTO_DIR/libs/kv/types.proto" \
"$GOOGLE_PROTO_DIR/protobuf/any.proto"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +0,0 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { cosmosField } from "@cosmjs/proto-signing";
import { Message } from "protobufjs";
export class BaseAccount extends Message {
@cosmosField.bytes(1)
public readonly address?: Uint8Array;
@cosmosField.bytes(2)
public readonly pub_key?: Uint8Array;
@cosmosField.uint64(3)
public readonly account_number?: Long | number;
@cosmosField.uint64(4)
public readonly sequence?: Long | number;
}

View File

@ -1,23 +0,0 @@
import { Coin, cosmosField } from "@cosmjs/proto-signing";
import { Message } from "protobufjs";
import { PageRequest, PageResponse } from "./pagination";
// these grpc query types come from:
// https://github.com/cosmos/cosmos-sdk/blob/69bbb8b327c3cfb967d969bcadeb9b0aef144df6/proto/cosmos/bank/query.proto#L40-L55
export class QueryAllBalancesRequest extends Message {
@cosmosField.bytes(1)
public readonly address?: Uint8Array;
@cosmosField.message(2, PageRequest)
public readonly pagination?: PageRequest;
}
export class QueryAllBalancesResponse extends Message {
@cosmosField.repeatedMessage(1, Coin)
public readonly balances?: readonly Coin[];
@cosmosField.message(2, PageResponse)
public readonly pagination?: PageResponse;
}

View File

@ -1,18 +0,0 @@
import { cosmosField } from "@cosmjs/proto-signing";
import { Message } from "protobufjs";
export class PageRequest extends Message {
// TODO: implement
}
export class PageResponse extends Message {
// next_key is the key to be passed to PageRequest.key to
// query the next page most efficiently
@cosmosField.bytes(1)
public readonly nextKey?: Uint8Array;
// total is total number of results available if PageRequest.count_total
// was set, its value is undefined otherwise
@cosmosField.uint64(2)
public readonly total?: Long | number;
}

View File

@ -2,13 +2,12 @@
import { Bech32, toAscii, toHex } from "@cosmjs/encoding";
import { Coin } from "@cosmjs/launchpad";
import { Uint64 } from "@cosmjs/math";
import * as proto from "@cosmjs/proto-signing";
import { decodeAny } from "@cosmjs/proto-signing";
import { Client as TendermintClient } from "@cosmjs/tendermint-rpc";
import { arrayContentEquals, assertDefined } from "@cosmjs/utils";
import { arrayContentEquals, assert, assertDefined } from "@cosmjs/utils";
import Long from "long";
import { BaseAccount } from "./query/accounts";
import { QueryAllBalancesRequest, QueryAllBalancesResponse } from "./query/allbalances";
import { cosmos } from "./generated/codecimpl";
export interface GetSequenceResult {
readonly accountNumber: number;
@ -19,9 +18,11 @@ function uint64FromProto(input: number | Long): Uint64 {
return Uint64.fromString(input.toString());
}
function coinFromProto(input: proto.Coin): Coin {
function coinFromProto(input: cosmos.ICoin): Coin {
assertDefined(input.amount);
assertDefined(input.denom);
assert(input.amount !== null);
assert(input.denom !== null);
return {
amount: input.amount,
denom: input.denom,
@ -46,14 +47,12 @@ export class StargateClient {
const accountKey = Uint8Array.from([0x01, ...binAddress]);
const responseData = await this.queryVerified("acc", accountKey);
const { typeUrl, value } = proto.decodeAny(responseData);
const { typeUrl, value } = decodeAny(responseData);
switch (typeUrl) {
case "/cosmos.auth.BaseAccount": {
const { account_number, sequence } = BaseAccount.decode(value);
assertDefined(account_number);
assertDefined(sequence);
const { accountNumber, sequence } = cosmos.auth.BaseAccount.decode(value);
return {
accountNumber: uint64FromProto(account_number).toNumber(),
accountNumber: uint64FromProto(accountNumber).toNumber(),
sequence: uint64FromProto(sequence).toNumber(),
};
}
@ -73,10 +72,7 @@ export class StargateClient {
const bankKey = Uint8Array.from([...toAscii("balances"), ...binAddress, ...toAscii(searchDenom)]);
const responseData = await this.queryVerified("bank", bankKey);
const { amount, denom } = proto.Coin.decode(responseData);
assertDefined(amount);
assertDefined(denom);
const { amount, denom } = cosmos.Coin.decode(responseData);
if (denom === "") {
return null;
} else {
@ -95,10 +91,12 @@ export class StargateClient {
*/
public async getAllBalancesUnverified(address: string): Promise<readonly Coin[]> {
const path = "/cosmos.bank.Query/AllBalances";
const request = QueryAllBalancesRequest.encode({ address: Bech32.decode(address).data }).finish();
const request = cosmos.bank.QueryAllBalancesRequest.encode({
address: Bech32.decode(address).data,
}).finish();
const responseData = await this.queryUnverified(path, request);
const response = QueryAllBalancesResponse.decode(responseData);
return (response.balances || []).map(coinFromProto);
const response = cosmos.bank.QueryAllBalancesResponse.decode(responseData);
return response.balances.map(coinFromProto);
}
public disconnect(): void {

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
/// <reference types="long" />
import { Message } from "protobufjs";
export declare class BaseAccount extends Message {
readonly address?: Uint8Array;
readonly pub_key?: Uint8Array;
readonly account_number?: Long | number;
readonly sequence?: Long | number;
}

View File

@ -1,11 +0,0 @@
import { Coin } from "@cosmjs/proto-signing";
import { Message } from "protobufjs";
import { PageRequest, PageResponse } from "./pagination";
export declare class QueryAllBalancesRequest extends Message {
readonly address?: Uint8Array;
readonly pagination?: PageRequest;
}
export declare class QueryAllBalancesResponse extends Message {
readonly balances?: readonly Coin[];
readonly pagination?: PageResponse;
}

View File

@ -1,7 +0,0 @@
/// <reference types="long" />
import { Message } from "protobufjs";
export declare class PageRequest extends Message {}
export declare class PageResponse extends Message {
readonly nextKey?: Uint8Array;
readonly total?: Long | number;
}

View File

@ -1,4 +1,4 @@
# Choose from https://hub.docker.com/r/interchainio/simapp/tags
REPOSITORY="interchainio/simapp"
VERSION="nightly-2020-08-06"
VERSION="nightly-2020-08-10"
CONTAINER_NAME="simapp"

View File

@ -0,0 +1 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0xMCAwNDozNDo1My44NTQ3MDIxICswMDAwIFVUQyBtPSswLjI5MDI1MTAwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IkhvMjN3ckNGOVpfcHlCUDUifQ.Z5qsfCNObumg_vwCiJ2D9Bvdod0bbanl8KDx9Af85MkSRsxI7mNFww.kzxxnpnP-PwmHl_F.ZSjnQ-fX3PsGxnGaqnVDADzbaQbHOU7xj-EYlImsaJ8w1CijR6UuJCARmeQldWz0xFHi9qfJ08GLfN0E-Zho6nhM_-UKE5D1dyk_vqfvcVusPLte-1z2yuxyrMBHS_E2s1qehmbwjE2m3qohrDsid73Ixgb27La2iTVDL40N9C4iOV3uv0L5YI-TOBT35dhFqpYwavXR6mbE9k-sFyU-J45Y6jpNfIWlhfpVb220RFiKv6FEGVDRrMgt.BgboYLH4EliMSzGWFozUmg

View File

@ -6,7 +6,7 @@
{
"type": "cosmos-sdk/BaseAccount",
"value": {
"address": "cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8"
"address": "cosmos12gm9sa666hywxu9nzzmp7hyl7a55hvg769w2kz"
}
},
{
@ -174,6 +174,19 @@
}
]
},
{
"address": "cosmos12gm9sa666hywxu9nzzmp7hyl7a55hvg769w2kz",
"coins": [
{
"amount": "1000000000",
"denom": "ucosm"
},
{
"amount": "10000000",
"denom": "ustake"
}
]
},
{
"address": "cosmos1vkv9sfwaak76weyamqx0flmng2vuquxqcuqukh",
"coins": [
@ -342,19 +355,6 @@
"denom": "ustake"
}
]
},
{
"address": "cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8",
"coins": [
{
"amount": "1000000000",
"denom": "ucosm"
},
{
"amount": "10000000",
"denom": "ustake"
}
]
}
],
"denom_metadata": null,
@ -407,13 +407,13 @@
}
},
"public_key": {
"secp256k1": "A7bPBNzzcLkg9D6sSUIpq6qOhtWTKnJELef/5yZfr4xH"
"secp256k1": "AnFadRAdh6Fl7robHe8jywDMKSWQQjB7SlpoqGsX9Ghw"
}
}
]
},
"body": {
"memo": "d593cd9e2f88b70d57ffc8c28768b555b9acb5fc@172.17.0.3:26656",
"memo": "b02715f69ce88507acaa543f7de0d3f7e6cd20f8@172.17.0.2:26656",
"messages": [
{
"@type": "/cosmos.staking.MsgCreateValidator",
@ -422,13 +422,13 @@
"max_rate": "0.200000000000000000",
"rate": "0.100000000000000000"
},
"delegator_address": "cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8",
"delegator_address": "cosmos12gm9sa666hywxu9nzzmp7hyl7a55hvg769w2kz",
"description": {
"moniker": "simd-moniker"
},
"min_self_delegation": "1",
"pubkey": "cosmosvalconspub1zcjduepqv3sruyer5xmurpxyptu4ll3efjan3lmaajf3fxg9axe895ppj9kqtyk2vf",
"validator_address": "cosmosvaloper1lv5lq7qjr42attsdma622whwa7v0rc2ds4afn5",
"pubkey": "cosmosvalconspub1zcjduepqcf6dt4wct4uk93lu0nc4vp8x8le8tqfe3wcmys53jn6lfa3fqvwsqktz95",
"validator_address": "cosmosvaloper12gm9sa666hywxu9nzzmp7hyl7a55hvg7l36l63",
"value": {
"amount": "3000000",
"denom": "ustake"
@ -437,7 +437,7 @@
]
},
"signatures": [
"5gBipu7M14zMjn2t6pBxM+DprcDR44RW4Eylc1wVp4Ikem0duRVnvWDE+B0gZ9+LY0QrgPcEmm6aXzPGiN3SKQ=="
"VdidVRYryEAL1v3bMIyHpwswMVSPJncCoC+7+VJdKwR5e8ymOeY+qG7q0QVcWj2x1Z72fw5O5w58anw9msnmzg=="
]
}
]
@ -476,8 +476,7 @@
},
"client_genesis": {
"clients": [],
"clients_consensus": [],
"create_localhost": true
"clients_consensus": []
},
"connection_genesis": {
"client_connection_paths": [],
@ -547,5 +546,5 @@
]
}
},
"genesis_time": "2020-08-06T13:08:49.5288713Z"
"genesis_time": "2020-08-10T04:34:53.3772058Z"
}

View File

@ -0,0 +1 @@
{"body":{"messages":[{"@type":"/cosmos.staking.MsgCreateValidator","description":{"moniker":"simd-moniker"},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos12gm9sa666hywxu9nzzmp7hyl7a55hvg769w2kz","validator_address":"cosmosvaloper12gm9sa666hywxu9nzzmp7hyl7a55hvg7l36l63","pubkey":"cosmosvalconspub1zcjduepqcf6dt4wct4uk93lu0nc4vp8x8le8tqfe3wcmys53jn6lfa3fqvwsqktz95","value":{"denom":"ustake","amount":"3000000"}}],"memo":"b02715f69ce88507acaa543f7de0d3f7e6cd20f8@172.17.0.2:26656"},"auth_info":{"signer_infos":[{"public_key":{"secp256k1":"AnFadRAdh6Fl7robHe8jywDMKSWQQjB7SlpoqGsX9Ghw"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}}}],"fee":{"gas_limit":"200000"}},"signatures":["VdidVRYryEAL1v3bMIyHpwswMVSPJncCoC+7+VJdKwR5e8ymOeY+qG7q0QVcWj2x1Z72fw5O5w58anw9msnmzg=="]}

View File

@ -1 +0,0 @@
{"body":{"messages":[{"@type":"/cosmos.staking.MsgCreateValidator","description":{"moniker":"simd-moniker"},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8","validator_address":"cosmosvaloper1lv5lq7qjr42attsdma622whwa7v0rc2ds4afn5","pubkey":"cosmosvalconspub1zcjduepqv3sruyer5xmurpxyptu4ll3efjan3lmaajf3fxg9axe895ppj9kqtyk2vf","value":{"denom":"ustake","amount":"3000000"}}],"memo":"d593cd9e2f88b70d57ffc8c28768b555b9acb5fc@172.17.0.3:26656"},"auth_info":{"signer_infos":[{"public_key":{"secp256k1":"A7bPBNzzcLkg9D6sSUIpq6qOhtWTKnJELef/5yZfr4xH"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}}}],"fee":{"gas_limit":"200000"}},"signatures":["5gBipu7M14zMjn2t6pBxM+DprcDR44RW4Eylc1wVp4Ikem0duRVnvWDE+B0gZ9+LY0QrgPcEmm6aXzPGiN3SKQ=="]}

View File

@ -1 +1 @@
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"GibkBGABoqDhct1gyZLYgUQ3q9afc7jSzBEZKYV3/Rql7r3LMmDVuXZgwdeDitunnWIm6KTJ9/yrdIbOnxGryg=="}}
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"SBwYIjYkPgEdajIt1al+FUZOQ+vMri9xPkES1pDlVISVMV3aGAIFv9hQA0EDCe6NDWJopE6TCmnI+Pca65YSCw=="}}

View File

@ -1,11 +1,11 @@
{
"address": "774A0C3FA22BFB35E7A62C33A1C58697CADE1427",
"address": "9B393572E82025BE3A6D2007304AAE69B55D62DC",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "ZGA+EyOht8GExAr5X/45TLs4/33skxSZBemyctAhkWw="
"value": "wnTV1dhdeWLH/HzxVgTmP/J1gTmLsbJCkZT19PYpAx0="
},
"priv_key": {
"type": "tendermint/PrivKeyEd25519",
"value": "4rVHumai2XQZ+hSsUphYlJNkcjQCTguaZ2e7LPXNoCZkYD4TI6G3wYTECvlf/jlMuzj/feyTFJkF6bJy0CGRbA=="
"value": "fPWqUiCrr+AlyHb29zpYglZ/9RLbz60fRQziZgVA+JjCdNXV2F15Ysf8fPFWBOY/8nWBOYuxskKRlPX09ikDHQ=="
}
}

View File

@ -1 +0,0 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0wNiAxMzowODo1MC40MzYzMjQ2ICswMDAwIFVUQyBtPSswLjUzMzMxNTYwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjlYak9JRDJHMkZMM2VXcDkifQ.ZVjb1WogjVvyIXk5IkrZclppwwc0MExREIrkRFqxkjyE4k0V68APMQ.NJdR86VIEOZ0cVLL.7PukY7zG6I0gDzhjvkY8QbQfofLAVJEcVFjRkxodcrxH4UNiCkURbklOuyOgcKEJcY12TYSBXUjoWUMy15i0_O4uMhWwx_xVWgaTRyjBB6UVC6fchYpwHiYnJStrMTsTTIEd_PMg01M2G8IR4QyhJtDju9W3AEbnnBdKktDuseAe0hyr7BwJHFXm9CU-sXU3JzFQ62szLpu-CaUBV_7xJusFjwDosfyom4r-keH3Y7CmPqF_-W3VY8DU.HMvilHIyoRuJGKvKNsfX3A

View File

@ -1 +1 @@
$2a$10$.3rbMOvLm5FQrKE5eNnNB.GC6N8/klYIQpJjLIl2K6DsBkGPkytWe
$2a$10$2fI6FM3ObOD8pRF2.xRn8Op8SAzWw0PvhQZNwwDzzdf9mgmy1DFP.

View File

@ -1 +1 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0wNiAxMzowODo1MC40MTQ5MTA1ICswMDAwIFVUQyBtPSswLjUxMTkwMjAwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IkxiNS1RblpLdlFBaDVmUHEifQ.shxbGlGbejxdwAuUWE729l71nOLUtBqnE-1nDqc3bf-qzZ-ZvFP6rg.B-M7fYzRF9A91x4q.XWjXdGvP-CsRxFwrolUdq6bY5cz2i5lqSggCPdUyYuXn6WVglEEdsxbyl_Et7fZ8ppAgFsWaj19ELxYr4ewwvA4r2TReShcDk51jz8tFLTO6aCOh2F6rjn-fi5DUfcimfsipzu-x-FvCSKpQ3XB6PlwfJ5lLkoSoeqX_WJS6Zq0v7VI9D_WvSD5Q6FX1LnhrchndlZ33sBVwCjsp0GbEAOeDaYnnRexfh05k90_jc7DXHdKNI3o8a8q5pQR3CfnkHpIVlRairnrt68GEWMrCT-DhILGUP7KVJsYIadfODU_rOUqkJaAmlAMHPoWOncWaaCnk2hASwfbG8yNyREJ9UxdaXhih8ZwT1IWSTp2NkHcb1uZf.aXzyufH2vuWPQms3wVMuug
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0xMCAwNDozNDo1My44NDIzNDE2ICswMDAwIFVUQyBtPSswLjI3Nzg5MTQwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IkxGbnlSVzBhbGNWaVQ4U0wifQ.AapFS3IPSX9Bt9Vz-wFg5mfoRobwImw8NcC0HJfBBLV1lm_56_b9qw.u2l6d7qrmOBEXyD8.aaGsuy_GMH_pyqkMcK80nxBZsIOyMJLTlR4slViy9q0T0qo2mtJFNUwtOoaN6wxewNYBdOJDJQ3GDtUtNZW6s9EoBigrsUxP-gTaBMtARx5u4Hn_VDCidxZJbgmoneX_P5K71vV8lVJ9sKhqZyDeKcwUrKB7EztKlxGDYt04NmsbLJkK8CNYnj3dYL5sCCz46B09eNSx83_rIpyE141WEzgwgOEayu5Nz2V7lFGp2WZfdeeqslyqKNwHMiQJGdzLjc787fgMPqleYusmBKHfNveUa2eaNIexnLGmkHkao9YH4-nJIpGOSBIGQZeG1dcUckFvaesq64gKZRmOKp37vfJkyqmuP7STVgeko93YvwcVlU6r.TfQIMmIaSUx-eddwt9zahg