@andrewkimjoseph/celina-sdk 0.4.11 → 0.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 (86) hide show
  1. package/README.md +4 -0
  2. package/build/analytics/mcp-tool-events.js +1 -0
  3. package/build/analytics/mcp-tool-events.js.map +1 -1
  4. package/build/services/blockchain.service.d.ts +33 -3
  5. package/build/services/blockchain.service.js +40 -21
  6. package/build/services/blockchain.service.js.map +1 -1
  7. package/build/tools/catalog.d.ts +9 -0
  8. package/build/tools/catalog.js +36 -0
  9. package/build/tools/catalog.js.map +1 -0
  10. package/build/tools/domains/aave.d.ts +2 -0
  11. package/build/tools/domains/aave.js +89 -0
  12. package/build/tools/domains/aave.js.map +1 -0
  13. package/build/tools/domains/blockchain.d.ts +2 -0
  14. package/build/tools/domains/blockchain.js +85 -0
  15. package/build/tools/domains/blockchain.js.map +1 -0
  16. package/build/tools/domains/carbon.d.ts +2 -0
  17. package/build/tools/domains/carbon.js +187 -0
  18. package/build/tools/domains/carbon.js.map +1 -0
  19. package/build/tools/domains/celeste.d.ts +2 -0
  20. package/build/tools/domains/celeste.js +42 -0
  21. package/build/tools/domains/celeste.js.map +1 -0
  22. package/build/tools/domains/contract.d.ts +2 -0
  23. package/build/tools/domains/contract.js +67 -0
  24. package/build/tools/domains/contract.js.map +1 -0
  25. package/build/tools/domains/ens.d.ts +2 -0
  26. package/build/tools/domains/ens.js +16 -0
  27. package/build/tools/domains/ens.js.map +1 -0
  28. package/build/tools/domains/gooddollar.d.ts +2 -0
  29. package/build/tools/domains/gooddollar.js +73 -0
  30. package/build/tools/domains/gooddollar.js.map +1 -0
  31. package/build/tools/domains/governance.d.ts +2 -0
  32. package/build/tools/domains/governance.js +41 -0
  33. package/build/tools/domains/governance.js.map +1 -0
  34. package/build/tools/domains/index.d.ts +1 -0
  35. package/build/tools/domains/index.js +33 -0
  36. package/build/tools/domains/index.js.map +1 -0
  37. package/build/tools/domains/mento-fx.d.ts +2 -0
  38. package/build/tools/domains/mento-fx.js +72 -0
  39. package/build/tools/domains/mento-fx.js.map +1 -0
  40. package/build/tools/domains/nft.d.ts +2 -0
  41. package/build/tools/domains/nft.js +38 -0
  42. package/build/tools/domains/nft.js.map +1 -0
  43. package/build/tools/domains/self.d.ts +2 -0
  44. package/build/tools/domains/self.js +194 -0
  45. package/build/tools/domains/self.js.map +1 -0
  46. package/build/tools/domains/staking.d.ts +2 -0
  47. package/build/tools/domains/staking.js +74 -0
  48. package/build/tools/domains/staking.js.map +1 -0
  49. package/build/tools/domains/token.d.ts +2 -0
  50. package/build/tools/domains/token.js +73 -0
  51. package/build/tools/domains/token.js.map +1 -0
  52. package/build/tools/domains/transaction.d.ts +2 -0
  53. package/build/tools/domains/transaction.js +117 -0
  54. package/build/tools/domains/transaction.js.map +1 -0
  55. package/build/tools/domains/uniswap.d.ts +2 -0
  56. package/build/tools/domains/uniswap.js +72 -0
  57. package/build/tools/domains/uniswap.js.map +1 -0
  58. package/build/tools/filter.d.ts +2 -0
  59. package/build/tools/filter.js +28 -0
  60. package/build/tools/filter.js.map +1 -0
  61. package/build/tools/index.d.ts +7 -0
  62. package/build/tools/index.js +7 -0
  63. package/build/tools/index.js.map +1 -0
  64. package/build/tools/schemas/common.d.ts +110 -0
  65. package/build/tools/schemas/common.js +81 -0
  66. package/build/tools/schemas/common.js.map +1 -0
  67. package/build/tools/swap-routing.d.ts +24 -0
  68. package/build/tools/swap-routing.js +105 -0
  69. package/build/tools/swap-routing.js.map +1 -0
  70. package/build/tools/types.d.ts +134 -0
  71. package/build/tools/types.js +2 -0
  72. package/build/tools/types.js.map +1 -0
  73. package/build/tools/utils/carbon-prepare-handler.d.ts +6 -0
  74. package/build/tools/utils/carbon-prepare-handler.js +17 -0
  75. package/build/tools/utils/carbon-prepare-handler.js.map +1 -0
  76. package/build/tools/utils/normalize-token.d.ts +2 -0
  77. package/build/tools/utils/normalize-token.js +12 -0
  78. package/build/tools/utils/normalize-token.js.map +1 -0
  79. package/build/tools/utils/wallet.d.ts +2 -0
  80. package/build/tools/utils/wallet.js +4 -0
  81. package/build/tools/utils/wallet.js.map +1 -0
  82. package/package.json +7 -1
  83. package/tests/README.md +4 -0
  84. package/tests/catalog/domains/blockchain.ts +24 -0
  85. package/tests/catalog/operations.ts +11 -1
  86. package/tests/testing-entry.ts +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GAIxB,MAAM,mBAAmB,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AAapC,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ export declare const addressSchema: z.ZodString;
