@andrewkimjoseph/celina 0.2.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +225 -0
  3. package/bin/cli.js +2 -0
  4. package/build/clients/celo-client.d.ts +14 -0
  5. package/build/clients/celo-client.js +58 -0
  6. package/build/clients/celo-client.js.map +1 -0
  7. package/build/config/chains.d.ts +932 -0
  8. package/build/config/chains.js +236 -0
  9. package/build/config/chains.js.map +1 -0
  10. package/build/config/env.d.ts +5 -0
  11. package/build/config/env.js +7 -0
  12. package/build/config/env.js.map +1 -0
  13. package/build/context/app-context.d.ts +16 -0
  14. package/build/context/app-context.js +17 -0
  15. package/build/context/app-context.js.map +1 -0
  16. package/build/crypto/wallet-key-crypto.d.ts +11 -0
  17. package/build/crypto/wallet-key-crypto.js +57 -0
  18. package/build/crypto/wallet-key-crypto.js.map +1 -0
  19. package/build/http.d.ts +2 -0
  20. package/build/http.js +14 -0
  21. package/build/http.js.map +1 -0
  22. package/build/index.d.ts +2 -0
  23. package/build/index.js +14 -0
  24. package/build/index.js.map +1 -0
  25. package/build/schemas/common.d.ts +4 -0
  26. package/build/schemas/common.js +16 -0
  27. package/build/schemas/common.js.map +1 -0
  28. package/build/server/create-http-app.d.ts +1 -0
  29. package/build/server/create-http-app.js +134 -0
  30. package/build/server/create-http-app.js.map +1 -0
  31. package/build/server/create-server.d.ts +2 -0
  32. package/build/server/create-server.js +21 -0
  33. package/build/server/create-server.js.map +1 -0
  34. package/build/server/instructions.d.ts +1 -0
  35. package/build/server/instructions.js +13 -0
  36. package/build/server/instructions.js.map +1 -0
  37. package/build/services/account.service.d.ts +13 -0
  38. package/build/services/account.service.js +23 -0
  39. package/build/services/account.service.js.map +1 -0
  40. package/build/services/blockchain.service.d.ts +40 -0
  41. package/build/services/blockchain.service.js +81 -0
  42. package/build/services/blockchain.service.js.map +1 -0
  43. package/build/services/token.service.d.ts +54 -0
  44. package/build/services/token.service.js +147 -0
  45. package/build/services/token.service.js.map +1 -0
  46. package/build/services/transaction.service.d.ts +33 -0
  47. package/build/services/transaction.service.js +126 -0
  48. package/build/services/transaction.service.js.map +1 -0
  49. package/build/tools/blockchain.tools.d.ts +3 -0
  50. package/build/tools/blockchain.tools.js +88 -0
  51. package/build/tools/blockchain.tools.js.map +1 -0
  52. package/build/tools/helpers.d.ts +3 -0
  53. package/build/tools/helpers.js +16 -0
  54. package/build/tools/helpers.js.map +1 -0
  55. package/build/tools/index.d.ts +5 -0
  56. package/build/tools/index.js +17 -0
  57. package/build/tools/index.js.map +1 -0
  58. package/build/tools/token.tools.d.ts +2 -0
  59. package/build/tools/token.tools.js +62 -0
  60. package/build/tools/token.tools.js.map +1 -0
  61. package/build/tools/transaction.tools.d.ts +2 -0
  62. package/build/tools/transaction.tools.js +68 -0
  63. package/build/tools/transaction.tools.js.map +1 -0
  64. package/build/tools/types.d.ts +5 -0
  65. package/build/tools/types.js +2 -0
  66. package/build/tools/types.js.map +1 -0
  67. package/build/tools/wallet.tools.d.ts +2 -0
  68. package/build/tools/wallet.tools.js +23 -0
  69. package/build/tools/wallet.tools.js.map +1 -0
  70. package/package.json +54 -0
