@manifest-network/manifest-mcp-browser 0.1.0 → 0.1.1
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/.claude/settings.local.json +4 -1
- package/CLAUDE.md +2 -0
- package/README.md +5 -0
- package/dist/client.d.ts +8 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +41 -1
- 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 +4 -0
- package/dist/cosmos.js.map +1 -1
- package/dist/modules.js +2 -2
- package/dist/modules.js.map +1 -1
- package/dist/transactions/billing.d.ts.map +1 -1
- package/dist/transactions/billing.js +80 -5
- package/dist/transactions/billing.js.map +1 -1
- package/dist/transactions/gov.d.ts.map +1 -1
- package/dist/transactions/gov.js +6 -0
- package/dist/transactions/gov.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -6
- package/src/client.ts +48 -1
- package/src/config.test.ts +156 -0
- package/src/config.ts +59 -7
- package/src/cosmos.ts +6 -0
- package/src/modules.ts +2 -2
- package/src/transactions/billing.ts +117 -5
- package/src/transactions/gov.ts +10 -0
- package/src/types.ts +10 -0
- 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
|
@@ -1,8 +1,32 @@
|
|
|
1
|
+
import { fromHex } from '@cosmjs/encoding';
|
|
1
2
|
import { liftedinit } from '@manifest-network/manifestjs';
|
|
2
3
|
import { ManifestMCPError, ManifestMCPErrorCode } from '../types.js';
|
|
3
4
|
import { parseAmount, buildTxResult, parseBigInt, validateAddress, validateArgsLength } from './utils.js';
|
|
4
5
|
import { getSubcommandUsage } from '../modules.js';
|
|
5
6
|
const { MsgFundCredit, MsgCreateLease, MsgCloseLease, MsgWithdraw } = liftedinit.billing.v1;
|
|
7
|
+
/** Maximum meta hash length in bytes (64 bytes for SHA-512) */
|
|
8
|
+
const MAX_META_HASH_BYTES = 64;
|
|
9
|
+
/**
|
|
10
|
+
* Validate and parse a hex string into Uint8Array
|
|
11
|
+
* Uses @cosmjs/encoding for hex validation and conversion
|
|
12
|
+
*/
|
|
13
|
+
function parseMetaHash(hexString) {
|
|
14
|
+
// Check even length first to avoid fractional byte counts in error messages
|
|
15
|
+
if (hexString.length % 2 !== 0) {
|
|
16
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Invalid meta-hash: hex string must have even length. Got ${hexString.length} characters.`);
|
|
17
|
+
}
|
|
18
|
+
// Check max length (64 bytes = 128 hex chars)
|
|
19
|
+
const byteLength = hexString.length / 2;
|
|
20
|
+
if (byteLength > MAX_META_HASH_BYTES) {
|
|
21
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Invalid meta-hash: exceeds maximum ${MAX_META_HASH_BYTES} bytes. Got ${byteLength} bytes (${hexString.length} hex chars).`);
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
return fromHex(hexString);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Invalid meta-hash: ${error instanceof Error ? error.message : String(error)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
6
30
|
/**
|
|
7
31
|
* Route billing transaction to appropriate handler
|
|
8
32
|
*/
|
|
@@ -29,12 +53,25 @@ export async function routeBillingTransaction(client, senderAddress, subcommand,
|
|
|
29
53
|
return buildTxResult('billing', 'fund-credit', result, waitForConfirmation);
|
|
30
54
|
}
|
|
31
55
|
case 'create-lease': {
|
|
32
|
-
|
|
56
|
+
// Parse optional --meta-hash flag
|
|
57
|
+
let metaHash;
|
|
58
|
+
let itemArgs = args;
|
|
59
|
+
if (args[0] === '--meta-hash') {
|
|
60
|
+
if (args.length < 2 || args[1].startsWith('--')) {
|
|
61
|
+
const usage = getSubcommandUsage('tx', 'billing', 'create-lease');
|
|
62
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `--meta-hash flag requires a hex value. Usage: create-lease ${usage ?? '<args>'}`);
|
|
63
|
+
}
|
|
64
|
+
const hexHash = args[1];
|
|
65
|
+
// Validate and convert hex string to Uint8Array (max 64 bytes)
|
|
66
|
+
metaHash = parseMetaHash(hexHash);
|
|
67
|
+
itemArgs = args.slice(2);
|
|
68
|
+
}
|
|
69
|
+
if (itemArgs.length < 1) {
|
|
33
70
|
const usage = getSubcommandUsage('tx', 'billing', 'create-lease');
|
|
34
|
-
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `create-lease requires at least one sku-uuid:quantity pair. Usage: create-lease ${usage
|
|
71
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `create-lease requires at least one sku-uuid:quantity pair. Usage: create-lease ${usage ?? '<args>'}`, { usage });
|
|
35
72
|
}
|
|
36
73
|
// Parse items (format: sku-uuid:quantity ...)
|
|
37
|
-
const items =
|
|
74
|
+
const items = itemArgs.map((arg) => {
|
|
38
75
|
const [skuUuid, quantityStr] = arg.split(':');
|
|
39
76
|
if (!skuUuid || !quantityStr) {
|
|
40
77
|
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Invalid lease item format: ${arg}. Expected format: sku-uuid:quantity`);
|
|
@@ -46,6 +83,7 @@ export async function routeBillingTransaction(client, senderAddress, subcommand,
|
|
|
46
83
|
value: MsgCreateLease.fromPartial({
|
|
47
84
|
tenant: senderAddress,
|
|
48
85
|
items,
|
|
86
|
+
metaHash: metaHash ?? new Uint8Array(),
|
|
49
87
|
}),
|
|
50
88
|
};
|
|
51
89
|
const result = await client.signAndBroadcast(senderAddress, [msg], 'auto');
|
|
@@ -73,22 +111,58 @@ export async function routeBillingTransaction(client, senderAddress, subcommand,
|
|
|
73
111
|
case 'withdraw': {
|
|
74
112
|
if (args.length < 1) {
|
|
75
113
|
const usage = getSubcommandUsage('tx', 'billing', 'withdraw');
|
|
76
|
-
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `withdraw requires at least one lease-uuid argument or provider-uuid with --provider flag. Usage: withdraw ${usage
|
|
114
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `withdraw requires at least one lease-uuid argument or provider-uuid with --provider flag. Usage: withdraw ${usage ?? '<args>'}`, { usage });
|
|
77
115
|
}
|
|
78
116
|
// Check if using provider-wide withdrawal
|
|
79
117
|
const providerFlagIndex = args.indexOf('--provider');
|
|
118
|
+
const limitFlagIndex = args.indexOf('--limit');
|
|
80
119
|
let leaseUuids = [];
|
|
81
120
|
let providerUuid = '';
|
|
121
|
+
let limit = BigInt(0); // 0 means use default (50)
|
|
82
122
|
if (providerFlagIndex !== -1) {
|
|
83
123
|
// Provider-wide withdrawal mode
|
|
84
124
|
providerUuid = args[providerFlagIndex + 1] || '';
|
|
85
|
-
if (!providerUuid) {
|
|
125
|
+
if (!providerUuid || providerUuid.startsWith('--')) {
|
|
86
126
|
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, 'withdraw with --provider flag requires provider-uuid argument');
|
|
87
127
|
}
|
|
128
|
+
// Track consumed arg indices to detect extra arguments
|
|
129
|
+
const consumedIndices = new Set([providerFlagIndex, providerFlagIndex + 1]);
|
|
130
|
+
// Parse optional --limit flag (only valid with --provider)
|
|
131
|
+
if (limitFlagIndex !== -1) {
|
|
132
|
+
const limitStr = args[limitFlagIndex + 1] || '';
|
|
133
|
+
if (!limitStr || limitStr.startsWith('--')) {
|
|
134
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, 'withdraw with --limit flag requires a number argument (1-100)');
|
|
135
|
+
}
|
|
136
|
+
limit = parseBigInt(limitStr, 'limit');
|
|
137
|
+
if (limit < BigInt(1) || limit > BigInt(100)) {
|
|
138
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Invalid limit: ${limit}. Must be between 1 and 100.`);
|
|
139
|
+
}
|
|
140
|
+
consumedIndices.add(limitFlagIndex);
|
|
141
|
+
consumedIndices.add(limitFlagIndex + 1);
|
|
142
|
+
}
|
|
143
|
+
// Check for any extra arguments that weren't consumed
|
|
144
|
+
const extraArgs = args.filter((_, index) => !consumedIndices.has(index));
|
|
145
|
+
if (extraArgs.length > 0) {
|
|
146
|
+
const usage = getSubcommandUsage('tx', 'billing', 'withdraw');
|
|
147
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Provider-wide withdrawal does not accept additional arguments. ` +
|
|
148
|
+
`Got unexpected: ${extraArgs.map(a => `"${a}"`).join(', ')}. ` +
|
|
149
|
+
`For lease-specific withdrawal, omit --provider flag. Usage: withdraw ${usage ?? '<args>'}`);
|
|
150
|
+
}
|
|
88
151
|
}
|
|
89
152
|
else {
|
|
90
153
|
// Lease-specific withdrawal mode
|
|
154
|
+
// Check for unexpected flags
|
|
155
|
+
const unexpectedFlags = args.filter(arg => arg.startsWith('--'));
|
|
156
|
+
if (unexpectedFlags.length > 0) {
|
|
157
|
+
const usage = getSubcommandUsage('tx', 'billing', 'withdraw');
|
|
158
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Unexpected flag(s) in lease-specific withdrawal mode: ${unexpectedFlags.join(', ')}. ` +
|
|
159
|
+
`Use --provider for provider-wide withdrawal. Usage: withdraw ${usage ?? '<args>'}`);
|
|
160
|
+
}
|
|
91
161
|
leaseUuids = args;
|
|
162
|
+
if (leaseUuids.length === 0) {
|
|
163
|
+
const usage = getSubcommandUsage('tx', 'billing', 'withdraw');
|
|
164
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `withdraw requires at least one lease-uuid. Usage: withdraw ${usage ?? '<args>'}`);
|
|
165
|
+
}
|
|
92
166
|
}
|
|
93
167
|
const msg = {
|
|
94
168
|
typeUrl: '/liftedinit.billing.v1.MsgWithdraw',
|
|
@@ -96,6 +170,7 @@ export async function routeBillingTransaction(client, senderAddress, subcommand,
|
|
|
96
170
|
sender: senderAddress,
|
|
97
171
|
leaseUuids,
|
|
98
172
|
providerUuid,
|
|
173
|
+
limit,
|
|
99
174
|
}),
|
|
100
175
|
};
|
|
101
176
|
const result = await client.signAndBroadcast(senderAddress, [msg], 'auto');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/transactions/billing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAqC,MAAM,aAAa,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;AAE5F;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAA6B,EAC7B,aAAqB,EACrB,UAAkB,EAClB,IAAc,EACd,OAA0B,EAC1B,mBAA4B;IAE5B,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAEhD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;gBACjE,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,SAAS,EAC9B,sEAAsE,IAAI,CAAC,MAAM,kBAAkB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,KAAK,IAAI,2BAA2B,EAAE,EACpM,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,CAC1E,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;YACjC,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC1C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YAEjD,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,sCAAsC;gBAC/C,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC;oBAC/B,MAAM,EAAE,aAAa;oBACrB,MAAM;oBACN,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;iBAC1B,CAAC;aACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3E,OAAO,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC9E,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/transactions/billing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gov.d.ts","sourceRoot":"","sources":["../../src/transactions/gov.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAA0C,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8DxG;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,qBAAqB,EAC7B,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,iBAAiB,EAC1B,mBAAmB,EAAE,OAAO,GAC3B,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"gov.d.ts","sourceRoot":"","sources":["../../src/transactions/gov.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAA0C,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8DxG;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,qBAAqB,EAC7B,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,iBAAiB,EAC1B,mBAAmB,EAAE,OAAO,GAC3B,OAAO,CAAC,cAAc,CAAC,CAwHzB"}
|
package/dist/transactions/gov.js
CHANGED
|
@@ -95,6 +95,12 @@ export async function routeGovTransaction(client, senderAddress, subcommand, arg
|
|
|
95
95
|
const weight = parseWeightToFixed18(weightStr);
|
|
96
96
|
return { option, weight };
|
|
97
97
|
});
|
|
98
|
+
// Validate that weights sum to exactly 1.0 (10^18 in fixed-point)
|
|
99
|
+
const totalWeight = options.reduce((sum, opt) => sum + BigInt(opt.weight), BigInt(0));
|
|
100
|
+
const oneInFixed18 = BigInt('1000000000000000000'); // 10^18
|
|
101
|
+
if (totalWeight !== oneInFixed18) {
|
|
102
|
+
throw new ManifestMCPError(ManifestMCPErrorCode.TX_FAILED, `Weighted vote options must sum to exactly 1.0. Got ${Number(totalWeight) / 1e18} (${options.map(o => o.weight).join(' + ')} = ${totalWeight})`);
|
|
103
|
+
}
|
|
98
104
|
const msg = {
|
|
99
105
|
typeUrl: '/cosmos.gov.v1.MsgVoteWeighted',
|
|
100
106
|
value: MsgVoteWeighted.fromPartial({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gov.js","sourceRoot":"","sources":["../../src/transactions/gov.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAqC,MAAM,aAAa,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAE3E;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,kDAAkD;IAClD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,SAAS,EAC9B,2BAA2B,SAAS,0DAA0D,CAC/F,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAErD,oDAAoD;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3D,oCAAoC;IACpC,MAAM,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IAEzC,mDAAmD;IACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IAElD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,SAAiB;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACvC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK,CAAC;QACX,KAAK,GAAG;YACN,OAAO,UAAU,CAAC,eAAe,CAAC;QACpC,KAAK,SAAS,CAAC;QACf,KAAK,GAAG;YACN,OAAO,UAAU,CAAC,mBAAmB,CAAC;QACxC,KAAK,IAAI,CAAC;QACV,KAAK,GAAG;YACN,OAAO,UAAU,CAAC,cAAc,CAAC;QACnC,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY,CAAC;QAClB,KAAK,GAAG;YACN,OAAO,UAAU,CAAC,wBAAwB,CAAC;QAC7C;YACE,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,SAAS,EAC9B,wBAAwB,SAAS,+CAA+C,CACjF,CAAC;IACN,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA6B,EAC7B,aAAqB,EACrB,UAAkB,EAClB,IAAc,EACd,OAA0B,EAC1B,mBAA4B;IAE5B,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAE5C,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,SAAS,EAC9B,gDAAgD,CACjD,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;YACxC,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YAE1C,sCAAsC;YACtC,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;gBACpD,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,wBAAwB;gBACjC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC;oBACzB,UAAU;oBACV,KAAK,EAAE,aAAa;oBACpB,MAAM;oBACN,QAAQ;iBACT,CAAC;aACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3E,OAAO,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnE,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,SAAS,EAC9B,mFAAmF,CACpF,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;YACzC,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAE7D,8DAA8D;YAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAChD,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC3B,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,SAAS,EAC9B,iCAAiC,GAAG,kCAAkC,CACvE,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACxC,mFAAmF;gBACnF,qEAAqE;gBACrE,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,gCAAgC;gBACzC,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC;oBACjC,UAAU;oBACV,KAAK,EAAE,aAAa;oBACpB,OAAO;oBACP,QAAQ,EAAE,EAAE;iBACb,CAAC;aACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3E,OAAO,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,SAAS,EAC9B,mDAAmD,CACpD,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;YACxC,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC7D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YAEjD,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,2BAA2B;gBACpC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC;oBAC5B,UAAU;oBACV,SAAS,EAAE,aAAa;oBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;iBAC5B,CAAC;aACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3E,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACtE,CAAC;QAED;YACE,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,CAAC,cAAc,EACnC,2CAA2C,UAAU,EAAE,EACvD,EAAE,oBAAoB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,CAC/D,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"gov.js","sourceRoot":"","sources":["../../src/transactions/gov.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { OfflineSigner } from '@cosmjs/proto-signing';
|
|
2
|
+
/**
|
|
3
|
+
* Rate limiting configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitConfig {
|
|
6
|
+
/** Maximum requests per second (default: 10) */
|
|
7
|
+
readonly requestsPerSecond?: number;
|
|
8
|
+
}
|
|
2
9
|
/**
|
|
3
10
|
* Configuration for the Manifest MCP Browser server
|
|
4
11
|
*/
|
|
@@ -13,6 +20,8 @@ export interface ManifestMCPConfig {
|
|
|
13
20
|
readonly gasAdjustment?: number;
|
|
14
21
|
/** Address prefix (e.g., "manifest") */
|
|
15
22
|
readonly addressPrefix?: string;
|
|
23
|
+
/** Rate limiting configuration */
|
|
24
|
+
readonly rateLimit?: RateLimitConfig;
|
|
16
25
|
}
|
|
17
26
|
/**
|
|
18
27
|
* Wallet provider interface for different wallet implementations
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,wCAAwC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsFA;;GAEG;AACH,MAAM,CAAN,IAAY,oBAkCX;AAlCD,WAAY,oBAAoB;IAC9B,uBAAuB;IACvB,yDAAiC,CAAA;IACjC,yDAAiC,CAAA;IAEjC,gBAAgB;IAChB,qEAA6C,CAAA;IAC7C,6EAAqD,CAAA;IACrD,mEAA2C,CAAA;IAC3C,6DAAqC,CAAA;IAErC,gBAAgB;IAChB,yEAAiD,CAAA;IACjD,uEAA+C,CAAA;IAE/C,eAAe;IACf,qDAA6B,CAAA;IAC7B,+DAAuC,CAAA;IACvC,2DAAmC,CAAA;IAEnC,qBAAqB;IACrB,+CAAuB,CAAA;IACvB,qEAA6C,CAAA;IAC7C,mEAA2C,CAAA;IAC3C,2EAAmD,CAAA;IACnD,yDAAiC,CAAA;IACjC,iEAAyC,CAAA;IAEzC,gBAAgB;IAChB,yDAAiC,CAAA;IACjC,iEAAyC,CAAA;IAEzC,iBAAiB;IACjB,uDAA+B,CAAA;AACjC,CAAC,EAlCW,oBAAoB,KAApB,oBAAoB,QAkC/B;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAIzC,YACE,IAA0B,EAC1B,OAAe,EACf,OAAiC;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,sDAAsD;QACtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifest-network/manifest-mcp-browser",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Browser-compatible MCP server for Cosmos SDK blockchain interactions with Manifest Network using CosmJS",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -29,12 +29,13 @@
|
|
|
29
29
|
"author": "Felix C. Morency",
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@manifest-network/manifestjs": "2.2.0-billing-v2.
|
|
33
|
-
"@modelcontextprotocol/sdk": "
|
|
32
|
+
"@manifest-network/manifestjs": "2.2.0-billing-v2.1",
|
|
33
|
+
"@modelcontextprotocol/sdk": "1.25.3",
|
|
34
|
+
"limiter": "3.0.0"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
|
-
"@types/node": "
|
|
37
|
-
"typescript": "
|
|
38
|
-
"vitest": "
|
|
37
|
+
"@types/node": "20.19.30",
|
|
38
|
+
"typescript": "5.9.3",
|
|
39
|
+
"vitest": "4.0.18"
|
|
39
40
|
}
|
|
40
41
|
}
|
package/src/client.ts
CHANGED
|
@@ -12,7 +12,9 @@ import {
|
|
|
12
12
|
} from '@manifest-network/manifestjs';
|
|
13
13
|
import { Registry } from '@cosmjs/proto-signing';
|
|
14
14
|
import { AminoTypes } from '@cosmjs/stargate';
|
|
15
|
+
import { RateLimiter } from 'limiter';
|
|
15
16
|
import { ManifestMCPConfig, WalletProvider, ManifestMCPError, ManifestMCPErrorCode } from './types.js';
|
|
17
|
+
import { DEFAULT_REQUESTS_PER_SECOND } from './config.js';
|
|
16
18
|
|
|
17
19
|
// Type for the RPC query client from manifestjs liftedinit bundle
|
|
18
20
|
// This includes cosmos modules + liftedinit-specific modules (billing, manifest, sku)
|
|
@@ -55,14 +57,23 @@ export class CosmosClientManager {
|
|
|
55
57
|
private walletProvider: WalletProvider;
|
|
56
58
|
private queryClient: ManifestQueryClient | null = null;
|
|
57
59
|
private signingClient: SigningStargateClient | null = null;
|
|
60
|
+
private rateLimiter: RateLimiter;
|
|
58
61
|
|
|
59
62
|
private constructor(config: ManifestMCPConfig, walletProvider: WalletProvider) {
|
|
60
63
|
this.config = config;
|
|
61
64
|
this.walletProvider = walletProvider;
|
|
65
|
+
|
|
66
|
+
// Initialize rate limiter with configured or default requests per second
|
|
67
|
+
const requestsPerSecond = config.rateLimit?.requestsPerSecond ?? DEFAULT_REQUESTS_PER_SECOND;
|
|
68
|
+
this.rateLimiter = new RateLimiter({
|
|
69
|
+
tokensPerInterval: requestsPerSecond,
|
|
70
|
+
interval: 'second',
|
|
71
|
+
});
|
|
62
72
|
}
|
|
63
73
|
|
|
64
74
|
/**
|
|
65
|
-
* Get or create a singleton instance for the given config
|
|
75
|
+
* Get or create a singleton instance for the given config.
|
|
76
|
+
* If an instance exists with different rate limit settings, the limiter is updated.
|
|
66
77
|
*/
|
|
67
78
|
static getInstance(
|
|
68
79
|
config: ManifestMCPConfig,
|
|
@@ -74,6 +85,34 @@ export class CosmosClientManager {
|
|
|
74
85
|
if (!instance) {
|
|
75
86
|
instance = new CosmosClientManager(config, walletProvider);
|
|
76
87
|
CosmosClientManager.instances.set(key, instance);
|
|
88
|
+
} else {
|
|
89
|
+
// Check if config or wallet changed and update accordingly
|
|
90
|
+
const configChanged =
|
|
91
|
+
instance.config.gasPrice !== config.gasPrice ||
|
|
92
|
+
instance.config.gasAdjustment !== config.gasAdjustment ||
|
|
93
|
+
instance.config.addressPrefix !== config.addressPrefix ||
|
|
94
|
+
instance.config.rateLimit?.requestsPerSecond !== config.rateLimit?.requestsPerSecond;
|
|
95
|
+
|
|
96
|
+
const walletChanged = instance.walletProvider !== walletProvider;
|
|
97
|
+
|
|
98
|
+
if (configChanged || walletChanged) {
|
|
99
|
+
// Update config and wallet
|
|
100
|
+
instance.config = config;
|
|
101
|
+
instance.walletProvider = walletProvider;
|
|
102
|
+
|
|
103
|
+
// Invalidate signing client so it gets recreated with new config/wallet
|
|
104
|
+
if (instance.signingClient) {
|
|
105
|
+
instance.signingClient.disconnect();
|
|
106
|
+
instance.signingClient = null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Update rate limiter
|
|
110
|
+
const newRps = config.rateLimit?.requestsPerSecond ?? DEFAULT_REQUESTS_PER_SECOND;
|
|
111
|
+
instance.rateLimiter = new RateLimiter({
|
|
112
|
+
tokensPerInterval: newRps,
|
|
113
|
+
interval: 'second',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
77
116
|
}
|
|
78
117
|
|
|
79
118
|
return instance;
|
|
@@ -165,6 +204,14 @@ export class CosmosClientManager {
|
|
|
165
204
|
return this.config;
|
|
166
205
|
}
|
|
167
206
|
|
|
207
|
+
/**
|
|
208
|
+
* Acquire a rate limit token before making an RPC request.
|
|
209
|
+
* This will wait if the rate limit has been exceeded.
|
|
210
|
+
*/
|
|
211
|
+
async acquireRateLimit(): Promise<void> {
|
|
212
|
+
await this.rateLimiter.removeTokens(1);
|
|
213
|
+
}
|
|
214
|
+
|
|
168
215
|
/**
|
|
169
216
|
* Disconnect all clients
|
|
170
217
|
*/
|
package/src/config.test.ts
CHANGED
|
@@ -29,6 +29,28 @@ describe('createConfig', () => {
|
|
|
29
29
|
expect(config.gasAdjustment).toBe(2.0);
|
|
30
30
|
expect(config.addressPrefix).toBe('custom');
|
|
31
31
|
});
|
|
32
|
+
|
|
33
|
+
it('should apply default rateLimit', () => {
|
|
34
|
+
const config = createConfig({
|
|
35
|
+
chainId: 'test-chain',
|
|
36
|
+
rpcUrl: 'https://example.com',
|
|
37
|
+
gasPrice: '1.0umfx',
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
expect(config.rateLimit).toBeDefined();
|
|
41
|
+
expect(config.rateLimit?.requestsPerSecond).toBe(10);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should preserve provided rateLimit', () => {
|
|
45
|
+
const config = createConfig({
|
|
46
|
+
chainId: 'test-chain',
|
|
47
|
+
rpcUrl: 'https://example.com',
|
|
48
|
+
gasPrice: '1.0umfx',
|
|
49
|
+
rateLimit: { requestsPerSecond: 20 },
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
expect(config.rateLimit?.requestsPerSecond).toBe(20);
|
|
53
|
+
});
|
|
32
54
|
});
|
|
33
55
|
|
|
34
56
|
describe('validateConfig', () => {
|
|
@@ -108,6 +130,140 @@ describe('validateConfig', () => {
|
|
|
108
130
|
expect(result.valid).toBe(false);
|
|
109
131
|
expect(result.errors.some(e => e.includes('addressPrefix'))).toBe(true);
|
|
110
132
|
});
|
|
133
|
+
|
|
134
|
+
it('should accept HTTPS URLs', () => {
|
|
135
|
+
const result = validateConfig({
|
|
136
|
+
chainId: 'test',
|
|
137
|
+
rpcUrl: 'https://rpc.example.com',
|
|
138
|
+
gasPrice: '1.0umfx',
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
expect(result.valid).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should accept HTTP URLs for localhost', () => {
|
|
145
|
+
const result = validateConfig({
|
|
146
|
+
chainId: 'test',
|
|
147
|
+
rpcUrl: 'http://localhost:26657',
|
|
148
|
+
gasPrice: '1.0umfx',
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
expect(result.valid).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('should accept HTTP URLs for 127.0.0.1', () => {
|
|
155
|
+
const result = validateConfig({
|
|
156
|
+
chainId: 'test',
|
|
157
|
+
rpcUrl: 'http://127.0.0.1:26657',
|
|
158
|
+
gasPrice: '1.0umfx',
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
expect(result.valid).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('should accept HTTP URLs for IPv6 localhost', () => {
|
|
165
|
+
const result = validateConfig({
|
|
166
|
+
chainId: 'test',
|
|
167
|
+
rpcUrl: 'http://[::1]:26657',
|
|
168
|
+
gasPrice: '1.0umfx',
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
expect(result.valid).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('should reject HTTP URLs for non-localhost', () => {
|
|
175
|
+
const result = validateConfig({
|
|
176
|
+
chainId: 'test',
|
|
177
|
+
rpcUrl: 'http://rpc.example.com',
|
|
178
|
+
gasPrice: '1.0umfx',
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
expect(result.valid).toBe(false);
|
|
182
|
+
expect(result.errors.some(e => e.includes('HTTPS'))).toBe(true);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('should accept valid rateLimit config', () => {
|
|
186
|
+
const result = validateConfig({
|
|
187
|
+
chainId: 'test',
|
|
188
|
+
rpcUrl: 'https://example.com',
|
|
189
|
+
gasPrice: '1.0umfx',
|
|
190
|
+
rateLimit: { requestsPerSecond: 5 },
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
expect(result.valid).toBe(true);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('should reject non-integer rateLimit.requestsPerSecond', () => {
|
|
197
|
+
const result = validateConfig({
|
|
198
|
+
chainId: 'test',
|
|
199
|
+
rpcUrl: 'https://example.com',
|
|
200
|
+
gasPrice: '1.0umfx',
|
|
201
|
+
rateLimit: { requestsPerSecond: 5.5 },
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
expect(result.valid).toBe(false);
|
|
205
|
+
expect(result.errors.some(e => e.includes('requestsPerSecond'))).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('should reject negative rateLimit.requestsPerSecond', () => {
|
|
209
|
+
const result = validateConfig({
|
|
210
|
+
chainId: 'test',
|
|
211
|
+
rpcUrl: 'https://example.com',
|
|
212
|
+
gasPrice: '1.0umfx',
|
|
213
|
+
rateLimit: { requestsPerSecond: -1 },
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
expect(result.valid).toBe(false);
|
|
217
|
+
expect(result.errors.some(e => e.includes('requestsPerSecond'))).toBe(true);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it('should reject zero rateLimit.requestsPerSecond', () => {
|
|
221
|
+
const result = validateConfig({
|
|
222
|
+
chainId: 'test',
|
|
223
|
+
rpcUrl: 'https://example.com',
|
|
224
|
+
gasPrice: '1.0umfx',
|
|
225
|
+
rateLimit: { requestsPerSecond: 0 },
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
expect(result.valid).toBe(false);
|
|
229
|
+
expect(result.errors.some(e => e.includes('requestsPerSecond'))).toBe(true);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('should reject null rateLimit', () => {
|
|
233
|
+
const result = validateConfig({
|
|
234
|
+
chainId: 'test',
|
|
235
|
+
rpcUrl: 'https://example.com',
|
|
236
|
+
gasPrice: '1.0umfx',
|
|
237
|
+
rateLimit: null as unknown as { requestsPerSecond?: number },
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
expect(result.valid).toBe(false);
|
|
241
|
+
expect(result.errors.some(e => e.includes('rateLimit must be a plain object'))).toBe(true);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('should reject non-object rateLimit', () => {
|
|
245
|
+
const result = validateConfig({
|
|
246
|
+
chainId: 'test',
|
|
247
|
+
rpcUrl: 'https://example.com',
|
|
248
|
+
gasPrice: '1.0umfx',
|
|
249
|
+
rateLimit: 'invalid' as unknown as { requestsPerSecond?: number },
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
expect(result.valid).toBe(false);
|
|
253
|
+
expect(result.errors.some(e => e.includes('rateLimit must be a plain object'))).toBe(true);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it('should reject array rateLimit', () => {
|
|
257
|
+
const result = validateConfig({
|
|
258
|
+
chainId: 'test',
|
|
259
|
+
rpcUrl: 'https://example.com',
|
|
260
|
+
gasPrice: '1.0umfx',
|
|
261
|
+
rateLimit: [] as unknown as { requestsPerSecond?: number },
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
expect(result.valid).toBe(false);
|
|
265
|
+
expect(result.errors.some(e => e.includes('rateLimit must be a plain object'))).toBe(true);
|
|
266
|
+
});
|
|
111
267
|
});
|
|
112
268
|
|
|
113
269
|
describe('createValidatedConfig', () => {
|
package/src/config.ts
CHANGED
|
@@ -11,15 +11,47 @@ const DEFAULT_GAS_ADJUSTMENT = 1.3;
|
|
|
11
11
|
const DEFAULT_ADDRESS_PREFIX = 'manifest';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* Default requests per second for rate limiting
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
export const DEFAULT_REQUESTS_PER_SECOND = 10;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Check if a hostname is localhost (IPv4, IPv6, or hostname)
|
|
20
|
+
* Handles both bracketed and unbracketed IPv6 formats
|
|
21
|
+
*/
|
|
22
|
+
function isLocalhostHostname(hostname: string): boolean {
|
|
23
|
+
if (hostname === 'localhost' || hostname === '127.0.0.1') {
|
|
19
24
|
return true;
|
|
25
|
+
}
|
|
26
|
+
// Handle IPv6 localhost - hostname may be '::1' or '[::1]' depending on environment
|
|
27
|
+
const normalizedHostname = hostname.replace(/^\[|\]$/g, '');
|
|
28
|
+
return normalizedHostname === '::1';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Validate URL format and check if it uses HTTPS or is localhost (HTTP allowed for local dev)
|
|
33
|
+
* Returns validation result with error reason if invalid
|
|
34
|
+
*/
|
|
35
|
+
function validateRpcUrl(url: string): { valid: boolean; reason?: string } {
|
|
36
|
+
let parsed: URL;
|
|
37
|
+
try {
|
|
38
|
+
parsed = new URL(url);
|
|
20
39
|
} catch {
|
|
21
|
-
return false;
|
|
40
|
+
return { valid: false, reason: 'rpcUrl must be a valid URL' };
|
|
22
41
|
}
|
|
42
|
+
|
|
43
|
+
if (parsed.protocol === 'https:') {
|
|
44
|
+
return { valid: true };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (parsed.protocol === 'http:' && isLocalhostHostname(parsed.hostname)) {
|
|
48
|
+
return { valid: true }; // HTTP allowed for localhost
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
valid: false,
|
|
53
|
+
reason: `RPC URL must use HTTPS (got ${parsed.protocol}//). HTTP is only allowed for local development (localhost, 127.0.0.1, ::1).`,
|
|
54
|
+
};
|
|
23
55
|
}
|
|
24
56
|
|
|
25
57
|
/**
|
|
@@ -48,6 +80,9 @@ export function createConfig(input: ManifestMCPConfig): ManifestMCPConfig {
|
|
|
48
80
|
gasPrice: input.gasPrice,
|
|
49
81
|
gasAdjustment: input.gasAdjustment ?? DEFAULT_GAS_ADJUSTMENT,
|
|
50
82
|
addressPrefix: input.addressPrefix ?? DEFAULT_ADDRESS_PREFIX,
|
|
83
|
+
rateLimit: {
|
|
84
|
+
requestsPerSecond: input.rateLimit?.requestsPerSecond ?? DEFAULT_REQUESTS_PER_SECOND,
|
|
85
|
+
},
|
|
51
86
|
};
|
|
52
87
|
}
|
|
53
88
|
|
|
@@ -74,8 +109,11 @@ export function validateConfig(config: Partial<ManifestMCPConfig>): ValidationRe
|
|
|
74
109
|
|
|
75
110
|
if (!config.rpcUrl) {
|
|
76
111
|
errors.push('rpcUrl is required');
|
|
77
|
-
} else
|
|
78
|
-
|
|
112
|
+
} else {
|
|
113
|
+
const urlCheck = validateRpcUrl(config.rpcUrl);
|
|
114
|
+
if (!urlCheck.valid) {
|
|
115
|
+
errors.push(urlCheck.reason!);
|
|
116
|
+
}
|
|
79
117
|
}
|
|
80
118
|
|
|
81
119
|
if (!config.gasPrice) {
|
|
@@ -97,6 +135,20 @@ export function validateConfig(config: Partial<ManifestMCPConfig>): ValidationRe
|
|
|
97
135
|
}
|
|
98
136
|
}
|
|
99
137
|
|
|
138
|
+
if (config.rateLimit !== undefined) {
|
|
139
|
+
if (typeof config.rateLimit !== 'object' || config.rateLimit === null || Array.isArray(config.rateLimit)) {
|
|
140
|
+
errors.push('rateLimit must be a plain object');
|
|
141
|
+
} else if (config.rateLimit.requestsPerSecond !== undefined) {
|
|
142
|
+
if (
|
|
143
|
+
typeof config.rateLimit.requestsPerSecond !== 'number' ||
|
|
144
|
+
config.rateLimit.requestsPerSecond <= 0 ||
|
|
145
|
+
!Number.isInteger(config.rateLimit.requestsPerSecond)
|
|
146
|
+
) {
|
|
147
|
+
errors.push('rateLimit.requestsPerSecond must be a positive integer');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
100
152
|
return {
|
|
101
153
|
valid: errors.length === 0,
|
|
102
154
|
errors,
|
package/src/cosmos.ts
CHANGED
|
@@ -47,6 +47,9 @@ export async function cosmosQuery(
|
|
|
47
47
|
validateName(module, 'module');
|
|
48
48
|
validateName(subcommand, 'subcommand');
|
|
49
49
|
|
|
50
|
+
// Apply rate limiting before making RPC request
|
|
51
|
+
await clientManager.acquireRateLimit();
|
|
52
|
+
|
|
50
53
|
const queryClient = await clientManager.getQueryClient();
|
|
51
54
|
|
|
52
55
|
let result: Record<string, unknown>;
|
|
@@ -108,6 +111,9 @@ export async function cosmosTx(
|
|
|
108
111
|
validateName(module, 'module');
|
|
109
112
|
validateName(subcommand, 'subcommand');
|
|
110
113
|
|
|
114
|
+
// Apply rate limiting before making RPC request
|
|
115
|
+
await clientManager.acquireRateLimit();
|
|
116
|
+
|
|
111
117
|
const signingClient = await clientManager.getSigningClient();
|
|
112
118
|
const senderAddress = await clientManager.getAddress();
|
|
113
119
|
const config = clientManager.getConfig();
|