3
+ export declare const optionalWalletAddressSchema: z.ZodOptional<z.ZodString>;
4
+ export declare const addressOrEnsSchema: z.ZodString;
5
+ export declare const blockIdSchema: z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodLiteral<"latest">, z.ZodLiteral<"pending">]>;
6
+ export declare const tokenSymbolSchema: z.ZodString;
7
+ export declare const ensNameSchema: z.ZodString;
8
+ export declare const tokenIdSchema: z.ZodString;
9
+ export declare const abiSchema: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
10
+ export declare const paginationFields: {
11
+ readonly page: z.ZodOptional<z.ZodNumber>;
12
+ readonly page_size: z.ZodOptional<z.ZodNumber>;
13
+ readonly offset: z.ZodOptional<z.ZodNumber>;
14
+ readonly limit: z.ZodOptional<z.ZodNumber>;
15
+ };
16
+ export declare const hexDataSchema: z.ZodOptional<z.ZodString>;
17
+ export declare const carbonWriteSchema: z.ZodObject<{
18
+ wallet_address: z.ZodOptional<z.ZodString>;
19
+ from: z.ZodOptional<z.ZodString>;
20
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
21
+ wallet_address: z.ZodOptional<z.ZodString>;
22
+ from: z.ZodOptional<z.ZodString>;
23
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
24
+ wallet_address: z.ZodOptional<z.ZodString>;
25
+ from: z.ZodOptional<z.ZodString>;
26
+ }, z.ZodTypeAny, "passthrough">>;
27
+ export declare const mentoFxQuoteSchema: z.ZodObject<{
28
+ token_in: z.ZodString;
29
+ token_out: z.ZodString;
30
+ amount: z.ZodString;
31
+ from: z.ZodOptional<z.ZodString>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ amount: string;
34
+ token_in: string;
35
+ token_out: string;
36
+ from?: string | undefined;
37
+ }, {
38
+ amount: string;
39
+ token_in: string;
40
+ token_out: string;
41
+ from?: string | undefined;
42
+ }>;
43
+ export declare const mentoFxWalletSchema: z.ZodObject<{
44
+ token_in: z.ZodString;
45
+ token_out: z.ZodString;
46
+ amount: z.ZodString;
47
+ from: z.ZodOptional<z.ZodString>;
48
+ } & {
49
+ recipient: z.ZodOptional<z.ZodString>;
50
+ slippage_tolerance: z.ZodOptional<z.ZodNumber>;
51
+ deadline_minutes: z.ZodOptional<z.ZodNumber>;
52
+ }, "strip", z.ZodTypeAny, {
53
+ amount: string;
54
+ token_in: string;
55
+ token_out: string;
56
+ from?: string | undefined;
57
+ recipient?: string | undefined;
58
+ slippage_tolerance?: number | undefined;
59
+ deadline_minutes?: number | undefined;
60
+ }, {
61
+ amount: string;
62
+ token_in: string;
63
+ token_out: string;
64
+ from?: string | undefined;
65
+ recipient?: string | undefined;
66
+ slippage_tolerance?: number | undefined;
67
+ deadline_minutes?: number | undefined;
68
+ }>;
69
+ export declare const uniswapQuoteSchema: z.ZodObject<{
70
+ token_in: z.ZodString;
71
+ token_out: z.ZodString;
72
+ amount: z.ZodString;
73
+ from: z.ZodOptional<z.ZodString>;
74
+ }, "strip", z.ZodTypeAny, {
75
+ amount: string;
76
+ token_in: string;
77
+ token_out: string;
78
+ from?: string | undefined;
79
+ }, {
80
+ amount: string;
81
+ token_in: string;
82
+ token_out: string;
83
+ from?: string | undefined;
84
+ }>;
85
+ export declare const uniswapWalletSchema: z.ZodObject<{
86
+ token_in: z.ZodString;
87
+ token_out: z.ZodString;
88
+ amount: z.ZodString;
89
+ from: z.ZodOptional<z.ZodString>;
90
+ } & {
91
+ recipient: z.ZodOptional<z.ZodString>;
92
+ slippage_tolerance: z.ZodOptional<z.ZodNumber>;
93
+ deadline_minutes: z.ZodOptional<z.ZodNumber>;
94
+ }, "strip", z.ZodTypeAny, {
95
+ amount: string;
96
+ token_in: string;
97
+ token_out: string;
98
+ from?: string | undefined;
99
+ recipient?: string | undefined;
100
+ slippage_tolerance?: number | undefined;
101
+ deadline_minutes?: number | undefined;
102
+ }, {
103
+ amount: string;
104
+ token_in: string;
105
+ token_out: string;
106
+ from?: string | undefined;
107
+ recipient?: string | undefined;
108
+ slippage_tolerance?: number | undefined;
109
+ deadline_minutes?: number | undefined;
110
+ }>;
@@ -0,0 +1,81 @@
1
+ import { z } from "zod";
2
+ export const addressSchema = z
3
+ .string()
4
+ .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address");
5
+ export const optionalWalletAddressSchema = addressSchema
6
+ .optional()
7
+ .describe("Wallet on Celo mainnet. Omit to use the connected wallet or MCP CELO_PRIVATE_KEY signer.");
8
+ export const addressOrEnsSchema = z
9
+ .string()
10
+ .min(3)
11
+ .describe("Recipient 0x address or ENS name (e.g. andrewkimjoseph.celo.eth, celina.eth)");
12
+ export const blockIdSchema = z.union([
13
+ z.number().int().nonnegative(),
14
+ z.string().regex(/^0x[a-fA-F0-9]+$/, "Invalid block hash"),
15
+ z.literal("latest"),
16
+ z.literal("pending"),
17
+ ]);
18
+ export const tokenSymbolSchema = z
19
+ .string()
20
+ .describe("Celo mainnet token symbol (e.g. CELO, USDm, USDC, USDT)");
21
+ export const ensNameSchema = z
22
+ .string()
23
+ .min(3)
24
+ .describe("ENS name, e.g. celina.eth or vitalik.eth");
25
+ export const tokenIdSchema = z.string().describe("NFT token ID (decimal string)");
26
+ export const abiSchema = z
27
+ .array(z.record(z.unknown()))
28
+ .min(1)
29
+ .describe("Contract ABI as a JSON array");
30
+ export const paginationFields = {
31
+ page: z.number().int().min(1).optional(),
32
+ page_size: z.number().int().min(1).optional(),
33
+ offset: z.number().int().min(0).optional(),
34
+ limit: z.number().int().min(1).optional(),
35
+ };
36
+ export const hexDataSchema = z
37
+ .string()
38
+ .regex(/^0x[a-fA-F0-9]*$/)
39
+ .optional()
40
+ .describe("Optional transaction calldata (hex)");
41
+ export const carbonWriteSchema = z
42
+ .object({
43
+ wallet_address: optionalWalletAddressSchema,
44
+ from: addressSchema.optional(),
45
+ })
46
+ .passthrough();
47
+ export const mentoFxQuoteSchema = z.object({
48
+ token_in: tokenSymbolSchema.describe("Input token symbol or address"),
49
+ token_out: tokenSymbolSchema.describe("Output token symbol or address"),
50
+ amount: z.string().describe("Human-readable amount of token_in, e.g. 100"),
51
+ from: optionalWalletAddressSchema,
52
+ });
53
+ export const mentoFxWalletSchema = mentoFxQuoteSchema.extend({
54
+ recipient: addressSchema
55
+ .optional()
56
+ .describe("Address that receives output tokens (defaults to signer)"),
57
+ slippage_tolerance: z
58
+ .number()
59
+ .min(0)
60
+ .max(20)
61
+ .optional()
62
+ .describe("Max slippage in percent (default 0.5)"),
63
+ deadline_minutes: z
64
+ .number()
65
+ .int()
66
+ .positive()
67
+ .optional()
68
+ .describe("Transaction deadline in minutes (default 5)"),
69
+ });
70
+ export const uniswapQuoteSchema = z.object({
71
+ token_in: tokenSymbolSchema,
72
+ token_out: tokenSymbolSchema,
73
+ amount: z.string().describe("Human-readable amount of token_in"),
74
+ from: optionalWalletAddressSchema,
75
+ });
76
+ export const uniswapWalletSchema = uniswapQuoteSchema.extend({
77
+ recipient: addressSchema.optional(),
78
+ slippage_tolerance: z.number().min(0).max(20).optional(),
79
+ deadline_minutes: z.number().int().positive().optional(),
80
+ });
81
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/tools/schemas/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { CelinaClient } from "../index.js";
2
+ export type SwapProtocol = "mento_fx" | "uniswap_v4";
3
+ export interface SwapQuoteResult {
4
+ protocol: SwapProtocol;
5
+ tokenIn: string;
6
+ tokenOut: string;
7
+ amountIn: string;
8
+ expectedOut: string;
9
+ routeHops: number;
10
+ network: "mainnet";
11
+ alternatives?: Array<{
12
+ protocol: SwapProtocol;
13
+ expectedOut: string;
14
+ error?: string;
15
+ }>;
16
+ }
17
+ export interface SwapPrepareParams {
18
+ recipient?: `0x${string}`;
19
+ slippageTolerance?: number;
20
+ deadlineMinutes?: number;
21
+ }
22
+ /** Quote a swap across Mento FX and Uniswap v4; returns the best available route. */
23
+ export declare function getSwapQuoteWithFallback(celina: CelinaClient, tokenIn: string, tokenOut: string, amount: string, from?: `0x${string}`): Promise<SwapQuoteResult>;
24
+ export declare function prepareSwapWithFallback(celina: CelinaClient, from: `0x${string}`, tokenIn: string, tokenOut: string, amount: string, params?: SwapPrepareParams, protocol?: SwapProtocol): Promise<import("../index.js").SerializedPreparedFlow>;
@@ -0,0 +1,105 @@
1
+ function parseExpectedOut(value) {
2
+ const n = Number(value.replace(/,/g, ""));
3
+ return Number.isFinite(n) ? n : 0;
4
+ }
5
+ function isMentoRouteError(message) {
6
+ return /no mento fx route|mento fx market is currently closed/i.test(message);
7
+ }
8
+ function isUniswapRouteError(message) {
9
+ return /no uniswap v4 route|insufficient liquidity in uniswap v4/i.test(message);
10
+ }
11
+ function isInsufficientBalanceError(message) {
12
+ return /insufficient .+ balance/i.test(message);
13
+ }
14
+ function rejectionMessage(reason) {
15
+ return reason instanceof Error ? reason.message : String(reason);
16
+ }
17
+ async function tryMentoQuote(celina, tokenIn, tokenOut, amount, from) {
18
+ const quote = await celina.mentoFx.getFxQuote(tokenIn, tokenOut, amount, from);
19
+ return {
20
+ protocol: "mento_fx",
21
+ tokenIn: quote.tokenIn,
22
+ tokenOut: quote.tokenOut,
23
+ amountIn: quote.amountIn,
24
+ expectedOut: quote.expectedOut,
25
+ routeHops: quote.routeHops,
26
+ network: quote.network,
27
+ };
28
+ }
29
+ async function tryUniswapQuote(celina, tokenIn, tokenOut, amount, from) {
30
+ const quote = await celina.uniswap.getSwapQuote(tokenIn, tokenOut, amount, from);
31
+ return {
32
+ protocol: "uniswap_v4",
33
+ tokenIn: quote.tokenIn,
34
+ tokenOut: quote.tokenOut,
35
+ amountIn: quote.amountIn,
36
+ expectedOut: quote.expectedOut,
37
+ routeHops: quote.routeHops,
38
+ network: quote.network,
39
+ };
40
+ }
41
+ /** Quote a swap across Mento FX and Uniswap v4; returns the best available route. */
42
+ export async function getSwapQuoteWithFallback(celina, tokenIn, tokenOut, amount, from) {
43
+ const [mentoResult, uniswapResult] = await Promise.allSettled([
44
+ tryMentoQuote(celina, tokenIn, tokenOut, amount, from),
45
+ tryUniswapQuote(celina, tokenIn, tokenOut, amount, from),
46
+ ]);
47
+ const successes = [];
48
+ const alternatives = [];
49
+ if (mentoResult.status === "fulfilled") {
50
+ successes.push(mentoResult.value);
51
+ }
52
+ else {
53
+ const message = rejectionMessage(mentoResult.reason);
54
+ if (!isMentoRouteError(message)) {
55
+ alternatives.push({ protocol: "mento_fx", expectedOut: "0", error: message });
56
+ }
57
+ }
58
+ if (uniswapResult.status === "fulfilled") {
59
+ successes.push(uniswapResult.value);
60
+ }
61
+ else {
62
+ const message = rejectionMessage(uniswapResult.reason);
63
+ if (!isUniswapRouteError(message)) {
64
+ alternatives.push({ protocol: "uniswap_v4", expectedOut: "0", error: message });
65
+ }
66
+ }
67
+ if (successes.length === 0) {
68
+ const failures = [mentoResult, uniswapResult]
69
+ .filter((result) => result.status === "rejected")
70
+ .map((result) => rejectionMessage(result.reason));
71
+ const balanceError = failures.find(isInsufficientBalanceError);
72
+ if (balanceError) {
73
+ throw new Error(balanceError);
74
+ }
75
+ throw new Error(`No swap route for ${tokenIn} → ${tokenOut} via Mento FX or Uniswap v4.`);
76
+ }
77
+ successes.sort((a, b) => parseExpectedOut(b.expectedOut) - parseExpectedOut(a.expectedOut));
78
+ const best = successes[0];
79
+ const otherProtocols = successes.slice(1).map((q) => ({
80
+ protocol: q.protocol,
81
+ expectedOut: q.expectedOut,
82
+ }));
83
+ return {
84
+ ...best,
85
+ alternatives: otherProtocols.length > 0 ? otherProtocols : alternatives,
86
+ };
87
+ }
88
+ export async function prepareSwapWithFallback(celina, from, tokenIn, tokenOut, amount, params, protocol) {
89
+ const chosen = protocol ??
90
+ (await getSwapQuoteWithFallback(celina, tokenIn, tokenOut, amount, from))
91
+ .protocol;
92
+ if (chosen === "mento_fx") {
93
+ return celina.mentoFx.prepareFx(from, tokenIn, tokenOut, amount, {
94
+ recipient: params?.recipient,
95
+ slippageTolerance: params?.slippageTolerance,
96
+ deadlineMinutes: params?.deadlineMinutes,
97
+ });
98
+ }
99
+ return celina.uniswap.prepareSwap(from, tokenIn, tokenOut, amount, {
100
+ recipient: params?.recipient,
101
+ slippageTolerance: params?.slippageTolerance,
102
+ deadlineMinutes: params?.deadlineMinutes,
103
+ });
104
+ }
105
+ //# sourceMappingURL=swap-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap-routing.js","sourceRoot":"","sources":["../../src/tools/swap-routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import type { z } from "zod";
2
+ import type { CelinaClient } from "../index.js";
3
+ import type { CarbonWriteBody } from "../services/carbon.service.js";
4
+ export type ToolSurface = "mcp" | "celeste";
5
+ export type ToolFamily = "read" | "prepare" | "execute";
6
+ export type WalletInput = {
7
+ address?: string;
8
+ wallet_address?: string;
9
+ from?: string;
10
+ };
11
+ export type McpToolAnnotations = {
12
+ readOnlyHint?: boolean;
13
+ idempotentHint?: boolean;
14
+ destructiveHint?: boolean;
15
+ openWorldHint?: boolean;
16
+ };
17
+ export type McpToolMeta = {
18
+ title?: string;
19
+ annotations?: McpToolAnnotations;
20
+ /** MCP adapter uses okSelfSession for QR registration flows. */
21
+ responseKind?: "default" | "self_session";
22
+ };
23
+ export type ToolRuntimeHooks = {
24
+ beforePrepareSend?: (params: {
25
+ sender: `0x${string}`;
26
+ token: string;
27
+ amount: string;
28
+ }) => Promise<void>;
29
+ carbon?: {
30
+ validateBody?: (toolName: string, body: Record<string, unknown>) => void;
31
+ prepare?: (toolName: string, sender: `0x${string}`, prepareFn: (body: CarbonWriteBody) => Promise<unknown>, body: CarbonWriteBody, options?: {
32
+ marketPriceFallback?: boolean;
33
+ concentrated?: boolean;
34
+ }) => Promise<unknown>;
35
+ };
36
+ };
37
+ export type TransactionExecutors = {
38
+ estimateSend: (to: `0x${string}`, token: string, amount: string) => Promise<unknown>;
39
+ sendToken: (to: `0x${string}`, token: string, amount: string) => Promise<unknown>;
40
+ };
41
+ export type MentoFxExecutors = {
42
+ estimate: (tokenIn: string, tokenOut: string, amount: string, options?: {
43
+ recipient?: `0x${string}`;
44
+ slippageTolerance?: number;
45
+ deadlineMinutes?: number;
46
+ }) => Promise<unknown>;
47
+ execute: (tokenIn: string, tokenOut: string, amount: string, options?: {
48
+ recipient?: `0x${string}`;
49
+ slippageTolerance?: number;
50
+ deadlineMinutes?: number;
51
+ }) => Promise<unknown>;
52
+ };
53
+ export type UniswapExecutors = {
54
+ estimate: (tokenIn: string, tokenOut: string, amount: string, options?: {
55
+ recipient?: `0x${string}`;
56
+ slippageTolerance?: number;
57
+ deadlineMinutes?: number;
58
+ }) => Promise<unknown>;
59
+ execute: (tokenIn: string, tokenOut: string, amount: string, options?: {
60
+ recipient?: `0x${string}`;
61
+ slippageTolerance?: number;
62
+ deadlineMinutes?: number;
63
+ }) => Promise<unknown>;
64
+ };
65
+ export type AaveExecutors = {
66
+ supply: (token: string, amount: string) => Promise<unknown>;
67
+ withdraw: (token: string, amount?: string, withdrawMax?: boolean) => Promise<unknown>;
68
+ };
69
+ export type CarbonWriteExecutors = {
70
+ executeLimitOrder: (body: Record<string, unknown>) => Promise<unknown>;
71
+ executeRangeOrder: (body: Record<string, unknown>) => Promise<unknown>;
72
+ executeRecurringStrategy: (body: Record<string, unknown>) => Promise<unknown>;
73
+ executeConcentratedStrategy: (body: Record<string, unknown>) => Promise<unknown>;
74
+ executeFullRangeStrategy: (body: Record<string, unknown>) => Promise<unknown>;
75
+ executeRepriceStrategy: (body: Record<string, unknown>) => Promise<unknown>;
76
+ executeEditStrategy: (body: Record<string, unknown>) => Promise<unknown>;
77
+ executeDepositBudget: (body: Record<string, unknown>) => Promise<unknown>;
78
+ executeWithdrawBudget: (body: Record<string, unknown>) => Promise<unknown>;
79
+ executePauseStrategy: (body: Record<string, unknown>) => Promise<unknown>;
80
+ executeResumeStrategy: (body: Record<string, unknown>) => Promise<unknown>;
81
+ executeDeleteStrategy: (body: Record<string, unknown>) => Promise<unknown>;
82
+ executeTrade: (body: Record<string, unknown>) => Promise<unknown>;
83
+ };
84
+ export type GoodDollarWriteExecutors = {
85
+ claimDailyUbi: () => Promise<unknown>;
86
+ };
87
+ export type SelfExecutors = {
88
+ verifyAgent: (args: Record<string, unknown>) => Promise<unknown>;
89
+ lookupAgent: (agentId: number) => Promise<unknown>;
90
+ verifyRequest: (args: Record<string, unknown>) => Promise<unknown>;
91
+ registerAgent: (args: Record<string, unknown>) => Promise<unknown>;
92
+ checkRegistration: (sessionId: string) => Promise<unknown>;
93
+ getIdentity: () => Promise<unknown>;
94
+ refreshProof: (args: Record<string, unknown>) => Promise<unknown>;
95
+ deregisterAgent: () => Promise<unknown>;
96
+ signRequest: (args: Record<string, unknown>) => Promise<unknown>;
97
+ authenticatedFetch: (args: Record<string, unknown>) => Promise<unknown>;
98
+ };
99
+ export type ToolRuntimeExecutors = {
100
+ transaction?: TransactionExecutors;
101
+ mentoFx?: MentoFxExecutors;
102
+ uniswap?: UniswapExecutors;
103
+ aave?: AaveExecutors;
104
+ carbonWrite?: CarbonWriteExecutors;
105
+ gooddollarWrite?: GoodDollarWriteExecutors;
106
+ self?: SelfExecutors;
107
+ };
108
+ export interface ToolRuntime {
109
+ celina: CelinaClient;
110
+ resolveWallet: (input?: WalletInput) => `0x${string}`;
111
+ hooks?: ToolRuntimeHooks;
112
+ executors?: ToolRuntimeExecutors;
113
+ /** MCP session wallet metadata for get_wallet_address. */
114
+ mcpWallet?: {
115
+ address: `0x${string}`;
116
+ hasWallet: boolean;
117
+ };
118
+ }
119
+ export interface ToolDefinition {
120
+ name: string;
121
+ description: string;
122
+ inputSchema: z.ZodTypeAny;
123
+ families: ToolFamily[];
124
+ surfaces?: ToolSurface[];
125
+ mcp?: McpToolMeta;
126
+ handler: (runtime: ToolRuntime, input: Record<string, unknown>) => Promise<unknown>;
127
+ }
128
+ export type FilterToolsOptions = {
129
+ surface?: ToolSurface;
130
+ families?: ToolFamily[];
131
+ names?: string[];
132
+ carbonPrepareEnabled?: boolean;
133
+ carbonExecuteEnabled?: boolean;
134
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { CarbonWriteBody } from "../../services/carbon.service.js";
2
+ import type { ToolRuntime } from "../types.js";
3
+ export declare function runCarbonPrepare(runtime: ToolRuntime, toolName: string, prepareFn: (body: CarbonWriteBody) => Promise<unknown>, input: Record<string, unknown>, options?: {
4
+ marketPriceFallback?: boolean;
5
+ concentrated?: boolean;
6
+ }): Promise<unknown>;
@@ -0,0 +1,17 @@
1
+ import { finalizeCarbonPrepare } from "../../utils/finalize-carbon-prepare.js";
2
+ import { resolveWalletFromRuntime } from "./wallet.js";
3
+ export async function runCarbonPrepare(runtime, toolName, prepareFn, input, options) {
4
+ const sender = resolveWalletFromRuntime(runtime, {
5
+ wallet_address: input.wallet_address,
6
+ from: input.from,
7
+ });
8
+ const body = { ...input, wallet_address: sender };
9
+ if (runtime.hooks?.carbon?.prepare) {
10
+ return runtime.hooks.carbon.prepare(toolName, sender, prepareFn, body, options);
11
+ }
12
+ runtime.hooks?.carbon?.validateBody?.(toolName, body);
13
+ const prepared = await prepareFn(body);
14
+ const preparedFlow = await finalizeCarbonPrepare(runtime.celina.carbon, sender, prepared, body);
15
+ return { ...prepared, preparedFlow };
16
+ }
17
+ //# sourceMappingURL=carbon-prepare-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carbon-prepare-handler.js","sourceRoot":"","sources":["../../../src/tools/utils/carbon-prepare-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAoB,EACpB,QAAgB,EAChB,SAAsD,EACtD,KAA8B,EAC9B,OAAmE;IAEnE,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,EAAE;QAC/C,cAAc,EAAE,KAAK,CAAC,cAAoC;QAC1D,IAAI,EAAE,KAAK,CAAC,IAA0B;KACvC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,MAAM,EAAqB,CAAC;IAErE,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAC9C,OAAO,CAAC,MAAM,CAAC,MAAM,EACrB,MAAM,EACN,QAAuD,EACvD,IAAI,CACL,CAAC;IACF,OAAO,EAAE,GAAI,QAAmB,EAAE,YAAY,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** Normalize common LLM token shorthands before registry lookup. */
2
+ export declare function normalizeRegistryTokenInput(token: string): string;
@@ -0,0 +1,12 @@
1
+ const REGISTRY_ALIASES = {
2
+ GD: "GoodDollar",
3
+ "G$": "GoodDollar",
4
+ GOODDOLLAR: "GoodDollar",
5
+ };
6
+ /** Normalize common LLM token shorthands before registry lookup. */
7
+ export function normalizeRegistryTokenInput(token) {
8
+ const trimmed = token.trim();
9
+ const upper = trimmed.toUpperCase();
10
+ return REGISTRY_ALIASES[upper] ?? REGISTRY_ALIASES[trimmed] ?? trimmed;
11
+ }
12
+ //# sourceMappingURL=normalize-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-token.js","sourceRoot":"","sources":["../../../src/tools/utils/normalize-token.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAA2B;IAC/C,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,oEAAoE;AACpE,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;AACzE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRuntime, WalletInput } from "../types.js";
2
+ export declare function resolveWalletFromRuntime(runtime: ToolRuntime, input?: WalletInput): `0x${string}`;
@@ -0,0 +1,4 @@
1
+ export function resolveWalletFromRuntime(runtime, input) {
2
+ return runtime.resolveWallet(input);
3
+ }
4
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../../src/tools/utils/wallet.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CACtC,OAAoB,EACpB,KAAmB;IAEnB,OAAO,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewkimjoseph/celina-sdk",
3
- "version": "0.4.11",
3
+ "version": "0.5.0",
4
4
  "description": "Celina SDK — Celo mainnet reads and unsigned transaction preparation for frontend apps.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -16,6 +16,11 @@
16
16
  "types": "./tests/testing-entry.ts",
17
17
  "import": "./tests/testing-entry.ts",
18
18
  "default": "./tests/testing-entry.ts"
19
+ },
20
+ "./tools": {
21
+ "types": "./build/tools/index.d.ts",
22
+ "import": "./build/tools/index.js",
23
+ "default": "./build/tools/index.js"
19
24
  }
