35748e07c4
* Starting a refactor to cut the huge files into chunks * Fixing some lints * ibid * Mixnode and gateway bonding tests moved * All transaction test moved into submodules * Finished splitting out transactions.rs from root into submodules. * Moved mixnet params state into submodule * Recombined modules for few top-level actions * Moving mixnode bonding queries into their own file * Removed some unused imports * Got tests running again. Max limit tests not right. * Fixed tests * Started moving delegation queries into own module * Finished moving delegation queries into their own module * Cleanup * Moving query limits into relevant modules * Putting query limits back at top-level * Using prefix to make storage usage a little more explicit * Separating storage into smaller chunks * More storage refactoring * Finished moving all storage into modules * Moved all storage prefixes into relevant modules and made them not-public * Renamed the mostly-empty queries module to query_support * ibid * Fixed query support rename problems * Started to move rewards-related helpers into their own module * Started moving delegations-related helpers into their own module * Moved more code from global helpers into delegations helpers * Moved all remaining test helper code from main helpers file into test helpers * Made use of test_helpers explicit via a module rename. Also got rid of non-explicit usages * Moved mixnode storage retrieval limits into mixnodes storage module * Moved bond retrieval max limit into storage moduel * Moved more storage limits into mixnodes storage file; fixed a gateways limit test. * Added a note on gateways limits constants I'll re-use the mixnodes values, but it doesn't have to be this way. We could easily make a specific constant for gateways instaed. * Renamed "state" to GlobalContractParams * Pulled bit of test helper code up a level * Small cleanup of zero spacing in constants * Made a local helper method private * Renaming GlobalContractParams to ContractSettings and StateParams to ContractSettingsParams * ibid * Renamed contract settings storage methods from "config" (which is a bit vage to "contract_settings" * Indulging a fullword as a personal protest vs the Go programming language * Renaming mixnet settings to mixnet contract settings * Making validate_mixnode_bond private and moving it downwards in the file * Moving gateway bond validation to the bottom of the tests file * Getting the wallet compiling again. * Updated TypeScript client with new types and contract method names * Updating rust validator client with new contract method names and types * Fixed type error in mixnet-contract shared msg. * Used new contract method names and types * Fixed warnings in non-test code * All tests compiling But not passing yet * Fixed test compilation warnings * Fixed tests * Test-locked Delegations struct Co-authored-by: dave <dave@nym-mbp.lan> Co-authored-by: Jędrzej Stuczyński <jedrzej.stuczynski@gmail.com>
148 lines
6.4 KiB
TypeScript
148 lines
6.4 KiB
TypeScript
import { Coin } from "@cosmjs/stargate";
|
|
import { CosmWasmClient } from "@cosmjs/cosmwasm-stargate";
|
|
import {
|
|
Delegation,
|
|
GatewayOwnershipResponse,
|
|
MixOwnershipResponse, PagedGatewayDelegationsResponse,
|
|
PagedGatewayResponse, PagedMixDelegationsResponse,
|
|
PagedMixnodeResponse,
|
|
ContractSettingsParams
|
|
} from "./types";
|
|
|
|
export interface IQueryClient {
|
|
getBalance(address: string, stakeDenom: string): Promise<Coin | null>;
|
|
|
|
getMixNodes(contractAddress: string, limit: number, start_after?: string): Promise<PagedMixnodeResponse>;
|
|
|
|
getGateways(contractAddress: string, limit: number, start_after?: string): Promise<PagedGatewayResponse>;
|
|
|
|
getMixDelegations(contractAddress: string, mixIdentity: string, limit: number, start_after?: string): Promise<PagedMixDelegationsResponse>
|
|
|
|
getMixDelegation(contractAddress: string, mixIdentity: string, delegatorAddress: string): Promise<Delegation>
|
|
|
|
getGatewayDelegations(contractAddress: string, gatewayIdentity: string, limit: number, start_after?: string): Promise<PagedGatewayDelegationsResponse>
|
|
|
|
getGatewayDelegation(contractAddress: string, gatewayIdentity: string, delegatorAddress: string): Promise<Delegation>
|
|
|
|
ownsMixNode(contractAddress: string, address: string): Promise<MixOwnershipResponse>;
|
|
|
|
ownsGateway(contractAddress: string, address: string): Promise<GatewayOwnershipResponse>;
|
|
|
|
getStateParams(contractAddress: string): Promise<ContractSettingsParams>;
|
|
|
|
changeValidator(newUrl: string): Promise<void>
|
|
}
|
|
|
|
/**
|
|
* Takes care of network communication between this code and the validator.
|
|
* Depends on `SigningCosmWasClient`, which signs all requests using keypairs
|
|
* derived from on bech32 mnemonics.
|
|
*
|
|
* Wraps several methods from CosmWasmSigningClient so we can mock them for
|
|
* unit testing.
|
|
*/
|
|
export default class QueryClient implements IQueryClient {
|
|
private cosmClient: CosmWasmClient;
|
|
|
|
private constructor(cosmClient: CosmWasmClient) {
|
|
this.cosmClient = cosmClient;
|
|
}
|
|
|
|
public static async connect(url: string): Promise<IQueryClient> {
|
|
const client = await CosmWasmClient.connect(url)
|
|
return new QueryClient(client)
|
|
}
|
|
|
|
async changeValidator(url: string): Promise<void> {
|
|
this.cosmClient = await CosmWasmClient.connect(url)
|
|
}
|
|
|
|
public getMixNodes(contractAddress: string, limit: number, start_after?: string): Promise<PagedMixnodeResponse> {
|
|
if (start_after == undefined) { // TODO: check if we can take this out, I'm not sure what will happen if we send an "undefined" so I'm playing it safe here.
|
|
return this.cosmClient.queryContractSmart(contractAddress, { get_mix_nodes: { limit } });
|
|
} else {
|
|
return this.cosmClient.queryContractSmart(contractAddress, { get_mix_nodes: { limit, start_after } });
|
|
}
|
|
}
|
|
|
|
public getGateways(contractAddress: string, limit: number, start_after?: string): Promise<PagedGatewayResponse> {
|
|
if (start_after == undefined) { // TODO: check if we can take this out, I'm not sure what will happen if we send an "undefined" so I'm playing it safe here.
|
|
return this.cosmClient.queryContractSmart(contractAddress, { get_gateways: { limit } });
|
|
} else {
|
|
return this.cosmClient.queryContractSmart(contractAddress, { get_gateways: { limit, start_after } });
|
|
}
|
|
}
|
|
|
|
public getMixDelegations(contractAddress: string, mixIdentity: string, limit: number, start_after?: string): Promise<PagedMixDelegationsResponse> {
|
|
if (start_after == undefined) { // TODO: check if we can take this out, I'm not sure what will happen if we send an "undefined" so I'm playing it safe here.
|
|
return this.cosmClient.queryContractSmart(contractAddress, {
|
|
get_mix_delegations: {
|
|
mix_identity: mixIdentity,
|
|
limit
|
|
}
|
|
});
|
|
} else {
|
|
return this.cosmClient.queryContractSmart(contractAddress, {
|
|
get_mix_delegations: {
|
|
mix_identity: mixIdentity,
|
|
limit,
|
|
start_after
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
public getMixDelegation(contractAddress: string, mixIdentity: string, delegatorAddress: string): Promise<Delegation> {
|
|
return this.cosmClient.queryContractSmart(contractAddress, {
|
|
get_mix_delegation: {
|
|
mix_identity: mixIdentity,
|
|
address: delegatorAddress
|
|
}
|
|
});
|
|
}
|
|
|
|
public getGatewayDelegations(contractAddress: string, gatewayIdentity: string, limit: number, start_after?: string): Promise<PagedGatewayDelegationsResponse> {
|
|
if (start_after == undefined) { // TODO: check if we can take this out, I'm not sure what will happen if we send an "undefined" so I'm playing it safe here.
|
|
return this.cosmClient.queryContractSmart(contractAddress, {
|
|
get_gateway_delegations: {
|
|
gateway_identity: gatewayIdentity,
|
|
limit
|
|
}
|
|
});
|
|
} else {
|
|
return this.cosmClient.queryContractSmart(contractAddress, {
|
|
get_gateway_delegations: {
|
|
gateway_identity: gatewayIdentity,
|
|
limit,
|
|
start_after
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
public getGatewayDelegation(contractAddress: string, gatewayIdentity: string, delegatorAddress: string): Promise<Delegation> {
|
|
return this.cosmClient.queryContractSmart(contractAddress, {
|
|
get_gateway_delegation: {
|
|
gateway_identity: gatewayIdentity,
|
|
address: delegatorAddress
|
|
}
|
|
});
|
|
}
|
|
|
|
public ownsMixNode(contractAddress: string, address: string): Promise<MixOwnershipResponse> {
|
|
return this.cosmClient.queryContractSmart(contractAddress, { owns_mixnode: { address } });
|
|
}
|
|
|
|
public ownsGateway(contractAddress: string, address: string): Promise<GatewayOwnershipResponse> {
|
|
return this.cosmClient.queryContractSmart(contractAddress, { owns_gateway: { address } });
|
|
}
|
|
|
|
public getBalance(address: string, stakeDenom: string): Promise<Coin | null> {
|
|
return this.cosmClient.getBalance(address, stakeDenom);
|
|
}
|
|
|
|
public getStateParams(contractAddress: string): Promise<ContractSettingsParams> {
|
|
return this.cosmClient.queryContractSmart(contractAddress, { contract_settings_params: {} });
|
|
}
|
|
}
|