@@ -0,0 +1,236 @@
1
+ import { celo } from "viem/chains";
2
+ export const CHAIN = celo;
3
+ export const DEFAULT_RPC_URL = "https://forno.celo.org";
4
+ export const KNOWN_TOKENS = [
5
+ {
6
+ symbol: "CELO",
7
+ address: "native",
8
+ decimals: 18,
9
+ },
10
+ {
11
+ symbol: "USDm",
12
+ aliases: ["cUSD"],
13
+ address: "0x765de816845861e75a25fca122bb6898b8b1282a",
14
+ issuer: "Mento",
15
+ useCase: "US Dollar-pegged stablecoin (Mento Dollar)",
16
+ decimals: 18,
17
+ },
18
+ {
19
+ symbol: "EURm",
20
+ aliases: ["cEUR"],
21
+ address: "0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73",
22
+ issuer: "Mento",
23
+ useCase: "Euro-pegged stablecoin (Mento Euro)",
24
+ decimals: 18,
25
+ },
26
+ {
27
+ symbol: "BRLm",
28
+ address: "0xe8537a3d056da446677b9e9d6c5db704eaab4787",
29
+ issuer: "Mento",
30
+ useCase: "Brazilian Real-pegged stablecoin",
31
+ decimals: 18,
32
+ },
33
+ {
34
+ symbol: "XOFm",
35
+ address: "0x73F93dcc49cB8A239e2032663e9475dd5ef29A08",
36
+ issuer: "Mento",
37
+ useCase: "CFA Franc-pegged stablecoin",
38
+ decimals: 18,
39
+ },
40
+ {
41
+ symbol: "KESm",
42
+ address: "0x456a3D042C0DbD3db53D5489e98dFb038553B0d0",
43
+ issuer: "Mento",
44
+ useCase: "Kenyan Shilling-pegged stablecoin",
45
+ decimals: 18,
46
+ },
47
+ {
48
+ symbol: "PHPm",
49
+ address: "0x105d4A9306D2E55a71d2Eb95B81553AE1dC20d7B",
50
+ issuer: "Mento",
51
+ useCase: "Philippine Peso-pegged stablecoin",
52
+ decimals: 18,
53
+ },
54
+ {
55
+ symbol: "COPm",
56
+ address: "0x8a567e2ae79ca692bd748ab832081c45de4041ea",
57
+ issuer: "Mento",
58
+ useCase: "Colombian Peso-pegged stablecoin",
59
+ decimals: 18,
60
+ },
61
+ {
62
+ symbol: "GBPm",
63
+ address: "0xCCF663b1fF11028f0b19058d0f7B674004a40746",
64
+ issuer: "Mento",
65
+ useCase: "British Pound-pegged stablecoin",
66
+ decimals: 18,
67
+ },
68
+ {
69
+ symbol: "CADm",
70
+ address: "0xff4Ab19391af240c311c54200a492233052B6325",
71
+ issuer: "Mento",
72
+ useCase: "Canadian Dollar-pegged stablecoin",
73
+ decimals: 18,
74
+ },
75
+ {
76
+ symbol: "AUDm",
77
+ address: "0x7175504C455076F15c04A2F90a8e352281F492F9",
78
+ issuer: "Mento",
79
+ useCase: "Australian Dollar-pegged stablecoin",
80
+ decimals: 18,
81
+ },
82
+ {
83
+ symbol: "ZARm",
84
+ address: "0x4c35853A3B4e647fD266f4de678dCc8fEC410BF6",
85
+ issuer: "Mento",
86
+ useCase: "South African Rand-pegged stablecoin",
87
+ decimals: 18,
88
+ },
89
+ {
90
+ symbol: "GHSm",
91
+ address: "0xfAeA5F3404bbA20D3cc2f8C4B0A888F55a3c7313",
92
+ issuer: "Mento",
93
+ useCase: "Ghanaian Cedi-pegged stablecoin",
94
+ decimals: 18,
95
+ },
96
+ {
97
+ symbol: "NGNm",
98
+ address: "0xE2702Bd97ee33c88c8f6f92DA3B733608aa76F71",
99
+ issuer: "Mento",
100
+ useCase: "Nigerian Naira-pegged stablecoin",
101
+ decimals: 18,
102
+ },
103
+ {
104
+ symbol: "JPYm",
105
+ address: "0xc45eCF20f3CD864B32D9794d6f76814aE8892e20",
106
+ issuer: "Mento",
107
+ useCase: "Japanese Yen-pegged stablecoin",
108
+ decimals: 18,
109
+ },
110
+ {
111
+ symbol: "CHFm",
112
+ address: "0xb55a79F398E759E43C95b979163f30eC87Ee131D",
113
+ issuer: "Mento",
114
+ useCase: "Swiss Franc-pegged stablecoin",
115
+ decimals: 18,
116
+ },
117
+ {
118
+ symbol: "USDT",
119
+ address: "0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e",
120
+ issuer: "Tether",
121
+ useCase: "Popular stablecoin on multiple blockchains",
122
+ decimals: 6,
123
+ },
124
+ {
125
+ symbol: "USDC",
126
+ address: "0xceba9300f2b948710d2653dd7b07f33a8b32118c",
127
+ issuer: "Circle",
128
+ useCase: "Widely used stablecoin with high liquidity",
129
+ decimals: 6,
130
+ },
131
+ {
132
+ symbol: "vEUR",
133
+ address: "0x9346f43c1588b6df1d52bdd6bf846064f92d9cba",
134
+ issuer: "VNX",
135
+ useCase: "Euro-pegged stablecoin",
136
+ decimals: 18,
137
+ },
138
+ {
139
+ symbol: "vGBP",
140
+ address: "0x7ae4265ecfc1f31bc0e112dfcfe3d78e01f4bb7f",
141
+ issuer: "VNX",
142
+ useCase: "British Pound-pegged stablecoin",
143
+ decimals: 18,
144
+ },
145
+ {
146
+ symbol: "vCHF",
147
+ address: "0xc5ebea9984c485ec5d58ca5a2d376620d93af871",
148
+ issuer: "VNX",
149
+ useCase: "Swiss Franc-pegged stablecoin",
150
+ decimals: 18,
151
+ },
152
+ {
153
+ symbol: "USDM",
154
+ address: "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C",
155
+ issuer: "Mountain Protocol",
156
+ useCase: "Yield-bearing stablecoin",
157
+ decimals: 18,
158
+ },
159
+ {
160
+ symbol: "USDA",
161
+ address: "0x0000206329b97DB379d5E1Bf586BbDB969C63274",
162
+ issuer: "Angle",
163
+ useCase: "Yield-bearing USD stablecoin",
164
+ decimals: 18,
165
+ },
166
+ {
167
+ symbol: "EURA",
168
+ address: "0xC16B81Af351BA9e64C1a069E3Ab18c244A1E3049",
169
+ issuer: "Angle",
170
+ useCase: "Yield-bearing Euro stablecoin",
171
+ decimals: 18,
172
+ },
173
+ {
174
+ symbol: "USDGLO",
175
+ address: "0x4f604735c1cf31399c6e711d5962b2b3e0225ad3",
176
+ issuer: "Glo Foundation",
177
+ useCase: "Impact-driven stablecoin supporting global causes",
178
+ decimals: 18,
179
+ },
180
+ {
181
+ symbol: "BRLA",
182
+ address: "0xfecb3f7c54e2caae9dc6ac9060a822d47e053760",
183
+ issuer: "BRLA Digital",
184
+ useCase: "Brazil-based stablecoin",
185
+ decimals: 18,
186
+ },
187
+ {
188
+ symbol: "COPM",
189
+ address: "0xC92E8Fc2947E32F2B574CCA9F2F12097A71d5606",
190
+ issuer: "Minteo",
191
+ useCase: "Fiat-backed Colombian Peso stablecoin",
192
+ decimals: 18,
193
+ },
194
+ {
195
+ symbol: "GoodDollar",
196
+ aliases: ["G$"],
197
+ address: "0x62B8B11039FcfE5aB0C56E502b1C372A3d2a9c7A",
198
+ issuer: "GoodDollar",
199
+ useCase: "UBI-focused stablecoin for financial inclusion",
200
+ decimals: 18,
201
+ },
202
+ ];
203
+ export const STABLECOINS = KNOWN_TOKENS.filter((token) => token.address !== "native" &&
204
+ token.issuer !== undefined &&
205
+ token.useCase !== undefined);
206
+ export const KNOWN_TOKEN_SYMBOLS = KNOWN_TOKENS.flatMap((token) => [
207
+ token.symbol,
208
+ ...(token.aliases ?? []),
209
+ ]).sort();
210
+ function tokenMatchesInput(token, normalized, upper) {
211
+ if (token.symbol === normalized || token.symbol.toUpperCase() === upper) {
212
+ return true;
213
+ }
214
+ return (token.aliases?.some((alias) => alias === normalized || alias.toUpperCase() === upper) ?? false);
215
+ }
216
+ export function findKnownToken(token) {
217
+ const normalized = token.trim();
218
+ const upper = normalized.toUpperCase();
219
+ return KNOWN_TOKENS.find((entry) => tokenMatchesInput(entry, normalized, upper) ||
220
+ (upper === "NATIVE" && entry.address === "native"));
221
+ }
222
+ export function resolveStablecoins(symbols) {
223
+ if (!symbols?.length) {
224
+ return STABLECOINS;
225
+ }
226
+ const wanted = symbols.map((symbol) => symbol.trim());
227
+ const matched = STABLECOINS.filter((coin) => wanted.some((input) => {
228
+ const upper = input.toUpperCase();
229
+ return tokenMatchesInput(coin, input, upper);
230
+ }));
231
+ if (matched.length === 0) {
232
+ throw new Error(`No matching stablecoins. Available: ${STABLECOINS.map((coin) => coin.symbol).join(", ")}`);
233
+ }
234
+ return matched;
235
+ }
236
+ //# sourceMappingURL=chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/config/chains.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface AppConfig {
2
+ rpcUrl: string;
3
+ privateKey?: `0x${string}`;
4
+ }
5
+ export declare function loadConfig(): AppConfig;
@@ -0,0 +1,7 @@
1
+ export function loadConfig() {
2
+ return {
3
+ rpcUrl: process.env.CELO_RPC_URL_MAINNET ?? "https://forno.celo.org",
4
+ privateKey: process.env.CELO_PRIVATE_KEY,
5
+ };
6
+ }
7
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,wBAAwB;QACpE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,gBAA6C;KACtE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CeloClientFactory } from "../clients/celo-client.js";
2
+ import { BlockchainService } from "../services/blockchain.service.js";
3
+ import { AccountService } from "../services/account.service.js";
4
+ import { TokenService } from "../services/token.service.js";
5
+ import { TransactionService } from "../services/transaction.service.js";
6
+ export interface AppContext {
7
+ config: {
8
+ hasWallet: boolean;
9
+ walletAddress?: `0x${string}`;
10
+ };
11
+ blockchain: BlockchainService;
12
+ account: AccountService;
13
+ token: TokenService;
14
+ transaction: TransactionService;
15
+ }
16
+ export declare function createAppContext(clientFactory: CeloClientFactory, walletAddress?: `0x${string}`): AppContext;
@@ -0,0 +1,17 @@
1
+ import { BlockchainService } from "../services/blockchain.service.js";
2
+ import { AccountService } from "../services/account.service.js";
3
+ import { TokenService } from "../services/token.service.js";
4
+ import { TransactionService } from "../services/transaction.service.js";
5
+ export function createAppContext(clientFactory, walletAddress) {
6
+ return {
7
+ config: {
8
+ hasWallet: Boolean(walletAddress),
9
+ walletAddress,
10
+ },
11
+ blockchain: new BlockchainService(clientFactory),
12
+ account: new AccountService(clientFactory),
13
+ token: new TokenService(clientFactory),
14
+ transaction: new TransactionService(clientFactory),
15
+ };
16
+ }
17
+ //# sourceMappingURL=app-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/context/app-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAaxE,MAAM,UAAU,gBAAgB,CAC9B,aAAgC,EAChC,aAA6B;IAE7B,OAAO;QACL,MAAM,EAAE;YACN,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC;YACjC,aAAa;SACd;QACD,UAAU,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC;QAChD,OAAO,EAAE,IAAI,cAAc,CAAC,aAAa,CAAC;QAC1C,KAAK,EAAE,IAAI,YAAY,CAAC,aAAa,CAAC;QACtC,WAAW,EAAE,IAAI,kBAAkB,CAAC,aAAa,CAAC;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function isWalletEncryptionConfigured(): boolean;
2
+ export declare function getPublicKeyPem(): string;
3
+ export declare function getEncryptionInfo(): {
4
+ algorithm: string;
5
+ hash: string;
6
+ encoding: string;
7
+ publicKey: string;
8
+ instructions: string;
9
+ };
10
+ export declare function encryptPrivateKey(publicKeyPem: string, privateKey: string): string;
11
+ export declare function decryptPrivateKey(encryptedBase64: string): `0x${string}`;
@@ -0,0 +1,57 @@
1
+ import { createPrivateKey, createPublicKey, privateDecrypt, publicEncrypt, } from "node:crypto";
2
+ const RSA_OAEP = {
3
+ oaepHash: "sha256",
4
+ padding: 4, // RSA_PKCS1_OAEP_PADDING
5
+ };
6
+ const PRIVATE_KEY_PATTERN = /^0x[0-9a-fA-F]{64}$/;
7
+ let cachedPrivateKey;
8
+ function loadPrivateKey() {
9
+ if (cachedPrivateKey) {
10
+ return cachedPrivateKey;
11
+ }
12
+ const pem = process.env.WALLET_ENCRYPTION_PRIVATE_KEY;
13
+ if (!pem) {
14
+ throw new Error("Wallet encryption is not configured. Set WALLET_ENCRYPTION_PRIVATE_KEY.");
15
+ }
16
+ cachedPrivateKey = createPrivateKey(pem);
17
+ return cachedPrivateKey;
18
+ }
19
+ export function isWalletEncryptionConfigured() {
20
+ return Boolean(process.env.WALLET_ENCRYPTION_PRIVATE_KEY);
21
+ }
22
+ export function getPublicKeyPem() {
23
+ const privateKey = loadPrivateKey();
24
+ return createPublicKey(privateKey).export({ type: "spki", format: "pem" });
25
+ }
26
+ export function getEncryptionInfo() {
27
+ return {
28
+ algorithm: "RSA-OAEP",
29
+ hash: "sha256",
30
+ encoding: "base64",
31
+ publicKey: getPublicKeyPem(),
32
+ instructions: "Encrypt your 0x-prefixed private key locally with this public key, then pass the base64 ciphertext as encryptedPrivateKey.",
33
+ };
34
+ }
35
+ export function encryptPrivateKey(publicKeyPem, privateKey) {
36
+ if (!PRIVATE_KEY_PATTERN.test(privateKey)) {
37
+ throw new Error("Invalid private key format. Expected 0x followed by 64 hex chars.");
38
+ }
39
+ const encrypted = publicEncrypt({ key: publicKeyPem, ...RSA_OAEP }, Buffer.from(privateKey, "utf8"));
40
+ return encrypted.toString("base64");
41
+ }
42
+ export function decryptPrivateKey(encryptedBase64) {
43
+ const privateKey = loadPrivateKey();
44
+ let decrypted;
45
+ try {
46
+ decrypted = privateDecrypt({ key: privateKey, ...RSA_OAEP }, Buffer.from(encryptedBase64, "base64"));
47
+ }
48
+ catch {
49
+ throw new Error("Failed to decrypt private key. Ensure it was encrypted with this server's public key.");
50
+ }
51
+ const value = decrypted.toString("utf8");
52
+ if (!PRIVATE_KEY_PATTERN.test(value)) {
53
+ throw new Error("Decrypted value is not a valid private key.");
54
+ }
55
+ return value;
56
+ }
57
+ //# sourceMappingURL=wallet-key-crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-key-crypto.js","sourceRoot":"","sources":["../../src/crypto/wallet-key-crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,GAEd,MAAM,aAAa,CAAC;AAErB,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,QAAiB;IAC3B,OAAO,EAAE,CAAC,EAAE,yBAAyB;CACtC,CAAC;AAEF,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAElD,IAAI,gBAAuC,CAAC;AAE5C,SAAS,cAAc;IACrB,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAW,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,eAAe,EAAE;QAC5B,YAAY,EACV,4HAA4H;KAC/H,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,UAAkB;IAElB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAC7B,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,QAAQ,EAAE,EAClC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAChC,CAAC;IAEF,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,eAAuB;IACvD,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,SAAiB,CAAC;IAEtB,IAAI,CAAC;QACH,SAAS,GAAG,cAAc,CACxB,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,EAChC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CACvC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAsB,CAAC;AAChC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/build/http.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { app } from "./server/create-http-app.js";
3
+ const PORT = parseInt(process.env.PORT || "10000", 10);
4
+ if (!process.env.WALLET_ENCRYPTION_PRIVATE_KEY) {
5
+ console.warn("WARNING: WALLET_ENCRYPTION_PRIVATE_KEY is not set. Write tools requiring encryptedPrivateKey will fail.");
6
+ }
7
+ app.listen(PORT, "0.0.0.0", () => {
8
+ console.log(`Celina HTTP server listening on port ${PORT}`);
9
+ });
10
+ process.on("SIGINT", () => {
11
+ console.log("Shutting down server...");
12
+ process.exit(0);
13
+ });
14
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAElD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAEvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;IAC/C,OAAO,CAAC,IAAI,CACV,yGAAyG,CAC1G,CAAC;AACJ,CAAC;AAED,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IAC/B,OAAO,CAAC,GAAG,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/build/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server/create-server.js";
4
+ async function main() {
5
+ const server = createServer();
6
+ const transport = new StdioServerTransport();
7
+ await server.connect(transport);
8
+ console.error("Celina running on stdio");
9
+ }
10
+ main().catch((error) => {
11
+ console.error("Fatal error:", error);
12
+ process.exit(1);
13
+ });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ export declare const addressSchema: z.ZodString;
3
+ export declare const blockIdSchema: z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodLiteral<"latest">, z.ZodLiteral<"pending">]>;
4
+ export declare const tokenSymbolSchema: z.ZodString;
@@ -0,0 +1,16 @@
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 blockIdSchema = z
6
+ .union([
7
+ z.number().int().nonnegative(),
8
+ z.string().regex(/^0x[a-fA-F0-9]+$/, "Invalid block hash"),
9
+ z.literal("latest"),
10
+ z.literal("pending"),
11
+ ])
12
+ .describe("Block number, hash, or latest/pending");
13
+ export const tokenSymbolSchema = z
14
+ .string()
15
+ .describe("Token symbol (e.g. CELO, USDm, G$, GoodDollar) or 0x contract address");
16
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,EAAE;KACR,KAAK,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,KAAK,CAAC;IACL,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC9B,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;IAC1D,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;CACrB,CAAC;KACD,QAAQ,CAAC,uCAAuC,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,EAAE;KACR,QAAQ,CAAC,uEAAuE,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const app: import("express").Express;
@@ -0,0 +1,134 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
3
+ import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
4
+ import { getEncryptionInfo, isWalletEncryptionConfigured, } from "../crypto/wallet-key-crypto.js";
5
+ import { createServer } from "./create-server.js";
6
+ const RENDER_EXTERNAL_HOSTNAME = process.env.RENDER_EXTERNAL_HOSTNAME;
7
+ export const app = createMcpExpressApp({
8
+ host: "0.0.0.0",
9
+ allowedHosts: RENDER_EXTERNAL_HOSTNAME
10
+ ? [RENDER_EXTERNAL_HOSTNAME]
11
+ : undefined,
12
+ });
13
+ const transports = new Map();
14
+ function isInitializeRequest(body) {
15
+ if (Array.isArray(body)) {
16
+ return body.some(isInitializeRequest);
17
+ }
18
+ if (!body || typeof body !== "object") {
19
+ return false;
20
+ }
21
+ return body.method === "initialize";
22
+ }
23
+ app.get("/health", (_req, res) => {
24
+ res.json({ status: "ok" });
25
+ });
26
+ app.get("/public-key", (_req, res) => {
27
+ if (!isWalletEncryptionConfigured()) {
28
+ res.status(503).json({
29
+ error: "Wallet encryption is not configured on this server.",
30
+ });
31
+ return;
32
+ }
33
+ const { publicKey, algorithm, hash, encoding } = getEncryptionInfo();
34
+ res.json({ publicKey, algorithm, hash, encoding });
35
+ });
36
+ app.post("/mcp", async (req, res) => {
37
+ const sessionId = req.headers["mcp-session-id"];
38
+ try {
39
+ let transport;
40
+ if (sessionId && transports.has(sessionId)) {
41
+ transport = transports.get(sessionId);
42
+ }
43
+ else if (!sessionId && isInitializeRequest(req.body)) {
44
+ transport = new StreamableHTTPServerTransport({
45
+ sessionIdGenerator: () => randomUUID(),
46
+ onsessioninitialized: (id) => {
47
+ if (transport) {
48
+ transports.set(id, transport);
49
+ }
50
+ },
51
+ });
52
+ transport.onclose = () => {
53
+ const id = transport?.sessionId;
54
+ if (id) {
55
+ transports.delete(id);
56
+ }
57
+ };
58
+ const server = createServer();
59
+ await server.connect(transport);
60
+ await transport.handleRequest(req, res, req.body);
61
+ return;
62
+ }
63
+ else if (sessionId) {
64
+ res.status(404).json({
65
+ jsonrpc: "2.0",
66
+ error: { code: -32001, message: "Session not found" },
67
+ id: null,
68
+ });
69
+ return;
70
+ }
71
+ else {
72
+ res.status(400).json({
73
+ jsonrpc: "2.0",
74
+ error: { code: -32000, message: "Bad Request: Session ID required" },
75
+ id: null,
76
+ });
77
+ return;
78
+ }
79
+ await transport.handleRequest(req, res, req.body);
80
+ }
81
+ catch (error) {
82
+ console.error("Error handling MCP request:", error);
83
+ if (!res.headersSent) {
84
+ res.status(500).json({
85
+ jsonrpc: "2.0",
86
+ error: { code: -32603, message: "Internal server error" },
87
+ id: null,
88
+ });
89
+ }
90
+ }
91
+ });
92
+ app.get("/mcp", async (req, res) => {
93
+ const sessionId = req.headers["mcp-session-id"];
94
+ if (!sessionId) {
95
+ res.status(400).send("Missing session ID");
96
+ return;
97
+ }
98
+ const transport = transports.get(sessionId);
99
+ if (!transport) {
100
+ res.status(404).send("Session not found");
101
+ return;
102
+ }
103
+ try {
104
+ await transport.handleRequest(req, res);
105
+ }
106
+ catch (error) {
107
+ console.error("Error handling MCP SSE request:", error);
108
+ if (!res.headersSent) {
109
+ res.status(500).send("Error processing SSE stream");
110
+ }
111
+ }
112
+ });
113
+ app.delete("/mcp", async (req, res) => {
114
+ const sessionId = req.headers["mcp-session-id"];
115
+ if (!sessionId) {
116
+ res.status(400).send("Missing session ID");
117
+ return;
118
+ }
119
+ const transport = transports.get(sessionId);
120
+ if (!transport) {
121
+ res.status(404).send("Session not found");
122
+ return;
123
+ }
124
+ try {
125
+ await transport.handleRequest(req, res);
126
+ }
127
+ catch (error) {
128
+ console.error("Error handling MCP session termination:", error);
129
+ if (!res.headersSent) {
130
+ res.status(500).send("Error processing session termination");
131
+ }
132
+ }
133
+ });
134
+ //# sourceMappingURL=create-http-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-http-app.js","sourceRoot":"","sources":["../../src/server/create-http-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function createServer(): McpServer;
@@ -0,0 +1,21 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { loadConfig } from "../config/env.js";
3
+ import { CeloClientFactory } from "../clients/celo-client.js";
4
+ import { createAppContext } from "../context/app-context.js";
5
+ import { registerAllTools } from "../tools/index.js";
6
+ import { SERVER_INSTRUCTIONS } from "./instructions.js";
7
+ export function createServer() {
8
+ const config = loadConfig();
9
+ const clientFactory = new CeloClientFactory(config);
10
+ const clients = clientFactory.getClients();
11
+ const server = new McpServer({ name: "celina", version: "0.2.0" }, {
12
+ instructions: SERVER_INSTRUCTIONS,
13
+ capabilities: {
14
+ tools: { listChanged: true },
15
+ logging: {},
16
+ },
17
+ });
18
+ registerAllTools(server, createAppContext(clientFactory, clients.accountAddress));
19
+ return server;
20
+ }
21
+ //# sourceMappingURL=create-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EACpC;QACE,YAAY,EAAE,mBAAmB;QACjC,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;YAC5B,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAEF,gBAAgB,CACd,MAAM,EACN,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CACxD,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const SERVER_INSTRUCTIONS: string;
@@ -0,0 +1,13 @@
1
+ export const SERVER_INSTRUCTIONS = `
2
+ You are connected to Celina, the Celo MCP server (mainnet only).
3
+
4
+ Guidelines:
5
+ - Prefer read-only tools (get_*) before any write operation.
6
+ - Always call estimate_send before send_token when possible.
7
+ - Write tools require CELO_PRIVATE_KEY in the server environment.
8
+ - Known tokens are defined in a single registry: CELO (native), mainnet stablecoins (USDm, EURm, USDC, USDT, etc.), and GoodDollar.
9
+ - Use get_stablecoin_balances to scan all stablecoins at once; use get_celo_balances with a tokens list for specific symbols.
10
+
11
+ Future tools (add as new modules in src/tools/): lend on Aave, Self verify, Self Agent ID check.
12
+ `.trim();
13
+ //# sourceMappingURL=instructions.js.map