20
25
  },
21
26
  "files": [
@@ -69,6 +74,7 @@
69
74
  },
70
75
  "homepage": "https://andrewkimjoseph.gitbook.io/celina-sdk",
71
76
  "dependencies": {
77
+ "zod": "^3.24.3",
72
78
  "@amplitude/analytics-node": "^1.5.21",
73
79
  "@noble/ed25519": "^3.1.0",
74
80
  "@bancor/carbon-sdk": "0.0.130-DEV",
package/tests/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ <p align="center">
2
+ <img src="../assets/celina-banner.png" alt="Celina — Give your LLM a wallet on Celo">
3
+ </p>
4
+
1
5
  # Celina operations test framework
2
6
 
3
7
  Live Celo mainnet smoke tests driven by a single operation catalog in `tests/catalog/operations.ts`. Add one `OperationSpec` when you ship a new SDK method or MCP tool.
@@ -42,6 +42,30 @@ export const blockchainOperations: OperationSpec[] = [
42
42
  assertHasKeys(result, ["number", "hash"]);
43
43
  },
44
44
  },
45
+ {
46
+ id: "blockchain.getBlockWithTransactions",
47
+ domain: "blockchain",
48
+ layer: "read",
49
+ sdk: {
50
+ invoke: (client, fx) =>
51
+ client.blockchain.getBlock(Number(fx.latestBlockNumber), {
52
+ includeTransactions: true,
53
+ }),
54
+ },
55
+ mcp: {
56
+ tool: "get_block",
57
+ arguments: (fx) => ({
58
+ blockId: Number(fx.latestBlockNumber),
59
+ includeTransactions: true,
60
+ }),
61
+ },
62
+ assert: (result) => {
63
+ const obj = assertHasKeys(result, ["number", "hash", "transactions"]);
64
+ expect(() => JSON.stringify(result)).not.toThrow();
65
+ const txs = assertArray(obj.transactions);
66
+ expect(txs.length).toBeGreaterThan(0);
67
+ },
68
+ },
45
69
  {
46
70
  id: "blockchain.getLatestBlocks",
47
71
  domain: "blockchain",
@@ -16,6 +16,7 @@ import {
16
16
  } from "./domains/chain-ext.js";
17
17
  import { selfOperations } from "./domains/self.js";
18
18
  import { carbonOperations } from "./domains/carbon.js";
19
+ import { getMcpToolNames } from "../../src/tools/catalog.js";
19
20
  import type { OperationSpec } from "./types.js";
20
21
 
21
22
  export const OPERATIONS: OperationSpec[] = [
@@ -45,4 +46,13 @@ export const SDK_OPERATIONS = OPERATIONS.filter(
45
46
  Boolean(spec.sdk),
46
47
  );
47
48
 
48
- export const MCP_TOOL_NAMES = MCP_OPERATIONS.map((spec) => spec.mcp.tool);
49
+ /** MCP tool names from the SDK tools catalog (stdio: prepare + execute Carbon). */
50
+ export const MCP_TOOL_NAMES = getMcpToolNames({
51
+ carbonPrepareEnabled: true,
52
+ carbonExecuteEnabled: true,
53
+ });
54
+
55
+ /** @deprecated Use MCP_TOOL_NAMES — kept for tests that import the operations-derived list. */
56
+ export const MCP_TOOL_NAMES_FROM_OPERATIONS = MCP_OPERATIONS.map(
57
+ (spec) => spec.mcp.tool,
58
+ );
@@ -9,6 +9,11 @@ export {
9
9
  OPERATIONS,
10
10
  SDK_OPERATIONS,
11
11
  } from "./catalog/operations.js";
12
+ export {
13
+ ALL_TOOL_DEFINITIONS,
14
+ getMcpToolNames,
15
+ getCelesteToolNames,
16
+ } from "../src/tools/catalog.js";
12
17
  export { getMainnetFixtures, type MainnetFixtures } from "./fixtures/mainnet.js";
13
18
  export {
14
19
  allowsDestructiveTests,