@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.
Files changed (137) hide show
  1. package/.github/workflows/publish.yml +4 -2
  2. package/CLAUDE.md +9 -3
  3. package/README.md +6 -1
  4. package/dist/client.d.ts +13 -1
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +105 -9
  7. package/dist/client.js.map +1 -1
  8. package/dist/config.d.ts +4 -0
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +52 -7
  11. package/dist/config.js.map +1 -1
  12. package/dist/config.test.js +128 -0
  13. package/dist/config.test.js.map +1 -1
  14. package/dist/cosmos.d.ts.map +1 -1
  15. package/dist/cosmos.js +11 -57
  16. package/dist/cosmos.js.map +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +16 -25
  19. package/dist/index.js.map +1 -1
  20. package/dist/modules.d.ts +30 -1
  21. package/dist/modules.d.ts.map +1 -1
  22. package/dist/modules.js +67 -3
  23. package/dist/modules.js.map +1 -1
  24. package/dist/modules.test.js +58 -1
  25. package/dist/modules.test.js.map +1 -1
  26. package/dist/queries/auth.d.ts +7 -1
  27. package/dist/queries/auth.d.ts.map +1 -1
  28. package/dist/queries/auth.js +18 -45
  29. package/dist/queries/auth.js.map +1 -1
  30. package/dist/queries/bank.d.ts +7 -1
  31. package/dist/queries/bank.d.ts.map +1 -1
  32. package/dist/queries/bank.js +24 -38
  33. package/dist/queries/bank.js.map +1 -1
  34. package/dist/queries/billing.d.ts +7 -1
  35. package/dist/queries/billing.d.ts.map +1 -1
  36. package/dist/queries/billing.js +28 -54
  37. package/dist/queries/billing.js.map +1 -1
  38. package/dist/queries/distribution.d.ts +7 -1
  39. package/dist/queries/distribution.d.ts.map +1 -1
  40. package/dist/queries/distribution.js +18 -36
  41. package/dist/queries/distribution.js.map +1 -1
  42. package/dist/queries/gov.d.ts +7 -1
  43. package/dist/queries/gov.d.ts.map +1 -1
  44. package/dist/queries/gov.js +24 -41
  45. package/dist/queries/gov.js.map +1 -1
  46. package/dist/queries/index.d.ts +2 -1
  47. package/dist/queries/index.d.ts.map +1 -1
  48. package/dist/queries/index.js +1 -1
  49. package/dist/queries/index.js.map +1 -1
  50. package/dist/queries/staking.d.ts +7 -1
  51. package/dist/queries/staking.d.ts.map +1 -1
  52. package/dist/queries/staking.js +36 -59
  53. package/dist/queries/staking.js.map +1 -1
  54. package/dist/queries/utils.d.ts +42 -10
  55. package/dist/queries/utils.d.ts.map +1 -1
  56. package/dist/queries/utils.js +64 -12
  57. package/dist/queries/utils.js.map +1 -1
  58. package/dist/queries/utils.test.js +68 -8
  59. package/dist/queries/utils.test.js.map +1 -1
  60. package/dist/transactions/bank.d.ts +2 -2
  61. package/dist/transactions/bank.d.ts.map +1 -1
  62. package/dist/transactions/bank.js +9 -18
  63. package/dist/transactions/bank.js.map +1 -1
  64. package/dist/transactions/billing.d.ts +2 -2
  65. package/dist/transactions/billing.d.ts.map +1 -1
  66. package/dist/transactions/billing.js +52 -34
  67. package/dist/transactions/billing.js.map +1 -1
  68. package/dist/transactions/distribution.d.ts +2 -2
  69. package/dist/transactions/distribution.d.ts.map +1 -1
  70. package/dist/transactions/distribution.js +7 -13
  71. package/dist/transactions/distribution.js.map +1 -1
  72. package/dist/transactions/gov.d.ts +2 -2
  73. package/dist/transactions/gov.d.ts.map +1 -1
  74. package/dist/transactions/gov.js +32 -17
  75. package/dist/transactions/gov.js.map +1 -1
  76. package/dist/transactions/index.d.ts +1 -1
  77. package/dist/transactions/index.d.ts.map +1 -1
  78. package/dist/transactions/index.js +1 -1
  79. package/dist/transactions/index.js.map +1 -1
  80. package/dist/transactions/manifest.d.ts +2 -2
  81. package/dist/transactions/manifest.d.ts.map +1 -1
  82. package/dist/transactions/manifest.js +7 -14
  83. package/dist/transactions/manifest.js.map +1 -1
  84. package/dist/transactions/staking.d.ts +2 -2
  85. package/dist/transactions/staking.d.ts.map +1 -1
  86. package/dist/transactions/staking.js +7 -13
  87. package/dist/transactions/staking.js.map +1 -1
  88. package/dist/transactions/utils.d.ts +63 -1
  89. package/dist/transactions/utils.d.ts.map +1 -1
  90. package/dist/transactions/utils.js +121 -2
  91. package/dist/transactions/utils.js.map +1 -1
  92. package/dist/transactions/utils.test.js +351 -1
  93. package/dist/transactions/utils.test.js.map +1 -1
  94. package/dist/types.d.ts +212 -8
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/types.js.map +1 -1
  97. package/dist/wallet/mnemonic.d.ts +1 -0
  98. package/dist/wallet/mnemonic.d.ts.map +1 -1
  99. package/dist/wallet/mnemonic.js +34 -13
  100. package/dist/wallet/mnemonic.js.map +1 -1
  101. package/package.json +11 -6
  102. package/src/client.ts +119 -9
  103. package/src/config.test.ts +156 -0
  104. package/src/config.ts +59 -7
  105. package/src/cosmos.ts +19 -109
  106. package/src/index.ts +17 -23
  107. package/src/modules.test.ts +60 -0
  108. package/src/modules.ts +124 -7
  109. package/src/queries/auth.ts +35 -74
  110. package/src/queries/bank.ts +40 -58
  111. package/src/queries/billing.ts +46 -86
  112. package/src/queries/distribution.ts +35 -59
  113. package/src/queries/gov.ts +40 -64
  114. package/src/queries/index.ts +10 -1
  115. package/src/queries/staking.ts +55 -91
  116. package/src/queries/utils.test.ts +103 -8
  117. package/src/queries/utils.ts +92 -12
  118. package/src/transactions/bank.ts +9 -33
  119. package/src/transactions/billing.ts +64 -59
  120. package/src/transactions/distribution.ts +7 -29
  121. package/src/transactions/gov.ts +40 -34
  122. package/src/transactions/index.ts +1 -1
  123. package/src/transactions/manifest.ts +7 -29
  124. package/src/transactions/staking.ts +7 -29
  125. package/src/transactions/utils.test.ts +390 -1
  126. package/src/transactions/utils.ts +191 -2
  127. package/src/types.ts +328 -9
  128. package/src/wallet/mnemonic.ts +41 -17
  129. package/.claude/settings.local.json +0 -17
  130. package/dist/browser.d.ts.map +0 -1
  131. package/dist/browser.js.map +0 -1
  132. package/dist/queries/manifest.d.ts +0 -10
  133. package/dist/queries/manifest.d.ts.map +0 -1
  134. package/dist/queries/manifest.js +0 -14
  135. package/dist/queries/manifest.js.map +0 -1
  136. package/dist/wallet/keplr.d.ts.map +0 -1
  137. 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()`, `parseInt()`, `defaultPagination`
49
- - All paginated queries use `DEFAULT_PAGE_LIMIT` (100) to prevent resource exhaustion
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
- - **Pagination**: All list queries default to 100 items max
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
  */
@@ -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;AAGtC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAA0C,MAAM,YAAY,CAAC;AAIvG,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;IAE3D,OAAO;IAKP;;OAEG;IACH,MAAM,CAAC,WAAW,CAChB,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,cAAc,GAC7B,mBAAmB;IAYtB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,IAAI;IAI7B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAkBpD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAyCxD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC;;OAEG;IACH,SAAS,IAAI,iBAAiB;IAI9B;;OAEG;IACH,UAAU,IAAI,IAAI;CAOnB"}
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 (!this.queryClient) {
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
- this.queryClient = await liftedinit.ClientFactory.createRPCQueryClient({
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.queryClient;
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 (!this.signingClient) {
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
- this.signingClient = await SigningStargateClient.connectWithSigner(endpoint, signer, {
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.signingClient;
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();
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  import { ManifestMCPConfig } from './types.js';
2
+ /**
3
+ * Default requests per second for rate limiting
4
+ */
5
+ export declare const DEFAULT_REQUESTS_PER_SECOND = 10;
2
6
  /**
3
7
  * Create a configuration object with defaults applied
4
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA0C,MAAM,YAAY,CAAC;AAwCvF;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAQxE;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,CAuCnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAYjF"}
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
- * Validate a URL string
11
+ * Default requests per second for rate limiting
12
12
  */
13
- function isValidUrl(url) {
14
- try {
15
- new URL(url);
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 if (!isValidUrl(config.rpcUrl)) {
64
- errors.push('rpcUrl must be a valid URL');
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,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}