@gala-chain/launchpad-mcp-server 1.3.0 → 1.5.0

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 (48) hide show
  1. package/README.md +128 -0
  2. package/dist/constants/mcpToolNames.d.ts +159 -0
  3. package/dist/constants/mcpToolNames.d.ts.map +1 -0
  4. package/dist/constants/mcpToolNames.js +131 -0
  5. package/dist/constants/mcpToolNames.js.map +1 -0
  6. package/dist/prompts/__tests__/promptStructure.test.d.ts +7 -0
  7. package/dist/prompts/__tests__/promptStructure.test.d.ts.map +1 -0
  8. package/dist/prompts/__tests__/promptStructure.test.js +106 -0
  9. package/dist/prompts/__tests__/promptStructure.test.js.map +1 -0
  10. package/dist/prompts/__tests__/registry.test.d.ts +7 -0
  11. package/dist/prompts/__tests__/registry.test.d.ts.map +1 -0
  12. package/dist/prompts/__tests__/registry.test.js +119 -0
  13. package/dist/prompts/__tests__/registry.test.js.map +1 -0
  14. package/dist/prompts/analysis.d.ts +31 -0
  15. package/dist/prompts/analysis.d.ts.map +1 -0
  16. package/dist/prompts/analysis.js +342 -0
  17. package/dist/prompts/analysis.js.map +1 -0
  18. package/dist/prompts/index.d.ts +83 -0
  19. package/dist/prompts/index.d.ts.map +1 -0
  20. package/dist/prompts/index.js +117 -0
  21. package/dist/prompts/index.js.map +1 -0
  22. package/dist/prompts/portfolio.d.ts +31 -0
  23. package/dist/prompts/portfolio.d.ts.map +1 -0
  24. package/dist/prompts/portfolio.js +233 -0
  25. package/dist/prompts/portfolio.js.map +1 -0
  26. package/dist/prompts/trading.d.ts +27 -0
  27. package/dist/prompts/trading.d.ts.map +1 -0
  28. package/dist/prompts/trading.js +179 -0
  29. package/dist/prompts/trading.js.map +1 -0
  30. package/dist/prompts/utils/workflowTemplates.d.ts +103 -0
  31. package/dist/prompts/utils/workflowTemplates.d.ts.map +1 -0
  32. package/dist/prompts/utils/workflowTemplates.js +315 -0
  33. package/dist/prompts/utils/workflowTemplates.js.map +1 -0
  34. package/dist/server.d.ts +4 -0
  35. package/dist/server.d.ts.map +1 -1
  36. package/dist/server.js +51 -1
  37. package/dist/server.js.map +1 -1
  38. package/dist/types/mcp.d.ts +29 -0
  39. package/dist/types/mcp.d.ts.map +1 -1
  40. package/dist/utils/__tests__/validation.test.d.ts +7 -0
  41. package/dist/utils/__tests__/validation.test.d.ts.map +1 -0
  42. package/dist/utils/__tests__/validation.test.js +122 -0
  43. package/dist/utils/__tests__/validation.test.js.map +1 -0
  44. package/dist/utils/validation.d.ts +162 -0
  45. package/dist/utils/validation.d.ts.map +1 -0
  46. package/dist/utils/validation.js +276 -0
  47. package/dist/utils/validation.js.map +1 -0
  48. package/package.json +2 -2
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /**
3
+ * Validation Utilities Tests
4
+ *
5
+ * Tests for input validation functions
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const validation_1 = require("../validation");
9
+ describe('Validation Utilities', () => {
10
+ describe('validateTokenName()', () => {
11
+ it('should accept valid token names', () => {
12
+ expect(() => (0, validation_1.validateTokenName)('anime')).not.toThrow();
13
+ expect(() => (0, validation_1.validateTokenName)('test123')).not.toThrow();
14
+ expect(() => (0, validation_1.validateTokenName)('my-token')).not.toThrow();
15
+ expect(() => (0, validation_1.validateTokenName)('my_token')).not.toThrow();
16
+ expect(() => (0, validation_1.validateTokenName)('TEST-123')).not.toThrow();
17
+ });
18
+ it('should reject invalid token names', () => {
19
+ expect(() => (0, validation_1.validateTokenName)('')).toThrow(validation_1.ValidationError);
20
+ expect(() => (0, validation_1.validateTokenName)('a')).toThrow(validation_1.ValidationError);
21
+ expect(() => (0, validation_1.validateTokenName)('verylongtokennamethatexceedstwentycharacters')).toThrow(validation_1.ValidationError);
22
+ expect(() => (0, validation_1.validateTokenName)('token@#$')).toThrow(validation_1.ValidationError);
23
+ expect(() => (0, validation_1.validateTokenName)('token with spaces')).toThrow(validation_1.ValidationError);
24
+ });
25
+ });
26
+ describe('validateNumericAmount()', () => {
27
+ it('should accept valid numeric amounts', () => {
28
+ expect(() => (0, validation_1.validateNumericAmount)('100', 'amount')).not.toThrow();
29
+ expect(() => (0, validation_1.validateNumericAmount)('0.5', 'amount')).not.toThrow();
30
+ expect(() => (0, validation_1.validateNumericAmount)('99999.99', 'amount')).not.toThrow();
31
+ expect(() => (0, validation_1.validateNumericAmount)(100, 'amount')).not.toThrow();
32
+ });
33
+ it('should reject invalid numeric amounts', () => {
34
+ expect(() => (0, validation_1.validateNumericAmount)('', 'amount')).toThrow(validation_1.ValidationError);
35
+ expect(() => (0, validation_1.validateNumericAmount)('abc', 'amount')).toThrow(validation_1.ValidationError);
36
+ expect(() => (0, validation_1.validateNumericAmount)('-5', 'amount')).toThrow(validation_1.ValidationError);
37
+ expect(() => (0, validation_1.validateNumericAmount)('0', 'amount')).toThrow(validation_1.ValidationError);
38
+ expect(() => (0, validation_1.validateNumericAmount)(Infinity, 'amount')).toThrow(validation_1.ValidationError);
39
+ });
40
+ });
41
+ describe('validateSlippage()', () => {
42
+ it('should accept valid slippage values', () => {
43
+ expect(() => (0, validation_1.validateSlippage)('1')).not.toThrow();
44
+ expect(() => (0, validation_1.validateSlippage)('0.5')).not.toThrow();
45
+ expect(() => (0, validation_1.validateSlippage)('50')).not.toThrow();
46
+ expect(() => (0, validation_1.validateSlippage)('0.01')).not.toThrow();
47
+ expect(() => (0, validation_1.validateSlippage)('100')).not.toThrow();
48
+ });
49
+ it('should reject invalid slippage values', () => {
50
+ expect(() => (0, validation_1.validateSlippage)('0')).toThrow(validation_1.ValidationError);
51
+ expect(() => (0, validation_1.validateSlippage)('0.005')).toThrow(validation_1.ValidationError);
52
+ expect(() => (0, validation_1.validateSlippage)('101')).toThrow(validation_1.ValidationError);
53
+ expect(() => (0, validation_1.validateSlippage)('-1')).toThrow(validation_1.ValidationError);
54
+ });
55
+ });
56
+ describe('validateAddress()', () => {
57
+ it('should accept valid addresses', () => {
58
+ expect(() => (0, validation_1.validateAddress)('eth|0x1234567890abcdef1234567890abcdef12345678')).not.toThrow();
59
+ expect(() => (0, validation_1.validateAddress)('0x1234567890abcdef1234567890abcdef12345678')).not.toThrow();
60
+ expect(() => (0, validation_1.validateAddress)('0xABCDEF1234567890abcdef1234567890ABCDEF12')).not.toThrow();
61
+ });
62
+ it('should reject invalid addresses', () => {
63
+ expect(() => (0, validation_1.validateAddress)('')).toThrow(validation_1.ValidationError);
64
+ expect(() => (0, validation_1.validateAddress)('invalid')).toThrow(validation_1.ValidationError);
65
+ expect(() => (0, validation_1.validateAddress)('0x123')).toThrow(validation_1.ValidationError);
66
+ expect(() => (0, validation_1.validateAddress)('eth|123')).toThrow(validation_1.ValidationError);
67
+ });
68
+ });
69
+ describe('validateTokenSymbol()', () => {
70
+ it('should accept valid symbols', () => {
71
+ expect(() => (0, validation_1.validateTokenSymbol)('GALA')).not.toThrow();
72
+ expect(() => (0, validation_1.validateTokenSymbol)('TEST')).not.toThrow();
73
+ expect(() => (0, validation_1.validateTokenSymbol)('A')).not.toThrow();
74
+ expect(() => (0, validation_1.validateTokenSymbol)('ABCDEFGH')).not.toThrow();
75
+ });
76
+ it('should reject invalid symbols', () => {
77
+ expect(() => (0, validation_1.validateTokenSymbol)('')).toThrow(validation_1.ValidationError);
78
+ expect(() => (0, validation_1.validateTokenSymbol)('test')).toThrow(validation_1.ValidationError);
79
+ expect(() => (0, validation_1.validateTokenSymbol)('TOOLONG123')).toThrow(validation_1.ValidationError);
80
+ expect(() => (0, validation_1.validateTokenSymbol)('TEST123')).toThrow(validation_1.ValidationError);
81
+ });
82
+ });
83
+ describe('validatePaginationLimit()', () => {
84
+ it('should accept valid limits', () => {
85
+ expect(() => (0, validation_1.validatePaginationLimit)('1')).not.toThrow();
86
+ expect(() => (0, validation_1.validatePaginationLimit)('20')).not.toThrow();
87
+ expect(() => (0, validation_1.validatePaginationLimit)('100')).not.toThrow();
88
+ expect(() => (0, validation_1.validatePaginationLimit)(50)).not.toThrow();
89
+ });
90
+ it('should reject invalid limits', () => {
91
+ expect(() => (0, validation_1.validatePaginationLimit)('0')).toThrow(validation_1.ValidationError);
92
+ expect(() => (0, validation_1.validatePaginationLimit)('101')).toThrow(validation_1.ValidationError);
93
+ expect(() => (0, validation_1.validatePaginationLimit)('-1')).toThrow(validation_1.ValidationError);
94
+ expect(() => (0, validation_1.validatePaginationLimit)('abc')).toThrow(validation_1.ValidationError);
95
+ });
96
+ });
97
+ describe('validateTokenList()', () => {
98
+ it('should accept valid token lists', () => {
99
+ const result1 = (0, validation_1.validateTokenList)('anime,test,dragon');
100
+ expect(result1).toEqual(['anime', 'test', 'dragon']);
101
+ const result2 = (0, validation_1.validateTokenList)('token1');
102
+ expect(result2).toEqual(['token1']);
103
+ });
104
+ it('should reject invalid token lists', () => {
105
+ expect(() => (0, validation_1.validateTokenList)('')).toThrow(validation_1.ValidationError);
106
+ expect(() => (0, validation_1.validateTokenList)('token1,invalid@#$')).toThrow(validation_1.ValidationError);
107
+ });
108
+ });
109
+ describe('safeValidate()', () => {
110
+ it('should return success for valid input', () => {
111
+ const result = (0, validation_1.safeValidate)(() => (0, validation_1.validateTokenName)('anime'));
112
+ expect(result.success).toBe(true);
113
+ expect(result.error).toBeUndefined();
114
+ });
115
+ it('should return error for invalid input', () => {
116
+ const result = (0, validation_1.safeValidate)(() => (0, validation_1.validateTokenName)('invalid@#$'));
117
+ expect(result.success).toBe(false);
118
+ expect(result.error).toBeDefined();
119
+ });
120
+ });
121
+ });
122
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Validation Utilities for MCP Prompts
3
+ *
4
+ * Input validation functions for slash command arguments.
5
+ * Prevents malformed inputs and provides clear error messages.
6
+ */
7
+ /**
8
+ * Validation error class for better error handling
9
+ */
10
+ export declare class ValidationError extends Error {
11
+ field: string;
12
+ constructor(field: string, message: string);
13
+ }
14
+ /**
15
+ * Validate token name format
16
+ *
17
+ * Token names must be 2-20 characters, alphanumeric with hyphens and underscores.
18
+ *
19
+ * @param name - Token name to validate
20
+ * @param fieldName - Field name for error messages (default: 'tokenName')
21
+ * @throws {ValidationError} If token name is invalid
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * validateTokenName('anime'); // ✅ Valid
26
+ * validateTokenName('test-123'); // ✅ Valid
27
+ * validateTokenName('my_token'); // ✅ Valid
28
+ * validateTokenName('a'); // ❌ Throws: too short
29
+ * validateTokenName('token@#$'); // ❌ Throws: invalid characters
30
+ * ```
31
+ */
32
+ export declare function validateTokenName(name: string, fieldName?: string): void;
33
+ /**
34
+ * Validate numeric amount
35
+ *
36
+ * Amounts must be positive numbers (integers or decimals).
37
+ *
38
+ * @param amount - Amount to validate (string or number)
39
+ * @param fieldName - Field name for error messages
40
+ * @throws {ValidationError} If amount is invalid
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * validateNumericAmount('100', 'galaAmount'); // ✅ Valid
45
+ * validateNumericAmount('99.5', 'tokenAmount'); // ✅ Valid
46
+ * validateNumericAmount('-5', 'amount'); // ❌ Throws: negative
47
+ * validateNumericAmount('abc', 'amount'); // ❌ Throws: not a number
48
+ * ```
49
+ */
50
+ export declare function validateNumericAmount(amount: string | number, fieldName: string): void;
51
+ /**
52
+ * Validate slippage tolerance percentage
53
+ *
54
+ * Slippage must be between 0.01% and 100%.
55
+ *
56
+ * @param slippage - Slippage percentage to validate
57
+ * @param fieldName - Field name for error messages (default: 'slippage')
58
+ * @throws {ValidationError} If slippage is invalid
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * validateSlippage('1'); // ✅ Valid (1%)
63
+ * validateSlippage('0.5'); // ✅ Valid (0.5%)
64
+ * validateSlippage('50'); // ✅ Valid (50%)
65
+ * validateSlippage('0'); // ❌ Throws: too low
66
+ * validateSlippage('150'); // ❌ Throws: too high
67
+ * ```
68
+ */
69
+ export declare function validateSlippage(slippage: string | number, fieldName?: string): void;
70
+ /**
71
+ * Validate wallet address format
72
+ *
73
+ * Supports both GalaChain format (eth|0x...) and standard Ethereum format (0x...).
74
+ *
75
+ * @param address - Wallet address to validate
76
+ * @param fieldName - Field name for error messages (default: 'address')
77
+ * @throws {ValidationError} If address is invalid
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * validateAddress('eth|0x1234567890abcdef1234567890abcdef12345678'); // ✅ Valid
82
+ * validateAddress('0x1234567890abcdef1234567890abcdef12345678'); // ✅ Valid
83
+ * validateAddress('invalid'); // ❌ Throws: invalid format
84
+ * ```
85
+ */
86
+ export declare function validateAddress(address: string, fieldName?: string): void;
87
+ /**
88
+ * Validate token symbol format
89
+ *
90
+ * Symbols must be 1-8 uppercase letters.
91
+ *
92
+ * @param symbol - Token symbol to validate
93
+ * @param fieldName - Field name for error messages (default: 'symbol')
94
+ * @throws {ValidationError} If symbol is invalid
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * validateTokenSymbol('GALA'); // ✅ Valid
99
+ * validateTokenSymbol('TEST'); // ✅ Valid
100
+ * validateTokenSymbol('test'); // ❌ Throws: must be uppercase
101
+ * validateTokenSymbol('TOOLONG123'); // ❌ Throws: too long
102
+ * ```
103
+ */
104
+ export declare function validateTokenSymbol(symbol: string, fieldName?: string): void;
105
+ /**
106
+ * Validate pagination limit
107
+ *
108
+ * Limits must be positive integers within reasonable range (1-100).
109
+ *
110
+ * @param limit - Pagination limit to validate
111
+ * @param max - Maximum allowed limit (default: 100)
112
+ * @param fieldName - Field name for error messages (default: 'limit')
113
+ * @throws {ValidationError} If limit is invalid
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * validatePaginationLimit('20'); // ✅ Valid
118
+ * validatePaginationLimit('1'); // ✅ Valid
119
+ * validatePaginationLimit('0'); // ❌ Throws: too low
120
+ * validatePaginationLimit('150'); // ❌ Throws: too high
121
+ * ```
122
+ */
123
+ export declare function validatePaginationLimit(limit: string | number, max?: number, fieldName?: string): void;
124
+ /**
125
+ * Validate comma-separated token list
126
+ *
127
+ * For batch operations that accept multiple token names.
128
+ *
129
+ * @param tokens - Comma-separated token names
130
+ * @param fieldName - Field name for error messages (default: 'tokens')
131
+ * @throws {ValidationError} If token list is invalid
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * validateTokenList('anime,test,dragon'); // ✅ Valid
136
+ * validateTokenList('token1'); // ✅ Valid (single token)
137
+ * validateTokenList(''); // ❌ Throws: empty list
138
+ * validateTokenList('token1,invalid@#$'); // ❌ Throws: invalid token name
139
+ * ```
140
+ */
141
+ export declare function validateTokenList(tokens: string, fieldName?: string): string[];
142
+ /**
143
+ * Safe validation wrapper that doesn't throw
144
+ *
145
+ * Useful for non-critical validation where you want to continue with a warning.
146
+ *
147
+ * @param validationFn - Validation function to execute
148
+ * @returns Object with success flag and optional error
149
+ *
150
+ * @example
151
+ * ```typescript
152
+ * const result = safeValidate(() => validateTokenName('anime'));
153
+ * if (!result.success) {
154
+ * console.warn('Validation warning:', result.error);
155
+ * }
156
+ * ```
157
+ */
158
+ export declare function safeValidate(validationFn: () => void): {
159
+ success: boolean;
160
+ error?: string;
161
+ };
162
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAE/B,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAc,GAAG,IAAI,CAmB7E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,IAAI,CAqBN;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,SAAS,SAAa,GACrB,IAAI,CAoBN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAY,GAAG,IAAI,CAgB5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAW,GAAG,IAAI,CAmB9E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,GAAG,SAAM,EACT,SAAS,SAAU,GAClB,IAAI,CAoBN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAW,GAAG,MAAM,EAAE,CA2BhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,IAAI,GACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAUtC"}
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+ /**
3
+ * Validation Utilities for MCP Prompts
4
+ *
5
+ * Input validation functions for slash command arguments.
6
+ * Prevents malformed inputs and provides clear error messages.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ValidationError = void 0;
10
+ exports.validateTokenName = validateTokenName;
11
+ exports.validateNumericAmount = validateNumericAmount;
12
+ exports.validateSlippage = validateSlippage;
13
+ exports.validateAddress = validateAddress;
14
+ exports.validateTokenSymbol = validateTokenSymbol;
15
+ exports.validatePaginationLimit = validatePaginationLimit;
16
+ exports.validateTokenList = validateTokenList;
17
+ exports.safeValidate = safeValidate;
18
+ /**
19
+ * Validation error class for better error handling
20
+ */
21
+ class ValidationError extends Error {
22
+ field;
23
+ constructor(field, message) {
24
+ super(`Validation error for '${field}': ${message}`);
25
+ this.field = field;
26
+ this.name = 'ValidationError';
27
+ }
28
+ }
29
+ exports.ValidationError = ValidationError;
30
+ /**
31
+ * Validate token name format
32
+ *
33
+ * Token names must be 2-20 characters, alphanumeric with hyphens and underscores.
34
+ *
35
+ * @param name - Token name to validate
36
+ * @param fieldName - Field name for error messages (default: 'tokenName')
37
+ * @throws {ValidationError} If token name is invalid
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * validateTokenName('anime'); // ✅ Valid
42
+ * validateTokenName('test-123'); // ✅ Valid
43
+ * validateTokenName('my_token'); // ✅ Valid
44
+ * validateTokenName('a'); // ❌ Throws: too short
45
+ * validateTokenName('token@#$'); // ❌ Throws: invalid characters
46
+ * ```
47
+ */
48
+ function validateTokenName(name, fieldName = 'tokenName') {
49
+ if (!name || typeof name !== 'string') {
50
+ throw new ValidationError(fieldName, 'Token name is required');
51
+ }
52
+ if (name.length < 2 || name.length > 20) {
53
+ throw new ValidationError(fieldName, `Token name must be 2-20 characters (got ${name.length})`);
54
+ }
55
+ const tokenNameRegex = /^[a-zA-Z0-9-_]+$/;
56
+ if (!tokenNameRegex.test(name)) {
57
+ throw new ValidationError(fieldName, 'Token name can only contain letters, numbers, hyphens, and underscores');
58
+ }
59
+ }
60
+ /**
61
+ * Validate numeric amount
62
+ *
63
+ * Amounts must be positive numbers (integers or decimals).
64
+ *
65
+ * @param amount - Amount to validate (string or number)
66
+ * @param fieldName - Field name for error messages
67
+ * @throws {ValidationError} If amount is invalid
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * validateNumericAmount('100', 'galaAmount'); // ✅ Valid
72
+ * validateNumericAmount('99.5', 'tokenAmount'); // ✅ Valid
73
+ * validateNumericAmount('-5', 'amount'); // ❌ Throws: negative
74
+ * validateNumericAmount('abc', 'amount'); // ❌ Throws: not a number
75
+ * ```
76
+ */
77
+ function validateNumericAmount(amount, fieldName) {
78
+ if (amount === null || amount === undefined || amount === '') {
79
+ throw new ValidationError(fieldName, 'Amount is required');
80
+ }
81
+ const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount;
82
+ if (isNaN(numAmount)) {
83
+ throw new ValidationError(fieldName, `Amount must be a valid number (got: ${amount})`);
84
+ }
85
+ if (numAmount <= 0) {
86
+ throw new ValidationError(fieldName, `Amount must be positive (got: ${numAmount})`);
87
+ }
88
+ if (!isFinite(numAmount)) {
89
+ throw new ValidationError(fieldName, 'Amount must be a finite number');
90
+ }
91
+ }
92
+ /**
93
+ * Validate slippage tolerance percentage
94
+ *
95
+ * Slippage must be between 0.01% and 100%.
96
+ *
97
+ * @param slippage - Slippage percentage to validate
98
+ * @param fieldName - Field name for error messages (default: 'slippage')
99
+ * @throws {ValidationError} If slippage is invalid
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * validateSlippage('1'); // ✅ Valid (1%)
104
+ * validateSlippage('0.5'); // ✅ Valid (0.5%)
105
+ * validateSlippage('50'); // ✅ Valid (50%)
106
+ * validateSlippage('0'); // ❌ Throws: too low
107
+ * validateSlippage('150'); // ❌ Throws: too high
108
+ * ```
109
+ */
110
+ function validateSlippage(slippage, fieldName = 'slippage') {
111
+ if (slippage === null || slippage === undefined || slippage === '') {
112
+ throw new ValidationError(fieldName, 'Slippage is required');
113
+ }
114
+ const numSlippage = typeof slippage === 'string' ? parseFloat(slippage) : slippage;
115
+ if (isNaN(numSlippage)) {
116
+ throw new ValidationError(fieldName, `Slippage must be a valid number (got: ${slippage})`);
117
+ }
118
+ if (numSlippage < 0.01 || numSlippage > 100) {
119
+ throw new ValidationError(fieldName, `Slippage must be between 0.01% and 100% (got: ${numSlippage}%)`);
120
+ }
121
+ }
122
+ /**
123
+ * Validate wallet address format
124
+ *
125
+ * Supports both GalaChain format (eth|0x...) and standard Ethereum format (0x...).
126
+ *
127
+ * @param address - Wallet address to validate
128
+ * @param fieldName - Field name for error messages (default: 'address')
129
+ * @throws {ValidationError} If address is invalid
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * validateAddress('eth|0x1234567890abcdef1234567890abcdef12345678'); // ✅ Valid
134
+ * validateAddress('0x1234567890abcdef1234567890abcdef12345678'); // ✅ Valid
135
+ * validateAddress('invalid'); // ❌ Throws: invalid format
136
+ * ```
137
+ */
138
+ function validateAddress(address, fieldName = 'address') {
139
+ if (!address || typeof address !== 'string') {
140
+ throw new ValidationError(fieldName, 'Address is required');
141
+ }
142
+ // GalaChain format: eth|0x{40 hex chars}
143
+ const galachainRegex = /^eth\|0x[a-fA-F0-9]{40}$/;
144
+ // Standard Ethereum format: 0x{40 hex chars}
145
+ const ethereumRegex = /^0x[a-fA-F0-9]{40}$/;
146
+ if (!galachainRegex.test(address) && !ethereumRegex.test(address)) {
147
+ throw new ValidationError(fieldName, 'Address must be in GalaChain format (eth|0x...) or Ethereum format (0x...)');
148
+ }
149
+ }
150
+ /**
151
+ * Validate token symbol format
152
+ *
153
+ * Symbols must be 1-8 uppercase letters.
154
+ *
155
+ * @param symbol - Token symbol to validate
156
+ * @param fieldName - Field name for error messages (default: 'symbol')
157
+ * @throws {ValidationError} If symbol is invalid
158
+ *
159
+ * @example
160
+ * ```typescript
161
+ * validateTokenSymbol('GALA'); // ✅ Valid
162
+ * validateTokenSymbol('TEST'); // ✅ Valid
163
+ * validateTokenSymbol('test'); // ❌ Throws: must be uppercase
164
+ * validateTokenSymbol('TOOLONG123'); // ❌ Throws: too long
165
+ * ```
166
+ */
167
+ function validateTokenSymbol(symbol, fieldName = 'symbol') {
168
+ if (!symbol || typeof symbol !== 'string') {
169
+ throw new ValidationError(fieldName, 'Symbol is required');
170
+ }
171
+ if (symbol.length < 1 || symbol.length > 8) {
172
+ throw new ValidationError(fieldName, `Symbol must be 1-8 characters (got ${symbol.length})`);
173
+ }
174
+ const symbolRegex = /^[A-Z]+$/;
175
+ if (!symbolRegex.test(symbol)) {
176
+ throw new ValidationError(fieldName, 'Symbol must be uppercase letters only (A-Z)');
177
+ }
178
+ }
179
+ /**
180
+ * Validate pagination limit
181
+ *
182
+ * Limits must be positive integers within reasonable range (1-100).
183
+ *
184
+ * @param limit - Pagination limit to validate
185
+ * @param max - Maximum allowed limit (default: 100)
186
+ * @param fieldName - Field name for error messages (default: 'limit')
187
+ * @throws {ValidationError} If limit is invalid
188
+ *
189
+ * @example
190
+ * ```typescript
191
+ * validatePaginationLimit('20'); // ✅ Valid
192
+ * validatePaginationLimit('1'); // ✅ Valid
193
+ * validatePaginationLimit('0'); // ❌ Throws: too low
194
+ * validatePaginationLimit('150'); // ❌ Throws: too high
195
+ * ```
196
+ */
197
+ function validatePaginationLimit(limit, max = 100, fieldName = 'limit') {
198
+ if (limit === null || limit === undefined || limit === '') {
199
+ throw new ValidationError(fieldName, 'Limit is required');
200
+ }
201
+ const numLimit = typeof limit === 'string' ? parseInt(limit, 10) : limit;
202
+ if (isNaN(numLimit) || !Number.isInteger(numLimit)) {
203
+ throw new ValidationError(fieldName, `Limit must be a valid integer (got: ${limit})`);
204
+ }
205
+ if (numLimit < 1 || numLimit > max) {
206
+ throw new ValidationError(fieldName, `Limit must be between 1 and ${max} (got: ${numLimit})`);
207
+ }
208
+ }
209
+ /**
210
+ * Validate comma-separated token list
211
+ *
212
+ * For batch operations that accept multiple token names.
213
+ *
214
+ * @param tokens - Comma-separated token names
215
+ * @param fieldName - Field name for error messages (default: 'tokens')
216
+ * @throws {ValidationError} If token list is invalid
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * validateTokenList('anime,test,dragon'); // ✅ Valid
221
+ * validateTokenList('token1'); // ✅ Valid (single token)
222
+ * validateTokenList(''); // ❌ Throws: empty list
223
+ * validateTokenList('token1,invalid@#$'); // ❌ Throws: invalid token name
224
+ * ```
225
+ */
226
+ function validateTokenList(tokens, fieldName = 'tokens') {
227
+ if (!tokens || typeof tokens !== 'string') {
228
+ throw new ValidationError(fieldName, 'Token list is required');
229
+ }
230
+ const tokenArray = tokens.split(',').map((t) => t.trim());
231
+ if (tokenArray.length === 0 || tokenArray.some((t) => !t)) {
232
+ throw new ValidationError(fieldName, 'Token list cannot be empty');
233
+ }
234
+ // Validate each token name
235
+ tokenArray.forEach((token, index) => {
236
+ try {
237
+ validateTokenName(token, `${fieldName}[${index}]`);
238
+ }
239
+ catch (error) {
240
+ if (error instanceof ValidationError) {
241
+ throw new ValidationError(fieldName, `Invalid token at position ${index + 1}: ${token}`);
242
+ }
243
+ throw error;
244
+ }
245
+ });
246
+ return tokenArray;
247
+ }
248
+ /**
249
+ * Safe validation wrapper that doesn't throw
250
+ *
251
+ * Useful for non-critical validation where you want to continue with a warning.
252
+ *
253
+ * @param validationFn - Validation function to execute
254
+ * @returns Object with success flag and optional error
255
+ *
256
+ * @example
257
+ * ```typescript
258
+ * const result = safeValidate(() => validateTokenName('anime'));
259
+ * if (!result.success) {
260
+ * console.warn('Validation warning:', result.error);
261
+ * }
262
+ * ```
263
+ */
264
+ function safeValidate(validationFn) {
265
+ try {
266
+ validationFn();
267
+ return { success: true };
268
+ }
269
+ catch (error) {
270
+ if (error instanceof ValidationError) {
271
+ return { success: false, error: error.message };
272
+ }
273
+ return { success: false, error: String(error) };
274
+ }
275
+ }
276
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gala-chain/launchpad-mcp-server",
3
- "version": "1.3.0",
4
- "description": "MCP server for Gala Launchpad SDK with 47 tools - AI agents can interact with Gala Launchpad and learn SDK usage",
3
+ "version": "1.5.0",
4
+ "description": "MCP server for Gala Launchpad SDK with 47 tools + 14 slash commands - Production-grade AI agent integration with comprehensive validation, optimized performance, and 80%+ test coverage",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
7
7
  "gala-launchpad-mcp": "./dist/index.js"