@manifest-network/manifest-mcp-browser 0.1.0 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish.yml +4 -2
- package/CLAUDE.md +9 -3
- package/README.md +6 -1
- package/dist/client.d.ts +13 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +105 -9
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +52 -7
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +128 -0
- package/dist/config.test.js.map +1 -1
- package/dist/cosmos.d.ts.map +1 -1
- package/dist/cosmos.js +11 -57
- package/dist/cosmos.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -25
- package/dist/index.js.map +1 -1
- package/dist/modules.d.ts +30 -1
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +67 -3
- package/dist/modules.js.map +1 -1
- package/dist/modules.test.js +58 -1
- package/dist/modules.test.js.map +1 -1
- package/dist/queries/auth.d.ts +7 -1
- package/dist/queries/auth.d.ts.map +1 -1
- package/dist/queries/auth.js +18 -45
- package/dist/queries/auth.js.map +1 -1
- package/dist/queries/bank.d.ts +7 -1
- package/dist/queries/bank.d.ts.map +1 -1
- package/dist/queries/bank.js +24 -38
- package/dist/queries/bank.js.map +1 -1
- package/dist/queries/billing.d.ts +7 -1
- package/dist/queries/billing.d.ts.map +1 -1
- package/dist/queries/billing.js +28 -54
- package/dist/queries/billing.js.map +1 -1
- package/dist/queries/distribution.d.ts +7 -1
- package/dist/queries/distribution.d.ts.map +1 -1
- package/dist/queries/distribution.js +18 -36
- package/dist/queries/distribution.js.map +1 -1
- package/dist/queries/gov.d.ts +7 -1
- package/dist/queries/gov.d.ts.map +1 -1
- package/dist/queries/gov.js +24 -41
- package/dist/queries/gov.js.map +1 -1
- package/dist/queries/index.d.ts +2 -1
- package/dist/queries/index.d.ts.map +1 -1
- package/dist/queries/index.js +1 -1
- package/dist/queries/index.js.map +1 -1
- package/dist/queries/staking.d.ts +7 -1
- package/dist/queries/staking.d.ts.map +1 -1
- package/dist/queries/staking.js +36 -59
- package/dist/queries/staking.js.map +1 -1
- package/dist/queries/utils.d.ts +42 -10
- package/dist/queries/utils.d.ts.map +1 -1
- package/dist/queries/utils.js +64 -12
- package/dist/queries/utils.js.map +1 -1
- package/dist/queries/utils.test.js +68 -8
- package/dist/queries/utils.test.js.map +1 -1
- package/dist/transactions/bank.d.ts +2 -2
- package/dist/transactions/bank.d.ts.map +1 -1
- package/dist/transactions/bank.js +9 -18
- package/dist/transactions/bank.js.map +1 -1
- package/dist/transactions/billing.d.ts +2 -2
- package/dist/transactions/billing.d.ts.map +1 -1
- package/dist/transactions/billing.js +52 -34
- package/dist/transactions/billing.js.map +1 -1
- package/dist/transactions/distribution.d.ts +2 -2
- package/dist/transactions/distribution.d.ts.map +1 -1
- package/dist/transactions/distribution.js +7 -13
- package/dist/transactions/distribution.js.map +1 -1
- package/dist/transactions/gov.d.ts +2 -2
- package/dist/transactions/gov.d.ts.map +1 -1
- package/dist/transactions/gov.js +32 -17
- package/dist/transactions/gov.js.map +1 -1
- package/dist/transactions/index.d.ts +1 -1
- package/dist/transactions/index.d.ts.map +1 -1
- package/dist/transactions/index.js +1 -1
- package/dist/transactions/index.js.map +1 -1
- package/dist/transactions/manifest.d.ts +2 -2
- package/dist/transactions/manifest.d.ts.map +1 -1
- package/dist/transactions/manifest.js +7 -14
- package/dist/transactions/manifest.js.map +1 -1
- package/dist/transactions/staking.d.ts +2 -2
- package/dist/transactions/staking.d.ts.map +1 -1
- package/dist/transactions/staking.js +7 -13
- package/dist/transactions/staking.js.map +1 -1
- package/dist/transactions/utils.d.ts +63 -1
- package/dist/transactions/utils.d.ts.map +1 -1
- package/dist/transactions/utils.js +121 -2
- package/dist/transactions/utils.js.map +1 -1
- package/dist/transactions/utils.test.js +351 -1
- package/dist/transactions/utils.test.js.map +1 -1
- package/dist/types.d.ts +212 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/wallet/mnemonic.d.ts +1 -0
- package/dist/wallet/mnemonic.d.ts.map +1 -1
- package/dist/wallet/mnemonic.js +34 -13
- package/dist/wallet/mnemonic.js.map +1 -1
- package/package.json +11 -6
- package/src/client.ts +119 -9
- package/src/config.test.ts +156 -0
- package/src/config.ts +59 -7
- package/src/cosmos.ts +19 -109
- package/src/index.ts +17 -23
- package/src/modules.test.ts +60 -0
- package/src/modules.ts +124 -7
- package/src/queries/auth.ts +35 -74
- package/src/queries/bank.ts +40 -58
- package/src/queries/billing.ts +46 -86
- package/src/queries/distribution.ts +35 -59
- package/src/queries/gov.ts +40 -64
- package/src/queries/index.ts +10 -1
- package/src/queries/staking.ts +55 -91
- package/src/queries/utils.test.ts +103 -8
- package/src/queries/utils.ts +92 -12
- package/src/transactions/bank.ts +9 -33
- package/src/transactions/billing.ts +64 -59
- package/src/transactions/distribution.ts +7 -29
- package/src/transactions/gov.ts +40 -34
- package/src/transactions/index.ts +1 -1
- package/src/transactions/manifest.ts +7 -29
- package/src/transactions/staking.ts +7 -29
- package/src/transactions/utils.test.ts +390 -1
- package/src/transactions/utils.ts +191 -2
- package/src/types.ts +328 -9
- package/src/wallet/mnemonic.ts +41 -17
- package/.claude/settings.local.json +0 -17
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js.map +0 -1
- package/dist/queries/manifest.d.ts +0 -10
- package/dist/queries/manifest.d.ts.map +0 -1
- package/dist/queries/manifest.js +0 -14
- package/dist/queries/manifest.js.map +0 -1
- package/dist/wallet/keplr.d.ts.map +0 -1
- package/dist/wallet/keplr.js.map +0 -1
|
@@ -22,9 +22,11 @@ jobs:
|
|
|
22
22
|
uses: actions/setup-node@v4
|
|
23
23
|
with:
|
|
24
24
|
node-version: 20
|
|
25
|
-
registry-url: 'https://registry.npmjs.org'
|
|
26
25
|
cache: 'npm'
|
|
27
26
|
|
|
27
|
+
- name: Upgrade npm for OIDC trusted publishing
|
|
28
|
+
run: npm install -g npm@latest && npm --version
|
|
29
|
+
|
|
28
30
|
- name: Install dependencies
|
|
29
31
|
run: npm ci
|
|
30
32
|
|
|
@@ -48,4 +50,4 @@ jobs:
|
|
|
48
50
|
echo "Version verified: $PACKAGE_VERSION"
|
|
49
51
|
|
|
50
52
|
- name: Publish to npm
|
|
51
|
-
run: npm publish --access public
|
|
53
|
+
run: npm publish --access public --provenance
|
package/CLAUDE.md
CHANGED
|
@@ -45,19 +45,23 @@ npm run test:watch # Run tests in watch mode
|
|
|
45
45
|
**queries/** - Module-specific query handlers
|
|
46
46
|
- Each file exports `route{Module}Query()` function
|
|
47
47
|
- Uses manifestjs RPC query client (`liftedinit.ClientFactory.createRPCQueryClient`)
|
|
48
|
-
- Shared utilities in `utils.ts`: `parseBigInt()`, `
|
|
49
|
-
- All paginated queries
|
|
48
|
+
- Shared utilities in `utils.ts`: `parseBigInt()`, `parseInteger()`, `createPagination()`, `extractPaginationArgs()`
|
|
49
|
+
- All paginated queries support `--limit` flag (default: 100, max: 1000)
|
|
50
50
|
|
|
51
51
|
**transactions/** - Module-specific transaction handlers
|
|
52
52
|
- Each file exports `route{Module}Transaction()` function
|
|
53
53
|
- Uses CosmJS `SigningStargateClient` with Manifest registries
|
|
54
54
|
- Uses manifestjs enums (e.g., `VoteOption` from `cosmos.gov.v1`)
|
|
55
55
|
- Shared utilities in `utils.ts`:
|
|
56
|
+
- `requireArgs()` - Validate required argument count with helpful error messages
|
|
56
57
|
- `parseAmount()` - Parse amount strings with helpful error hints
|
|
57
58
|
- `parseBigIntWithCode()` - Base implementation used by both queries and transactions
|
|
59
|
+
- `parseHexBytes()` - Parse and validate hex strings to Uint8Array (browser-compatible via `@cosmjs/encoding`)
|
|
60
|
+
- `bytesToHex()` - Convert Uint8Array to hex string (browser-compatible via `@cosmjs/encoding`)
|
|
58
61
|
- `validateAddress()` - Bech32 validation using `@cosmjs/encoding`
|
|
59
62
|
- `validateMemo()` - Enforce 256 char limit (Cosmos SDK default)
|
|
60
63
|
- `validateArgsLength()` - Enforce 100 args max to prevent DoS
|
|
64
|
+
- `extractFlag()` - Extract `--flag value` pairs from args
|
|
61
65
|
- `buildTxResult()` - Build transaction result objects
|
|
62
66
|
|
|
63
67
|
**modules.ts** - Static registry of all supported modules and subcommands (no dynamic CLI discovery)
|
|
@@ -72,7 +76,7 @@ Transaction: bank, staking, distribution, gov, billing, manifest
|
|
|
72
76
|
- `@manifest-network/manifestjs` - Protobuf types, registries, RPC client factory, and enums (e.g., `VoteOption`)
|
|
73
77
|
- `@modelcontextprotocol/sdk` - MCP server implementation
|
|
74
78
|
- `@cosmjs/stargate` - Signing client, gas price parsing
|
|
75
|
-
- `@cosmjs/encoding` - Bech32 address validation (`fromBech32`)
|
|
79
|
+
- `@cosmjs/encoding` - Bech32 address validation (`fromBech32`), hex conversion (`fromHex`, `toHex`)
|
|
76
80
|
- `@cosmjs/proto-signing` - Wallet and signer interfaces
|
|
77
81
|
|
|
78
82
|
### Security Features
|
|
@@ -84,8 +88,10 @@ Transaction: bank, staking, distribution, gov, billing, manifest
|
|
|
84
88
|
- Args array length limit (100 max)
|
|
85
89
|
- BigInt empty string rejection (prevents silent 0n)
|
|
86
90
|
- Hex string validation for address-bytes queries
|
|
91
|
+
- HTTPS enforcement for RPC URLs (HTTP only allowed for localhost/127.0.0.1/::1)
|
|
87
92
|
|
|
88
93
|
**Resource Limits:**
|
|
94
|
+
- Rate limiting via `limiter` package (default: 10 requests/second, configurable)
|
|
89
95
|
- Default pagination limit of 100 items for all list queries
|
|
90
96
|
- Transaction broadcast timeout (60 seconds)
|
|
91
97
|
- Broadcast poll interval (3 seconds)
|
package/README.md
CHANGED
|
@@ -129,6 +129,9 @@ interface ManifestMCPConfig {
|
|
|
129
129
|
gasPrice: string; // Gas price with denomination (e.g., "1.0umfx")
|
|
130
130
|
gasAdjustment?: number; // Gas adjustment multiplier (default: 1.3)
|
|
131
131
|
addressPrefix?: string; // Address prefix (default: "manifest")
|
|
132
|
+
rateLimit?: {
|
|
133
|
+
requestsPerSecond?: number; // Max RPC requests per second (default: 10)
|
|
134
|
+
};
|
|
132
135
|
}
|
|
133
136
|
```
|
|
134
137
|
|
|
@@ -265,12 +268,14 @@ All inputs are validated to prevent common attack vectors:
|
|
|
265
268
|
- **Args count**: Limited to 100 arguments per call
|
|
266
269
|
- **BigInt parsing**: Empty strings rejected (prevents silent 0n values)
|
|
267
270
|
- **Hex strings**: Validated format and length for address-bytes queries
|
|
271
|
+
- **HTTPS enforcement**: RPC URLs must use HTTPS (HTTP only allowed for localhost/127.0.0.1/::1)
|
|
268
272
|
|
|
269
273
|
### Resource Limits
|
|
270
274
|
|
|
271
275
|
Built-in protections against resource exhaustion:
|
|
272
276
|
|
|
273
|
-
- **
|
|
277
|
+
- **Rate limiting**: RPC requests throttled to 10/second by default (configurable)
|
|
278
|
+
- **Pagination**: All list queries default to 100 items (configurable via `--limit` flag, max 1000)
|
|
274
279
|
- **Broadcast timeout**: Transactions timeout after 60 seconds
|
|
275
280
|
- **Poll interval**: Transaction confirmation polled every 3 seconds
|
|
276
281
|
|
package/dist/client.d.ts
CHANGED
|
@@ -11,9 +11,16 @@ export declare class CosmosClientManager {
|
|
|
11
11
|
private walletProvider;
|
|
12
12
|
private queryClient;
|
|
13
13
|
private signingClient;
|
|
14
|
+
private rateLimiter;
|
|
15
|
+
private queryClientPromise;
|
|
16
|
+
private signingClientPromise;
|
|
14
17
|
private constructor();
|
|
15
18
|
/**
|
|
16
|
-
* Get or create a singleton instance for the given config
|
|
19
|
+
* Get or create a singleton instance for the given config.
|
|
20
|
+
* Instances are keyed by chainId:rpcUrl. For existing instances:
|
|
21
|
+
* - Config and walletProvider references are always updated
|
|
22
|
+
* - Signing client is disconnected/recreated if gasPrice or walletProvider changed
|
|
23
|
+
* - Rate limiter is updated if requestsPerSecond changed (without affecting signing client)
|
|
17
24
|
*/
|
|
18
25
|
static getInstance(config: ManifestMCPConfig, walletProvider: WalletProvider): CosmosClientManager;
|
|
19
26
|
/**
|
|
@@ -36,6 +43,11 @@ export declare class CosmosClientManager {
|
|
|
36
43
|
* Get the configuration
|
|
37
44
|
*/
|
|
38
45
|
getConfig(): ManifestMCPConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Acquire a rate limit token before making an RPC request.
|
|
48
|
+
* This will wait if the rate limit has been exceeded.
|
|
49
|
+
*/
|
|
50
|
+
acquireRateLimit(): Promise<void>;
|
|
39
51
|
/**
|
|
40
52
|
* Disconnect all clients
|
|
41
53
|
*/
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA0B,MAAM,kBAAkB,CAAC;AACjF,OAAO,EASL,UAAU,EACX,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA0B,MAAM,kBAAkB,CAAC;AACjF,OAAO,EASL,UAAU,EACX,MAAM,8BAA8B,CAAC;AAItC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAA0C,MAAM,YAAY,CAAC;AAKvG,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC;AA6B5G;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,SAAS,CAA+C;IAEvE,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,WAAW,CAAc;IAGjC,OAAO,CAAC,kBAAkB,CAA6C;IACvE,OAAO,CAAC,oBAAoB,CAA+C;IAE3E,OAAO;IAYP;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAChB,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,cAAc,GAC7B,mBAAmB;IA2CtB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,IAAI;IAI7B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA0CpD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAoExD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC;;OAEG;IACH,SAAS,IAAI,iBAAiB;IAI9B;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvC;;OAEG;IACH,UAAU,IAAI,IAAI;CASnB"}
|
package/dist/client.js
CHANGED
|
@@ -2,7 +2,9 @@ import { SigningStargateClient, GasPrice } from '@cosmjs/stargate';
|
|
|
2
2
|
import { cosmosProtoRegistry, cosmosAminoConverters, liftedinitProtoRegistry, liftedinitAminoConverters, strangeloveVenturesProtoRegistry, strangeloveVenturesAminoConverters, osmosisProtoRegistry, osmosisAminoConverters, liftedinit, } from '@manifest-network/manifestjs';
|
|
3
3
|
import { Registry } from '@cosmjs/proto-signing';
|
|
4
4
|
import { AminoTypes } from '@cosmjs/stargate';
|
|
5
|
+
import { RateLimiter } from 'limiter';
|
|
5
6
|
import { ManifestMCPError, ManifestMCPErrorCode } from './types.js';
|
|
7
|
+
import { DEFAULT_REQUESTS_PER_SECOND } from './config.js';
|
|
6
8
|
/** Default timeout for transaction broadcast (60 seconds) */
|
|
7
9
|
const DEFAULT_BROADCAST_TIMEOUT_MS = 60000;
|
|
8
10
|
/** Default polling interval for transaction confirmation (3 seconds) */
|
|
@@ -32,11 +34,24 @@ export class CosmosClientManager {
|
|
|
32
34
|
constructor(config, walletProvider) {
|
|
33
35
|
this.queryClient = null;
|
|
34
36
|
this.signingClient = null;
|
|
37
|
+
// Promises to prevent concurrent client initialization (lazy init race condition)
|
|
38
|
+
this.queryClientPromise = null;
|
|
39
|
+
this.signingClientPromise = null;
|
|
35
40
|
this.config = config;
|
|
36
41
|
this.walletProvider = walletProvider;
|
|
42
|
+
// Initialize rate limiter with configured or default requests per second
|
|
43
|
+
const requestsPerSecond = config.rateLimit?.requestsPerSecond ?? DEFAULT_REQUESTS_PER_SECOND;
|
|
44
|
+
this.rateLimiter = new RateLimiter({
|
|
45
|
+
tokensPerInterval: requestsPerSecond,
|
|
46
|
+
interval: 'second',
|
|
47
|
+
});
|
|
37
48
|
}
|
|
38
49
|
/**
|
|
39
|
-
* Get or create a singleton instance for the given config
|
|
50
|
+
* Get or create a singleton instance for the given config.
|
|
51
|
+
* Instances are keyed by chainId:rpcUrl. For existing instances:
|
|
52
|
+
* - Config and walletProvider references are always updated
|
|
53
|
+
* - Signing client is disconnected/recreated if gasPrice or walletProvider changed
|
|
54
|
+
* - Rate limiter is updated if requestsPerSecond changed (without affecting signing client)
|
|
40
55
|
*/
|
|
41
56
|
static getInstance(config, walletProvider) {
|
|
42
57
|
const key = `${config.chainId}:${config.rpcUrl}`;
|
|
@@ -45,6 +60,32 @@ export class CosmosClientManager {
|
|
|
45
60
|
instance = new CosmosClientManager(config, walletProvider);
|
|
46
61
|
CosmosClientManager.instances.set(key, instance);
|
|
47
62
|
}
|
|
63
|
+
else {
|
|
64
|
+
// Check what changed to determine what needs updating
|
|
65
|
+
const signingClientAffected = instance.config.gasPrice !== config.gasPrice ||
|
|
66
|
+
instance.walletProvider !== walletProvider;
|
|
67
|
+
const rateLimitChanged = instance.config.rateLimit?.requestsPerSecond !== config.rateLimit?.requestsPerSecond;
|
|
68
|
+
// Always update config reference
|
|
69
|
+
instance.config = config;
|
|
70
|
+
instance.walletProvider = walletProvider;
|
|
71
|
+
// Only invalidate signing client if fields it depends on changed
|
|
72
|
+
if (signingClientAffected) {
|
|
73
|
+
if (instance.signingClient) {
|
|
74
|
+
instance.signingClient.disconnect();
|
|
75
|
+
instance.signingClient = null;
|
|
76
|
+
}
|
|
77
|
+
// Also clear the promise to allow re-initialization with new config
|
|
78
|
+
instance.signingClientPromise = null;
|
|
79
|
+
}
|
|
80
|
+
// Update rate limiter independently (doesn't affect signing client)
|
|
81
|
+
if (rateLimitChanged) {
|
|
82
|
+
const newRps = config.rateLimit?.requestsPerSecond ?? DEFAULT_REQUESTS_PER_SECOND;
|
|
83
|
+
instance.rateLimiter = new RateLimiter({
|
|
84
|
+
tokensPerInterval: newRps,
|
|
85
|
+
interval: 'second',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
48
89
|
return instance;
|
|
49
90
|
}
|
|
50
91
|
/**
|
|
@@ -57,24 +98,56 @@ export class CosmosClientManager {
|
|
|
57
98
|
* Get the manifestjs RPC query client with all module extensions
|
|
58
99
|
*/
|
|
59
100
|
async getQueryClient() {
|
|
60
|
-
if
|
|
101
|
+
// Return cached client if available
|
|
102
|
+
if (this.queryClient) {
|
|
103
|
+
return this.queryClient;
|
|
104
|
+
}
|
|
105
|
+
// If initialization is already in progress, wait for it
|
|
106
|
+
if (this.queryClientPromise) {
|
|
107
|
+
return this.queryClientPromise;
|
|
108
|
+
}
|
|
109
|
+
// Start initialization and cache the promise to prevent concurrent init
|
|
110
|
+
this.queryClientPromise = (async () => {
|
|
111
|
+
// Capture reference to detect if superseded by disconnect/config change
|
|
112
|
+
const thisInitPromise = this.queryClientPromise;
|
|
61
113
|
try {
|
|
62
114
|
// Use liftedinit ClientFactory which includes cosmos + liftedinit modules
|
|
63
|
-
|
|
115
|
+
const client = await liftedinit.ClientFactory.createRPCQueryClient({
|
|
64
116
|
rpcEndpoint: this.config.rpcUrl,
|
|
65
117
|
});
|
|
118
|
+
// Only store if this is still the active promise
|
|
119
|
+
if (this.queryClientPromise === thisInitPromise) {
|
|
120
|
+
this.queryClient = client;
|
|
121
|
+
this.queryClientPromise = null;
|
|
122
|
+
}
|
|
123
|
+
return client;
|
|
66
124
|
}
|
|
67
125
|
catch (error) {
|
|
126
|
+
// Clear promise on failure so retry is possible (only if still active)
|
|
127
|
+
if (this.queryClientPromise === thisInitPromise) {
|
|
128
|
+
this.queryClientPromise = null;
|
|
129
|
+
}
|
|
68
130
|
throw new ManifestMCPError(ManifestMCPErrorCode.RPC_CONNECTION_FAILED, `Failed to connect to RPC endpoint: ${error instanceof Error ? error.message : String(error)}`, { rpcUrl: this.config.rpcUrl });
|
|
69
131
|
}
|
|
70
|
-
}
|
|
71
|
-
return this.
|
|
132
|
+
})();
|
|
133
|
+
return this.queryClientPromise;
|
|
72
134
|
}
|
|
73
135
|
/**
|
|
74
136
|
* Get a signing client with all Manifest registries (for transactions)
|
|
75
137
|
*/
|
|
76
138
|
async getSigningClient() {
|
|
77
|
-
if
|
|
139
|
+
// Return cached client if available
|
|
140
|
+
if (this.signingClient) {
|
|
141
|
+
return this.signingClient;
|
|
142
|
+
}
|
|
143
|
+
// If initialization is already in progress, wait for it
|
|
144
|
+
if (this.signingClientPromise) {
|
|
145
|
+
return this.signingClientPromise;
|
|
146
|
+
}
|
|
147
|
+
// Start initialization and cache the promise to prevent concurrent init
|
|
148
|
+
this.signingClientPromise = (async () => {
|
|
149
|
+
// Capture reference to detect if superseded by disconnect/config change
|
|
150
|
+
const thisInitPromise = this.signingClientPromise;
|
|
78
151
|
try {
|
|
79
152
|
const signer = await this.walletProvider.getSigner();
|
|
80
153
|
const gasPrice = GasPrice.fromString(this.config.gasPrice);
|
|
@@ -87,22 +160,36 @@ export class CosmosClientManager {
|
|
|
87
160
|
// Note: Registry type from @cosmjs/proto-signing doesn't perfectly match
|
|
88
161
|
// SigningStargateClientOptions due to telescope-generated proto types.
|
|
89
162
|
// This is a known limitation with custom cosmos-sdk module registries.
|
|
90
|
-
|
|
163
|
+
const client = await SigningStargateClient.connectWithSigner(endpoint, signer, {
|
|
91
164
|
registry: registry,
|
|
92
165
|
aminoTypes,
|
|
93
166
|
gasPrice,
|
|
94
167
|
broadcastTimeoutMs: DEFAULT_BROADCAST_TIMEOUT_MS,
|
|
95
168
|
broadcastPollIntervalMs: DEFAULT_BROADCAST_POLL_INTERVAL_MS,
|
|
96
169
|
});
|
|
170
|
+
// Only store if this is still the active promise
|
|
171
|
+
if (this.signingClientPromise === thisInitPromise) {
|
|
172
|
+
this.signingClient = client;
|
|
173
|
+
this.signingClientPromise = null;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Promise was superseded, clean up the client we just created
|
|
177
|
+
client.disconnect();
|
|
178
|
+
}
|
|
179
|
+
return client;
|
|
97
180
|
}
|
|
98
181
|
catch (error) {
|
|
182
|
+
// Clear promise on failure so retry is possible (only if still active)
|
|
183
|
+
if (this.signingClientPromise === thisInitPromise) {
|
|
184
|
+
this.signingClientPromise = null;
|
|
185
|
+
}
|
|
99
186
|
if (error instanceof ManifestMCPError) {
|
|
100
187
|
throw error;
|
|
101
188
|
}
|
|
102
189
|
throw new ManifestMCPError(ManifestMCPErrorCode.RPC_CONNECTION_FAILED, `Failed to connect signing client: ${error instanceof Error ? error.message : String(error)}`, { rpcUrl: this.config.rpcUrl });
|
|
103
190
|
}
|
|
104
|
-
}
|
|
105
|
-
return this.
|
|
191
|
+
})();
|
|
192
|
+
return this.signingClientPromise;
|
|
106
193
|
}
|
|
107
194
|
/**
|
|
108
195
|
* Get the wallet address
|
|
@@ -116,6 +203,13 @@ export class CosmosClientManager {
|
|
|
116
203
|
getConfig() {
|
|
117
204
|
return this.config;
|
|
118
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Acquire a rate limit token before making an RPC request.
|
|
208
|
+
* This will wait if the rate limit has been exceeded.
|
|
209
|
+
*/
|
|
210
|
+
async acquireRateLimit() {
|
|
211
|
+
await this.rateLimiter.removeTokens(1);
|
|
212
|
+
}
|
|
119
213
|
/**
|
|
120
214
|
* Disconnect all clients
|
|
121
215
|
*/
|
|
@@ -124,7 +218,9 @@ export class CosmosClientManager {
|
|
|
124
218
|
this.signingClient.disconnect();
|
|
125
219
|
this.signingClient = null;
|
|
126
220
|
}
|
|
221
|
+
this.signingClientPromise = null;
|
|
127
222
|
this.queryClient = null;
|
|
223
|
+
this.queryClientPromise = null;
|
|
128
224
|
}
|
|
129
225
|
}
|
|
130
226
|
CosmosClientManager.instances = new Map();
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAgB,MAAM,kBAAkB,CAAC;AACjF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,kCAAkC,EAClC,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,GACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAqC,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA0C,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA0C,MAAM,YAAY,CAAC;AAYvF;;GAEG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAyD9C;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAWxE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,gBAAgB,CAwDnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAYjF"}
|
package/dist/config.js
CHANGED
|
@@ -8,16 +8,43 @@ const DEFAULT_GAS_ADJUSTMENT = 1.3;
|
|
|
8
8
|
*/
|
|
9
9
|
const DEFAULT_ADDRESS_PREFIX = 'manifest';
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Default requests per second for rate limiting
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
export const DEFAULT_REQUESTS_PER_SECOND = 10;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a hostname is localhost (IPv4, IPv6, or hostname)
|
|
16
|
+
* Handles both bracketed and unbracketed IPv6 formats
|
|
17
|
+
*/
|
|
18
|
+
function isLocalhostHostname(hostname) {
|
|
19
|
+
if (hostname === 'localhost' || hostname === '127.0.0.1') {
|
|
16
20
|
return true;
|
|
17
21
|
}
|
|
22
|
+
// Handle IPv6 localhost - hostname may be '::1' or '[::1]' depending on environment
|
|
23
|
+
const normalizedHostname = hostname.replace(/^\[|\]$/g, '');
|
|
24
|
+
return normalizedHostname === '::1';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Validate URL format and check if it uses HTTPS or is localhost (HTTP allowed for local dev)
|
|
28
|
+
* Returns validation result with error reason if invalid
|
|
29
|
+
*/
|
|
30
|
+
function validateRpcUrl(url) {
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = new URL(url);
|
|
34
|
+
}
|
|
18
35
|
catch {
|
|
19
|
-
return false;
|
|
36
|
+
return { valid: false, reason: 'rpcUrl must be a valid URL' };
|
|
20
37
|
}
|
|
38
|
+
if (parsed.protocol === 'https:') {
|
|
39
|
+
return { valid: true };
|
|
40
|
+
}
|
|
41
|
+
if (parsed.protocol === 'http:' && isLocalhostHostname(parsed.hostname)) {
|
|
42
|
+
return { valid: true }; // HTTP allowed for localhost
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
valid: false,
|
|
46
|
+
reason: `RPC URL must use HTTPS (got ${parsed.protocol}//). HTTP is only allowed for local development (localhost, 127.0.0.1, ::1).`,
|
|
47
|
+
};
|
|
21
48
|
}
|
|
22
49
|
/**
|
|
23
50
|
* Validate gas price format (e.g., "1.0umfx")
|
|
@@ -43,6 +70,9 @@ export function createConfig(input) {
|
|
|
43
70
|
gasPrice: input.gasPrice,
|
|
44
71
|
gasAdjustment: input.gasAdjustment ?? DEFAULT_GAS_ADJUSTMENT,
|
|
45
72
|
addressPrefix: input.addressPrefix ?? DEFAULT_ADDRESS_PREFIX,
|
|
73
|
+
rateLimit: {
|
|
74
|
+
requestsPerSecond: input.rateLimit?.requestsPerSecond ?? DEFAULT_REQUESTS_PER_SECOND,
|
|
75
|
+
},
|
|
46
76
|
};
|
|
47
77
|
}
|
|
48
78
|
/**
|
|
@@ -60,8 +90,11 @@ export function validateConfig(config) {
|
|
|
60
90
|
if (!config.rpcUrl) {
|
|
61
91
|
errors.push('rpcUrl is required');
|
|
62
92
|
}
|
|
63
|
-
else
|
|
64
|
-
|
|
93
|
+
else {
|
|
94
|
+
const urlCheck = validateRpcUrl(config.rpcUrl);
|
|
95
|
+
if (!urlCheck.valid) {
|
|
96
|
+
errors.push(urlCheck.reason);
|
|
97
|
+
}
|
|
65
98
|
}
|
|
66
99
|
if (!config.gasPrice) {
|
|
67
100
|
errors.push('gasPrice is required');
|
|
@@ -80,6 +113,18 @@ export function validateConfig(config) {
|
|
|
80
113
|
errors.push('addressPrefix must be lowercase letters only');
|
|
81
114
|
}
|
|
82
115
|
}
|
|
116
|
+
if (config.rateLimit !== undefined) {
|
|
117
|
+
if (typeof config.rateLimit !== 'object' || config.rateLimit === null || Array.isArray(config.rateLimit)) {
|
|
118
|
+
errors.push('rateLimit must be a plain object');
|
|
119
|
+
}
|
|
120
|
+
else if (config.rateLimit.requestsPerSecond !== undefined) {
|
|
121
|
+
if (typeof config.rateLimit.requestsPerSecond !== 'number' ||
|
|
122
|
+
config.rateLimit.requestsPerSecond <= 0 ||
|
|
123
|
+
!Number.isInteger(config.rateLimit.requestsPerSecond)) {
|
|
124
|
+
errors.push('rateLimit.requestsPerSecond must be a positive integer');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
83
128
|
return {
|
|
84
129
|
valid: errors.length === 0,
|
|
85
130
|
errors,
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvF;;GAEG;AACH,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC;;GAEG;AACH,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAE1C;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.test.js
CHANGED
|
@@ -25,6 +25,24 @@ describe('createConfig', () => {
|
|
|
25
25
|
expect(config.gasAdjustment).toBe(2.0);
|
|
26
26
|
expect(config.addressPrefix).toBe('custom');
|
|
27
27
|
});
|
|
28
|
+
it('should apply default rateLimit', () => {
|
|
29
|
+
const config = createConfig({
|
|
30
|
+
chainId: 'test-chain',
|
|
31
|
+
rpcUrl: 'https://example.com',
|
|
32
|
+
gasPrice: '1.0umfx',
|
|
33
|
+
});
|
|
34
|
+
expect(config.rateLimit).toBeDefined();
|
|
35
|
+
expect(config.rateLimit?.requestsPerSecond).toBe(10);
|
|
36
|
+
});
|
|
37
|
+
it('should preserve provided rateLimit', () => {
|
|
38
|
+
const config = createConfig({
|
|
39
|
+
chainId: 'test-chain',
|
|
40
|
+
rpcUrl: 'https://example.com',
|
|
41
|
+
gasPrice: '1.0umfx',
|
|
42
|
+
rateLimit: { requestsPerSecond: 20 },
|
|
43
|
+
});
|
|
44
|
+
expect(config.rateLimit?.requestsPerSecond).toBe(20);
|
|
45
|
+
});
|
|
28
46
|
});
|
|
29
47
|
describe('validateConfig', () => {
|
|
30
48
|
it('should return valid for correct config', () => {
|
|
@@ -90,6 +108,116 @@ describe('validateConfig', () => {
|
|
|
90
108
|
expect(result.valid).toBe(false);
|
|
91
109
|
expect(result.errors.some(e => e.includes('addressPrefix'))).toBe(true);
|
|
92
110
|
});
|
|
111
|
+
it('should accept HTTPS URLs', () => {
|
|
112
|
+
const result = validateConfig({
|
|
113
|
+
chainId: 'test',
|
|
114
|
+
rpcUrl: 'https://rpc.example.com',
|
|
115
|
+
gasPrice: '1.0umfx',
|
|
116
|
+
});
|
|
117
|
+
expect(result.valid).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it('should accept HTTP URLs for localhost', () => {
|
|
120
|
+
const result = validateConfig({
|
|
121
|
+
chainId: 'test',
|
|
122
|
+
rpcUrl: 'http://localhost:26657',
|
|
123
|
+
gasPrice: '1.0umfx',
|
|
124
|
+
});
|
|
125
|
+
expect(result.valid).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
it('should accept HTTP URLs for 127.0.0.1', () => {
|
|
128
|
+
const result = validateConfig({
|
|
129
|
+
chainId: 'test',
|
|
130
|
+
rpcUrl: 'http://127.0.0.1:26657',
|
|
131
|
+
gasPrice: '1.0umfx',
|
|
132
|
+
});
|
|
133
|
+
expect(result.valid).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
it('should accept HTTP URLs for IPv6 localhost', () => {
|
|
136
|
+
const result = validateConfig({
|
|
137
|
+
chainId: 'test',
|
|
138
|
+
rpcUrl: 'http://[::1]:26657',
|
|
139
|
+
gasPrice: '1.0umfx',
|
|
140
|
+
});
|
|
141
|
+
expect(result.valid).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
it('should reject HTTP URLs for non-localhost', () => {
|
|
144
|
+
const result = validateConfig({
|
|
145
|
+
chainId: 'test',
|
|
146
|
+
rpcUrl: 'http://rpc.example.com',
|
|
147
|
+
gasPrice: '1.0umfx',
|
|
148
|
+
});
|
|
149
|
+
expect(result.valid).toBe(false);
|
|
150
|
+
expect(result.errors.some(e => e.includes('HTTPS'))).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
it('should accept valid rateLimit config', () => {
|
|
153
|
+
const result = validateConfig({
|
|
154
|
+
chainId: 'test',
|
|
155
|
+
rpcUrl: 'https://example.com',
|
|
156
|
+
gasPrice: '1.0umfx',
|
|
157
|
+
rateLimit: { requestsPerSecond: 5 },
|
|
158
|
+
});
|
|
159
|
+
expect(result.valid).toBe(true);
|
|
160
|
+
});
|
|
161
|
+
it('should reject non-integer rateLimit.requestsPerSecond', () => {
|
|
162
|
+
const result = validateConfig({
|
|
163
|
+
chainId: 'test',
|
|
164
|
+
rpcUrl: 'https://example.com',
|
|
165
|
+
gasPrice: '1.0umfx',
|
|
166
|
+
rateLimit: { requestsPerSecond: 5.5 },
|
|
167
|
+
});
|
|
168
|
+
expect(result.valid).toBe(false);
|
|
169
|
+
expect(result.errors.some(e => e.includes('requestsPerSecond'))).toBe(true);
|
|
170
|
+
});
|
|
171
|
+
it('should reject negative rateLimit.requestsPerSecond', () => {
|
|
172
|
+
const result = validateConfig({
|
|
173
|
+
chainId: 'test',
|
|
174
|
+
rpcUrl: 'https://example.com',
|
|
175
|
+
gasPrice: '1.0umfx',
|
|
176
|
+
rateLimit: { requestsPerSecond: -1 },
|
|
177
|
+
});
|
|
178
|
+
expect(result.valid).toBe(false);
|
|
179
|
+
expect(result.errors.some(e => e.includes('requestsPerSecond'))).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
it('should reject zero rateLimit.requestsPerSecond', () => {
|
|
182
|
+
const result = validateConfig({
|
|
183
|
+
chainId: 'test',
|
|
184
|
+
rpcUrl: 'https://example.com',
|
|
185
|
+
gasPrice: '1.0umfx',
|
|
186
|
+
rateLimit: { requestsPerSecond: 0 },
|
|
187
|
+
});
|
|
188
|
+
expect(result.valid).toBe(false);
|
|
189
|
+
expect(result.errors.some(e => e.includes('requestsPerSecond'))).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
it('should reject null rateLimit', () => {
|
|
192
|
+
const result = validateConfig({
|
|
193
|
+
chainId: 'test',
|
|
194
|
+
rpcUrl: 'https://example.com',
|
|
195
|
+
gasPrice: '1.0umfx',
|
|
196
|
+
rateLimit: null,
|
|
197
|
+
});
|
|
198
|
+
expect(result.valid).toBe(false);
|
|
199
|
+
expect(result.errors.some(e => e.includes('rateLimit must be a plain object'))).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
it('should reject non-object rateLimit', () => {
|
|
202
|
+
const result = validateConfig({
|
|
203
|
+
chainId: 'test',
|
|
204
|
+
rpcUrl: 'https://example.com',
|
|
205
|
+
gasPrice: '1.0umfx',
|
|
206
|
+
rateLimit: 'invalid',
|
|
207
|
+
});
|
|
208
|
+
expect(result.valid).toBe(false);
|
|
209
|
+
expect(result.errors.some(e => e.includes('rateLimit must be a plain object'))).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
it('should reject array rateLimit', () => {
|
|
212
|
+
const result = validateConfig({
|
|
213
|
+
chainId: 'test',
|
|
214
|
+
rpcUrl: 'https://example.com',
|
|
215
|
+
gasPrice: '1.0umfx',
|
|
216
|
+
rateLimit: [],
|
|
217
|
+
});
|
|
218
|
+
expect(result.valid).toBe(false);
|
|
219
|
+
expect(result.errors.some(e => e.includes('rateLimit must be a plain object'))).toBe(true);
|
|
220
|
+
});
|
|
93
221
|
});
|
|
94
222
|
describe('createValidatedConfig', () => {
|
|
95
223
|
it('should return config for valid input', () => {
|
package/dist/config.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEpE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,CAAC,CAAC;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,SAAS;SACzB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACnC,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC;YACjC,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,IAAI,CAAC;YACH,qBAAqB,CAAC;gBACpB,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACrF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
|