@kasarlabs/unruggable-mcp 0.1.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.
- package/LICENSE +21 -0
- package/README.md +31 -0
- package/bin/unruggable-mcp.js +14 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +69 -0
- package/build/index.js.map +1 -0
- package/build/lib/abis/unruggableFactory.d.ts +92 -0
- package/build/lib/abis/unruggableFactory.js +512 -0
- package/build/lib/abis/unruggableFactory.js.map +1 -0
- package/build/lib/constants/index.d.ts +1 -0
- package/build/lib/constants/index.js +2 -0
- package/build/lib/constants/index.js.map +1 -0
- package/build/lib/dependances/types.d.ts +85 -0
- package/build/lib/dependances/types.js +51 -0
- package/build/lib/dependances/types.js.map +1 -0
- package/build/lib/utils/helper.d.ts +6 -0
- package/build/lib/utils/helper.js +12 -0
- package/build/lib/utils/helper.js.map +1 -0
- package/build/schemas/index.d.ts +135 -0
- package/build/schemas/index.js +73 -0
- package/build/schemas/index.js.map +1 -0
- package/build/tools/createMemecoin.d.ts +11 -0
- package/build/tools/createMemecoin.js +28 -0
- package/build/tools/createMemecoin.js.map +1 -0
- package/build/tools/getLockedLiquidity.d.ts +27 -0
- package/build/tools/getLockedLiquidity.js +48 -0
- package/build/tools/getLockedLiquidity.js.map +1 -0
- package/build/tools/isMemecoin.d.ts +11 -0
- package/build/tools/isMemecoin.js +22 -0
- package/build/tools/isMemecoin.js.map +1 -0
- package/build/tools/launchOnEkubo.d.ts +11 -0
- package/build/tools/launchOnEkubo.js +41 -0
- package/build/tools/launchOnEkubo.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CallData } from 'starknet';
|
|
2
|
+
import { FACTORY_ADDRESS } from '../constants/index.js';
|
|
3
|
+
export const execute = async (method, env, calldata) => {
|
|
4
|
+
const account = env.account;
|
|
5
|
+
return await account.execute({
|
|
6
|
+
contractAddress: FACTORY_ADDRESS,
|
|
7
|
+
entrypoint: method,
|
|
8
|
+
calldata: CallData.compile(calldata),
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
export const decimalsScale = (decimals) => `1${Array(decimals).fill('0').join('')}`;
|
|
12
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/lib/utils/helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAW,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA2BxD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,MAAc,EACd,GAAiB,EACjB,QAA8B,EAC9B,EAAE;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC;QAC3B,eAAe,EAAE,eAAe;QAChC,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;KACrC,CAAC,CAAC;AACL,CAAC,CAAC;AA2BF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,EAAE,CAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
export declare const contractAddressSchema: z.ZodObject<{
|
|
3
|
+
contractAddress: z.ZodString;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
contractAddress: string;
|
|
6
|
+
}, {
|
|
7
|
+
contractAddress: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const createMemecoinSchema: z.ZodObject<{
|
|
10
|
+
owner: z.ZodString;
|
|
11
|
+
name: z.ZodString;
|
|
12
|
+
symbol: z.ZodString;
|
|
13
|
+
initialSupply: z.ZodString;
|
|
14
|
+
salt: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
symbol: string;
|
|
17
|
+
owner: string;
|
|
18
|
+
name: string;
|
|
19
|
+
initialSupply: string;
|
|
20
|
+
salt?: string | undefined;
|
|
21
|
+
}, {
|
|
22
|
+
symbol: string;
|
|
23
|
+
owner: string;
|
|
24
|
+
name: string;
|
|
25
|
+
initialSupply: string;
|
|
26
|
+
salt?: string | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const launchOnEkuboSchema: z.ZodObject<{
|
|
29
|
+
launchParams: z.ZodEffects<z.ZodObject<{
|
|
30
|
+
memecoinAddress: z.ZodString;
|
|
31
|
+
transferRestrictionDelay: z.ZodNumber;
|
|
32
|
+
maxPercentageBuyLaunch: z.ZodNumber;
|
|
33
|
+
quoteAddress: z.ZodString;
|
|
34
|
+
initialHolders: z.ZodArray<z.ZodString, "many">;
|
|
35
|
+
initialHoldersAmounts: z.ZodArray<z.ZodString, "many">;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
memecoinAddress: string;
|
|
38
|
+
transferRestrictionDelay: number;
|
|
39
|
+
maxPercentageBuyLaunch: number;
|
|
40
|
+
quoteAddress: string;
|
|
41
|
+
initialHolders: string[];
|
|
42
|
+
initialHoldersAmounts: string[];
|
|
43
|
+
}, {
|
|
44
|
+
memecoinAddress: string;
|
|
45
|
+
transferRestrictionDelay: number;
|
|
46
|
+
maxPercentageBuyLaunch: number;
|
|
47
|
+
quoteAddress: string;
|
|
48
|
+
initialHolders: string[];
|
|
49
|
+
initialHoldersAmounts: string[];
|
|
50
|
+
}>, {
|
|
51
|
+
memecoinAddress: string;
|
|
52
|
+
transferRestrictionDelay: number;
|
|
53
|
+
maxPercentageBuyLaunch: number;
|
|
54
|
+
quoteAddress: string;
|
|
55
|
+
initialHolders: string[];
|
|
56
|
+
initialHoldersAmounts: string[];
|
|
57
|
+
}, {
|
|
58
|
+
memecoinAddress: string;
|
|
59
|
+
transferRestrictionDelay: number;
|
|
60
|
+
maxPercentageBuyLaunch: number;
|
|
61
|
+
quoteAddress: string;
|
|
62
|
+
initialHolders: string[];
|
|
63
|
+
initialHoldersAmounts: string[];
|
|
64
|
+
}>;
|
|
65
|
+
ekuboParams: z.ZodObject<{
|
|
66
|
+
fee: z.ZodEffects<z.ZodString, string, string>;
|
|
67
|
+
tickSpacing: z.ZodString;
|
|
68
|
+
startingPrice: z.ZodObject<{
|
|
69
|
+
mag: z.ZodString;
|
|
70
|
+
sign: z.ZodBoolean;
|
|
71
|
+
}, "strip", z.ZodTypeAny, {
|
|
72
|
+
mag: string;
|
|
73
|
+
sign: boolean;
|
|
74
|
+
}, {
|
|
75
|
+
mag: string;
|
|
76
|
+
sign: boolean;
|
|
77
|
+
}>;
|
|
78
|
+
bound: z.ZodString;
|
|
79
|
+
}, "strip", z.ZodTypeAny, {
|
|
80
|
+
fee: string;
|
|
81
|
+
tickSpacing: string;
|
|
82
|
+
startingPrice: {
|
|
83
|
+
mag: string;
|
|
84
|
+
sign: boolean;
|
|
85
|
+
};
|
|
86
|
+
bound: string;
|
|
87
|
+
}, {
|
|
88
|
+
fee: string;
|
|
89
|
+
tickSpacing: string;
|
|
90
|
+
startingPrice: {
|
|
91
|
+
mag: string;
|
|
92
|
+
sign: boolean;
|
|
93
|
+
};
|
|
94
|
+
bound: string;
|
|
95
|
+
}>;
|
|
96
|
+
}, "strip", z.ZodTypeAny, {
|
|
97
|
+
launchParams: {
|
|
98
|
+
memecoinAddress: string;
|
|
99
|
+
transferRestrictionDelay: number;
|
|
100
|
+
maxPercentageBuyLaunch: number;
|
|
101
|
+
quoteAddress: string;
|
|
102
|
+
initialHolders: string[];
|
|
103
|
+
initialHoldersAmounts: string[];
|
|
104
|
+
};
|
|
105
|
+
ekuboParams: {
|
|
106
|
+
fee: string;
|
|
107
|
+
tickSpacing: string;
|
|
108
|
+
startingPrice: {
|
|
109
|
+
mag: string;
|
|
110
|
+
sign: boolean;
|
|
111
|
+
};
|
|
112
|
+
bound: string;
|
|
113
|
+
};
|
|
114
|
+
}, {
|
|
115
|
+
launchParams: {
|
|
116
|
+
memecoinAddress: string;
|
|
117
|
+
transferRestrictionDelay: number;
|
|
118
|
+
maxPercentageBuyLaunch: number;
|
|
119
|
+
quoteAddress: string;
|
|
120
|
+
initialHolders: string[];
|
|
121
|
+
initialHoldersAmounts: string[];
|
|
122
|
+
};
|
|
123
|
+
ekuboParams: {
|
|
124
|
+
fee: string;
|
|
125
|
+
tickSpacing: string;
|
|
126
|
+
startingPrice: {
|
|
127
|
+
mag: string;
|
|
128
|
+
sign: boolean;
|
|
129
|
+
};
|
|
130
|
+
bound: string;
|
|
131
|
+
};
|
|
132
|
+
}>;
|
|
133
|
+
export type LaunchOnEkuboParams = z.infer<typeof launchOnEkuboSchema>;
|
|
134
|
+
export type CreateMemecoinParams = z.infer<typeof createMemecoinSchema>;
|
|
135
|
+
export type ContractAddressParams = z.infer<typeof contractAddressSchema>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
export const contractAddressSchema = z.object({
|
|
3
|
+
contractAddress: z.string().describe('The address of the contract'),
|
|
4
|
+
});
|
|
5
|
+
export const createMemecoinSchema = z.object({
|
|
6
|
+
owner: z.string().describe('Owner address of the memecoin'),
|
|
7
|
+
name: z.string().describe('Name of the memecoin'),
|
|
8
|
+
symbol: z.string().describe('Symbol/ticker of the memecoin'),
|
|
9
|
+
initialSupply: z.string().describe('Initial supply of tokens (in wei)'),
|
|
10
|
+
salt: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Optional salt for contract address generation'),
|
|
14
|
+
});
|
|
15
|
+
const launchParametersSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
memecoinAddress: z
|
|
18
|
+
.string()
|
|
19
|
+
.regex(/^0x[0-9a-fA-F]{63,64}$/)
|
|
20
|
+
.describe('Address of the memecoin contract to be launched'),
|
|
21
|
+
transferRestrictionDelay: z
|
|
22
|
+
.number()
|
|
23
|
+
.min(0)
|
|
24
|
+
.describe('Time period in seconds during which transfers are restricted after launch. Example: 86400 for 24 hours'),
|
|
25
|
+
maxPercentageBuyLaunch: z
|
|
26
|
+
.number()
|
|
27
|
+
.min(1)
|
|
28
|
+
.max(100)
|
|
29
|
+
.describe('Maximum percentage of total supply that can be bought by a single address at launch. Range: 1-100'),
|
|
30
|
+
quoteAddress: z
|
|
31
|
+
.string()
|
|
32
|
+
.regex(/^0x[0-9a-fA-F]{63,64}$/)
|
|
33
|
+
.describe('Address of the quote token (e.g., ETH) used for the trading pair'),
|
|
34
|
+
initialHolders: z
|
|
35
|
+
.array(z.string().regex(/^0x[0-9a-fA-F]{63,64}$/))
|
|
36
|
+
.min(1)
|
|
37
|
+
.describe('Array of addresses that will receive initial token distribution'),
|
|
38
|
+
initialHoldersAmounts: z
|
|
39
|
+
.array(z.string())
|
|
40
|
+
.min(1)
|
|
41
|
+
.describe('Array of token amounts (in wei) to be distributed to initial holders'),
|
|
42
|
+
})
|
|
43
|
+
.refine((data) => data.initialHolders.length === data.initialHoldersAmounts.length, {
|
|
44
|
+
message: 'Initial holders and amounts arrays must have the same length',
|
|
45
|
+
});
|
|
46
|
+
const ekuboPoolParametersSchema = z.object({
|
|
47
|
+
fee: z
|
|
48
|
+
.string()
|
|
49
|
+
.refine((value) => {
|
|
50
|
+
const fee = parseInt(value);
|
|
51
|
+
return fee >= 1 && fee <= 10000;
|
|
52
|
+
}, {
|
|
53
|
+
message: 'Fee must be between 1 and 10000 basis points (0.01% to 100%)',
|
|
54
|
+
})
|
|
55
|
+
.describe('Pool fee in basis points. Example: "3000" for 0.3%'),
|
|
56
|
+
tickSpacing: z
|
|
57
|
+
.string()
|
|
58
|
+
.describe('Determines the granularity of price points in the pool. Common values: "60" for 0.3% pools'),
|
|
59
|
+
startingPrice: z.object({
|
|
60
|
+
mag: z
|
|
61
|
+
.string()
|
|
62
|
+
.describe('Magnitude of the starting price in wei. Example: "1000000000000000000" for 1.0'),
|
|
63
|
+
sign: z.boolean().describe('true for positive price, false for negative'),
|
|
64
|
+
}),
|
|
65
|
+
bound: z
|
|
66
|
+
.string()
|
|
67
|
+
.describe('Defines the price range limit for the concentrated liquidity pool'),
|
|
68
|
+
});
|
|
69
|
+
export const launchOnEkuboSchema = z.object({
|
|
70
|
+
launchParams: launchParametersSchema,
|
|
71
|
+
ekuboParams: ekuboPoolParametersSchema,
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CreateMemecoinParams } from '../schemas/index.js';
|
|
2
|
+
import { onchainWrite } from '@kasarlabs/ask-starknet-core';
|
|
3
|
+
export declare const createMemecoin: (env: onchainWrite, params: CreateMemecoinParams) => Promise<{
|
|
4
|
+
status: string;
|
|
5
|
+
transactionHash: string;
|
|
6
|
+
error?: undefined;
|
|
7
|
+
} | {
|
|
8
|
+
status: string;
|
|
9
|
+
error: string;
|
|
10
|
+
transactionHash?: undefined;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { stark, uint256 } from 'starknet';
|
|
2
|
+
import { execute, decimalsScale } from '../lib/utils/helper.js';
|
|
3
|
+
export const createMemecoin = async (env, params) => {
|
|
4
|
+
try {
|
|
5
|
+
const provider = env.provider;
|
|
6
|
+
const salt = stark.randomAddress();
|
|
7
|
+
const { transaction_hash } = await execute('create_memecoin', env, [
|
|
8
|
+
params.owner,
|
|
9
|
+
params.name,
|
|
10
|
+
params.symbol,
|
|
11
|
+
uint256.bnToUint256(BigInt(params.initialSupply) * BigInt(decimalsScale(18))),
|
|
12
|
+
salt,
|
|
13
|
+
]);
|
|
14
|
+
await provider.waitForTransaction(transaction_hash);
|
|
15
|
+
return {
|
|
16
|
+
status: 'success',
|
|
17
|
+
transactionHash: transaction_hash,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error('Error creating memecoin:', error);
|
|
22
|
+
return {
|
|
23
|
+
status: 'failure',
|
|
24
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=createMemecoin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMemecoin.js","sourceRoot":"","sources":["../../src/tools/createMemecoin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAuDhE,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,GAAiB,EACjB,MAA4B,EAC5B,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACjE,MAAM,CAAC,KAAK;YACZ,MAAM,CAAC,IAAI;YACX,MAAM,CAAC,MAAM;YACb,OAAO,CAAC,WAAW,CACjB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CACzD;YACD,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QAEpD,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,gBAAgB;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ContractAddressParams } from '../schemas/index.js';
|
|
2
|
+
import { onchainWrite } from '@kasarlabs/ask-starknet-core';
|
|
3
|
+
type LiquidityType = {
|
|
4
|
+
type: 'JediERC20';
|
|
5
|
+
address: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: 'StarkDeFiERC20';
|
|
8
|
+
address: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'EkuboNFT';
|
|
11
|
+
tokenId: number;
|
|
12
|
+
};
|
|
13
|
+
interface LockedLiquidityInfo {
|
|
14
|
+
hasLockedLiquidity: boolean;
|
|
15
|
+
liquidityType?: LiquidityType;
|
|
16
|
+
liquidityContractAddress?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const getLockedLiquidity: (env: onchainWrite, params: ContractAddressParams) => Promise<{
|
|
19
|
+
status: string;
|
|
20
|
+
data: LockedLiquidityInfo;
|
|
21
|
+
error?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
status: string;
|
|
24
|
+
error: any;
|
|
25
|
+
data?: undefined;
|
|
26
|
+
}>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Contract } from 'starknet';
|
|
2
|
+
import { FACTORY_ABI } from '../lib/abis/unruggableFactory.js';
|
|
3
|
+
import { FACTORY_ADDRESS } from '../lib/constants/index.js';
|
|
4
|
+
export const getLockedLiquidity = async (env, params) => {
|
|
5
|
+
try {
|
|
6
|
+
const provider = env.provider;
|
|
7
|
+
const contract = new Contract(FACTORY_ABI, FACTORY_ADDRESS, provider);
|
|
8
|
+
const result = await contract.locked_liquidity(params.contractAddress);
|
|
9
|
+
const liquidityInfo = {
|
|
10
|
+
hasLockedLiquidity: false,
|
|
11
|
+
};
|
|
12
|
+
if (result.length > 0) {
|
|
13
|
+
const [contractAddress, liquidityData] = result;
|
|
14
|
+
liquidityInfo.hasLockedLiquidity = true;
|
|
15
|
+
liquidityInfo.liquidityContractAddress = contractAddress;
|
|
16
|
+
if ('JediERC20' in liquidityData) {
|
|
17
|
+
liquidityInfo.liquidityType = {
|
|
18
|
+
type: 'JediERC20',
|
|
19
|
+
address: liquidityData.JediERC20,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
else if ('StarkDeFiERC20' in liquidityData) {
|
|
23
|
+
liquidityInfo.liquidityType = {
|
|
24
|
+
type: 'StarkDeFiERC20',
|
|
25
|
+
address: liquidityData.StarkDeFiERC20,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
else if ('EkuboNFT' in liquidityData) {
|
|
29
|
+
liquidityInfo.liquidityType = {
|
|
30
|
+
type: 'EkuboNFT',
|
|
31
|
+
tokenId: Number(liquidityData.EkuboNFT),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
status: 'success',
|
|
37
|
+
data: liquidityInfo,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error('Error getting locked liquidity:', error);
|
|
42
|
+
return {
|
|
43
|
+
status: 'failed',
|
|
44
|
+
error: error.message,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=getLockedLiquidity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getLockedLiquidity.js","sourceRoot":"","sources":["../../src/tools/getLockedLiquidity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAwE5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,GAAiB,EACjB,MAA6B,EAC7B,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACvE,MAAM,aAAa,GAAwB;YACzC,kBAAkB,EAAE,KAAK;SAC1B,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,MAAM,CAAC;YAChD,aAAa,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACxC,aAAa,CAAC,wBAAwB,GAAG,eAAe,CAAC;YAEzD,IAAI,WAAW,IAAI,aAAa,EAAE,CAAC;gBACjC,aAAa,CAAC,aAAa,GAAG;oBAC5B,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,aAAa,CAAC,SAAS;iBACjC,CAAC;YACJ,CAAC;iBAAM,IAAI,gBAAgB,IAAI,aAAa,EAAE,CAAC;gBAC7C,aAAa,CAAC,aAAa,GAAG;oBAC5B,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,aAAa,CAAC,cAAc;iBACtC,CAAC;YACJ,CAAC;iBAAM,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBACvC,aAAa,CAAC,aAAa,GAAG;oBAC5B,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;iBACxC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,aAAa;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,KAAK,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ContractAddressParams } from '../schemas/index.js';
|
|
2
|
+
import { onchainWrite } from '@kasarlabs/ask-starknet-core';
|
|
3
|
+
export declare const isMemecoin: (env: onchainWrite, params: ContractAddressParams) => Promise<{
|
|
4
|
+
status: string;
|
|
5
|
+
isMemecoin: any;
|
|
6
|
+
error?: undefined;
|
|
7
|
+
} | {
|
|
8
|
+
status: string;
|
|
9
|
+
error: any;
|
|
10
|
+
isMemecoin?: undefined;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Contract } from 'starknet';
|
|
2
|
+
import { FACTORY_ABI } from '../lib/abis/unruggableFactory.js';
|
|
3
|
+
import { FACTORY_ADDRESS } from '../lib/constants/index.js';
|
|
4
|
+
export const isMemecoin = async (env, params) => {
|
|
5
|
+
try {
|
|
6
|
+
const provider = env.provider;
|
|
7
|
+
const contract = new Contract(FACTORY_ABI, FACTORY_ADDRESS, provider);
|
|
8
|
+
const result = await contract.is_memecoin(params.contractAddress);
|
|
9
|
+
return {
|
|
10
|
+
status: 'success',
|
|
11
|
+
isMemecoin: result,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
console.error('Error checking memecoin status:', error);
|
|
16
|
+
return {
|
|
17
|
+
status: 'failed',
|
|
18
|
+
error: error.message,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=isMemecoin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isMemecoin.js","sourceRoot":"","sources":["../../src/tools/isMemecoin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA6C5D,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,GAAiB,EACjB,MAA6B,EAC7B,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAElE,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,MAAM;SACnB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,KAAK,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { LaunchOnEkuboParams } from '../schemas/index.js';
|
|
2
|
+
import { onchainWrite } from '@kasarlabs/ask-starknet-core';
|
|
3
|
+
export declare const launchOnEkubo: (env: onchainWrite, params: LaunchOnEkuboParams) => Promise<{
|
|
4
|
+
status: string;
|
|
5
|
+
response: any;
|
|
6
|
+
error?: undefined;
|
|
7
|
+
} | {
|
|
8
|
+
status: string;
|
|
9
|
+
error: any;
|
|
10
|
+
response?: undefined;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FACTORY_ABI } from '../lib/abis/unruggableFactory.js';
|
|
2
|
+
import { FACTORY_ADDRESS } from '../lib/constants/index.js';
|
|
3
|
+
import { Contract } from 'starknet';
|
|
4
|
+
export const launchOnEkubo = async (env, params) => {
|
|
5
|
+
try {
|
|
6
|
+
const provider = env.provider;
|
|
7
|
+
const contract = new Contract(FACTORY_ABI, FACTORY_ADDRESS, provider);
|
|
8
|
+
const launchParams = params.launchParams;
|
|
9
|
+
const ekuboParams = params.ekuboParams;
|
|
10
|
+
const paramsToSend = {
|
|
11
|
+
memecoin_address: launchParams.memecoinAddress,
|
|
12
|
+
transfer_restriction_delay: launchParams.transferRestrictionDelay,
|
|
13
|
+
max_percentage_buy_launch: launchParams.maxPercentageBuyLaunch,
|
|
14
|
+
quote_address: launchParams.quoteAddress,
|
|
15
|
+
initial_holders: launchParams.initialHolders,
|
|
16
|
+
initial_holders_amounts: launchParams.initialHoldersAmounts,
|
|
17
|
+
};
|
|
18
|
+
const ekuboPoolParams = {
|
|
19
|
+
fee: ekuboParams.fee,
|
|
20
|
+
tick_spacing: ekuboParams.tickSpacing,
|
|
21
|
+
starting_price: {
|
|
22
|
+
mag: ekuboParams.startingPrice.mag,
|
|
23
|
+
sign: ekuboParams.startingPrice.sign,
|
|
24
|
+
},
|
|
25
|
+
bound: ekuboParams.bound,
|
|
26
|
+
};
|
|
27
|
+
const response = await contract.launch_on_ekubo(paramsToSend, ekuboPoolParams);
|
|
28
|
+
return {
|
|
29
|
+
status: 'success',
|
|
30
|
+
response,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error('Error launching on Ekubo:', error);
|
|
35
|
+
return {
|
|
36
|
+
status: 'failed',
|
|
37
|
+
error: error.message,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=launchOnEkubo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchOnEkubo.js","sourceRoot":"","sources":["../../src/tools/launchOnEkubo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAwDpC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,GAAiB,EACjB,MAA2B,EAC3B,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEvC,MAAM,YAAY,GAAG;YACnB,gBAAgB,EAAE,YAAY,CAAC,eAAe;YAC9C,0BAA0B,EAAE,YAAY,CAAC,wBAAwB;YACjE,yBAAyB,EAAE,YAAY,CAAC,sBAAsB;YAC9D,aAAa,EAAE,YAAY,CAAC,YAAY;YACxC,eAAe,EAAE,YAAY,CAAC,cAAc;YAC5C,uBAAuB,EAAE,YAAY,CAAC,qBAAqB;SAC5D,CAAC;QAEF,MAAM,eAAe,GAAG;YACtB,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,YAAY,EAAE,WAAW,CAAC,WAAW;YACrC,cAAc,EAAE;gBACd,GAAG,EAAE,WAAW,CAAC,aAAa,CAAC,GAAG;gBAClC,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI;aACrC;YACD,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,eAAe,CAC7C,YAAY,EACZ,eAAe,CAChB,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,KAAK,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kasarlabs/unruggable-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"unruggable-mcp": "./bin/unruggable-mcp.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc && chmod 755 build/index.js",
|
|
11
|
+
"clean": "rm -rf build",
|
|
12
|
+
"clean:all": "rm -rf build node_modules",
|
|
13
|
+
"start": "node build/index.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"build"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@kasarlabs/ask-starknet-core": "0.1.0",
|
|
20
|
+
"@langchain/core": "^0.3.42",
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.11.2",
|
|
22
|
+
"dotenv": "^16.4.7",
|
|
23
|
+
"starknet": "^7.6.4",
|
|
24
|
+
"winston": "^3.17.0",
|
|
25
|
+
"zod": "^3.24.2"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.13.10",
|
|
29
|
+
"typescript": "^5.8.2"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"starknet",
|
|
34
|
+
"unruggable"
|
|
35
|
+
],
|
|
36
|
+
"author": "kasarlabs",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"description": "MCP server for creating and analyzing memecoins with focus on safer token launches and liquidity locking.",
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"gitHead": "2239ec60f8e369abd318807cecd22fe97c0ab917"
|
|
43
|
+
}
|