@andrewkimjoseph/celina-sdk 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +56 -3
  2. package/build/abis/accounts.d.ts +13 -0
  3. package/build/abis/accounts.js +10 -0
  4. package/build/abis/accounts.js.map +1 -0
  5. package/build/abis/election.d.ts +124 -0
  6. package/build/abis/election.js +88 -0
  7. package/build/abis/election.js.map +1 -0
  8. package/build/abis/governance.d.ts +86 -0
  9. package/build/abis/governance.js +68 -0
  10. package/build/abis/governance.js.map +1 -0
  11. package/build/abis/locked-gold.d.ts +10 -0
  12. package/build/abis/locked-gold.js +10 -0
  13. package/build/abis/locked-gold.js.map +1 -0
  14. package/build/abis/nft.d.ts +107 -0
  15. package/build/abis/nft.js +75 -0
  16. package/build/abis/nft.js.map +1 -0
  17. package/build/abis/validators-minimal.d.ts +65 -0
  18. package/build/abis/validators-minimal.js +39 -0
  19. package/build/abis/validators-minimal.js.map +1 -0
  20. package/build/config/celo-core-contracts.d.ts +8 -0
  21. package/build/config/celo-core-contracts.js +9 -0
  22. package/build/config/celo-core-contracts.js.map +1 -0
  23. package/build/config/chains.js +4 -0
  24. package/build/config/chains.js.map +1 -1
  25. package/build/index.d.ts +28 -0
  26. package/build/index.js +18 -0
  27. package/build/index.js.map +1 -1
  28. package/build/services/aave.service.d.ts +8 -0
  29. package/build/services/aave.service.js +9 -0
  30. package/build/services/aave.service.js.map +1 -1
  31. package/build/services/blockchain.service.d.ts +14 -3
  32. package/build/services/blockchain.service.js +42 -14
  33. package/build/services/blockchain.service.js.map +1 -1
  34. package/build/services/contract.service.d.ts +52 -0
  35. package/build/services/contract.service.js +98 -0
  36. package/build/services/contract.service.js.map +1 -0
  37. package/build/services/ens.service.d.ts +2 -0
  38. package/build/services/ens.service.js +2 -0
  39. package/build/services/ens.service.js.map +1 -1
  40. package/build/services/gooddollar.service.d.ts +1 -0
  41. package/build/services/gooddollar.service.js +1 -0
  42. package/build/services/gooddollar.service.js.map +1 -1
  43. package/build/services/governance.service.d.ts +78 -0
  44. package/build/services/governance.service.js +241 -0
  45. package/build/services/governance.service.js.map +1 -0
  46. package/build/services/mento-fx.service.d.ts +6 -0
  47. package/build/services/mento-fx.service.js +10 -0
  48. package/build/services/mento-fx.service.js.map +1 -1
  49. package/build/services/nft.service.d.ts +42 -0
  50. package/build/services/nft.service.js +203 -0
  51. package/build/services/nft.service.js.map +1 -0
  52. package/build/services/staking.service.d.ts +109 -0
  53. package/build/services/staking.service.js +410 -0
  54. package/build/services/staking.service.js.map +1 -0
  55. package/build/services/token.service.d.ts +14 -0
  56. package/build/services/token.service.js +51 -0
  57. package/build/services/token.service.js.map +1 -1
  58. package/build/services/transaction.service.d.ts +37 -0
  59. package/build/services/transaction.service.js +78 -1
  60. package/build/services/transaction.service.js.map +1 -1
  61. package/build/types/prepared.d.ts +7 -1
  62. package/build/types/prepared.js +1 -0
  63. package/build/types/prepared.js.map +1 -1
  64. package/build/utils/celo-format.d.ts +3 -0
  65. package/build/utils/celo-format.js +14 -0
  66. package/build/utils/celo-format.js.map +1 -0
  67. package/build/utils/normalize-address.d.ts +2 -0
  68. package/build/utils/normalize-address.js +11 -0
  69. package/build/utils/normalize-address.js.map +1 -0
  70. package/package.json +5 -2
@@ -0,0 +1,410 @@
1
+ import { isAddress } from "viem";
2
+ import { accountsAbi } from "../abis/accounts.js";
3
+ import { electionAbi } from "../abis/election.js";
4
+ import { lockedGoldAbi } from "../abis/locked-gold.js";
5
+ import { validatorsMinimalAbi } from "../abis/validators-minimal.js";
6
+ import { CELO_CORE_CONTRACTS } from "../config/celo-core-contracts.js";
7
+ import { formatAddress, formatCeloAmount, formatScorePercentage, } from "../utils/celo-format.js";
8
+ const MAX_ELECTABLE_VALIDATORS = 110;
9
+ function calculateGroupCapacity(groupMembers, totalLockedGold, totalValidators) {
10
+ if (totalValidators === 0)
11
+ return 0n;
12
+ const divisor = BigInt(Math.min(MAX_ELECTABLE_VALIDATORS, totalValidators));
13
+ return (totalLockedGold * BigInt(groupMembers + 1)) / divisor;
14
+ }
15
+ export class StakingService {
16
+ clientFactory;
17
+ constructor(clientFactory) {
18
+ this.clientFactory = clientFactory;
19
+ }
20
+ getClient() {
21
+ return this.clientFactory.getClients().public;
22
+ }
23
+ async getStakingBalances(address) {
24
+ if (!isAddress(address)) {
25
+ throw new Error(`Invalid address: ${address}`);
26
+ }
27
+ const client = this.getClient();
28
+ const election = CELO_CORE_CONTRACTS.election;
29
+ const groupAddresses = (await client.readContract({
30
+ address: election,
31
+ abi: electionAbi,
32
+ functionName: "getGroupsVotedForByAccount",
33
+ args: [address],
34
+ }));
35
+ if (groupAddresses.length === 0) {
36
+ return {
37
+ network: "mainnet",
38
+ address,
39
+ active: "0",
40
+ pending: "0",
41
+ total: "0",
42
+ activeFormatted: formatCeloAmount(0n),
43
+ pendingFormatted: formatCeloAmount(0n),
44
+ totalFormatted: formatCeloAmount(0n),
45
+ groups: [],
46
+ };
47
+ }
48
+ const calls = groupAddresses.flatMap((group) => [
49
+ {
50
+ address: election,
51
+ abi: electionAbi,
52
+ functionName: "getPendingVotesForGroupByAccount",
53
+ args: [group, address],
54
+ },
55
+ {
56
+ address: election,
57
+ abi: electionAbi,
58
+ functionName: "getActiveVotesForGroupByAccount",
59
+ args: [group, address],
60
+ },
61
+ ]);
62
+ const results = await client.multicall({ contracts: calls, allowFailure: true });
63
+ let totalActive = 0n;
64
+ let totalPending = 0n;
65
+ const groups = groupAddresses.map((group, index) => {
66
+ const pendingResult = results[index * 2];
67
+ const activeResult = results[index * 2 + 1];
68
+ const pending = pendingResult.status === "success" ? pendingResult.result : 0n;
69
+ const active = activeResult.status === "success" ? activeResult.result : 0n;
70
+ totalActive += active;
71
+ totalPending += pending;
72
+ return {
73
+ groupAddress: group,
74
+ active: active.toString(),
75
+ pending: pending.toString(),
76
+ total: (active + pending).toString(),
77
+ activeFormatted: formatCeloAmount(active),
78
+ pendingFormatted: formatCeloAmount(pending),
79
+ totalFormatted: formatCeloAmount(active + pending),
80
+ };
81
+ });
82
+ const total = totalActive + totalPending;
83
+ return {
84
+ network: "mainnet",
85
+ address,
86
+ active: totalActive.toString(),
87
+ pending: totalPending.toString(),
88
+ total: total.toString(),
89
+ activeFormatted: formatCeloAmount(totalActive),
90
+ pendingFormatted: formatCeloAmount(totalPending),
91
+ totalFormatted: formatCeloAmount(total),
92
+ groups,
93
+ };
94
+ }
95
+ async getActivatableStakes(address) {
96
+ if (!isAddress(address)) {
97
+ throw new Error(`Invalid address: ${address}`);
98
+ }
99
+ const balances = await this.getStakingBalances(address);
100
+ const pendingGroups = balances.groups.filter((g) => g.pending !== "0");
101
+ if (pendingGroups.length === 0) {
102
+ return {
103
+ network: "mainnet",
104
+ address,
105
+ activatableGroups: [],
106
+ groupToIsActivatable: {},
107
+ summary: {
108
+ totalActivatableGroups: 0,
109
+ totalPendingGroups: 0,
110
+ message: "No pending stakes found",
111
+ },
112
+ };
113
+ }
114
+ const client = this.getClient();
115
+ const election = CELO_CORE_CONTRACTS.election;
116
+ const calls = pendingGroups.map((g) => ({
117
+ address: election,
118
+ abi: electionAbi,
119
+ functionName: "hasActivatablePendingVotes",
120
+ args: [address, g.groupAddress],
121
+ }));
122
+ const results = await client.multicall({ contracts: calls, allowFailure: true });
123
+ const groupToIsActivatable = {};
124
+ const activatableGroups = [];
125
+ pendingGroups.forEach((group, index) => {
126
+ const result = results[index];
127
+ const isActivatable = result.status === "success" ? result.result : false;
128
+ groupToIsActivatable[group.groupAddress] = isActivatable;
129
+ if (isActivatable)
130
+ activatableGroups.push(group.groupAddress);
131
+ });
132
+ return {
133
+ network: "mainnet",
134
+ address,
135
+ activatableGroups,
136
+ groupToIsActivatable,
137
+ summary: {
138
+ totalActivatableGroups: activatableGroups.length,
139
+ totalPendingGroups: pendingGroups.length,
140
+ activatableGroupsFormatted: activatableGroups.map(formatAddress),
141
+ message: `${activatableGroups.length} of ${pendingGroups.length} groups have stakes ready to activate`,
142
+ },
143
+ };
144
+ }
145
+ async getValidatorGroups(options) {
146
+ const pageSize = Math.min(Math.max(options?.pageSize ?? 10, 1), 50);
147
+ let offset;
148
+ let limit;
149
+ if (options?.page !== undefined) {
150
+ const page = Math.max(options.page, 1);
151
+ offset = (page - 1) * pageSize;
152
+ limit = pageSize;
153
+ }
154
+ else if (options?.offset !== undefined) {
155
+ offset = Math.max(options.offset, 0);
156
+ limit = Math.min(options?.limit ?? pageSize, 100);
157
+ }
158
+ else {
159
+ offset = 0;
160
+ limit = Math.min(options?.limit ?? pageSize, 100);
161
+ }
162
+ const client = this.getClient();
163
+ const election = CELO_CORE_CONTRACTS.election;
164
+ const validators = CELO_CORE_CONTRACTS.validators;
165
+ const accounts = CELO_CORE_CONTRACTS.accounts;
166
+ const lockedGold = CELO_CORE_CONTRACTS.lockedGold;
167
+ let groupAddresses;
168
+ let groupVotes = null;
169
+ try {
170
+ const eligible = (await client.readContract({
171
+ address: election,
172
+ abi: electionAbi,
173
+ functionName: "getTotalVotesForEligibleValidatorGroups",
174
+ }));
175
+ groupAddresses = eligible[0];
176
+ groupVotes = eligible[1];
177
+ }
178
+ catch {
179
+ groupAddresses = (await client.readContract({
180
+ address: election,
181
+ abi: electionAbi,
182
+ functionName: "getEligibleValidatorGroups",
183
+ }));
184
+ }
185
+ const [totalVotes, totalLockedGold, allValidators] = await Promise.all([
186
+ client.readContract({
187
+ address: election,
188
+ abi: electionAbi,
189
+ functionName: "getTotalVotes",
190
+ }),
191
+ client
192
+ .readContract({
193
+ address: lockedGold,
194
+ abi: lockedGoldAbi,
195
+ functionName: "getTotalLockedGold",
196
+ })
197
+ .catch(() => 0n),
198
+ client
199
+ .readContract({
200
+ address: validators,
201
+ abi: validatorsMinimalAbi,
202
+ functionName: "getRegisteredValidators",
203
+ })
204
+ .catch(() => []),
205
+ ]);
206
+ const totalValidators = allValidators.length || MAX_ELECTABLE_VALIDATORS;
207
+ const slice = groupAddresses.slice(offset, offset + limit);
208
+ const groupCalls = slice.flatMap((group) => [
209
+ {
210
+ address: validators,
211
+ abi: validatorsMinimalAbi,
212
+ functionName: "getValidatorGroup",
213
+ args: [group],
214
+ },
215
+ {
216
+ address: accounts,
217
+ abi: accountsAbi,
218
+ functionName: "getName",
219
+ args: [group],
220
+ },
221
+ ]);
222
+ const groupResults = await client.multicall({
223
+ contracts: groupCalls,
224
+ allowFailure: true,
225
+ });
226
+ const groups = await Promise.all(slice.map(async (groupAddress, index) => {
227
+ const groupInfoResult = groupResults[index * 2];
228
+ const nameResult = groupResults[index * 2 + 1];
229
+ const members = groupInfoResult.status === "success"
230
+ ? groupInfoResult.result[0]
231
+ : [];
232
+ const name = nameResult.status === "success"
233
+ ? nameResult.result
234
+ : `${groupAddress.slice(0, 10)}...`;
235
+ let votes = groupVotes?.[offset + index] ?? 0n;
236
+ if (groupVotes === null) {
237
+ votes = (await client.readContract({
238
+ address: election,
239
+ abi: electionAbi,
240
+ functionName: "getActiveVotesForGroup",
241
+ args: [groupAddress],
242
+ }));
243
+ }
244
+ const numMembers = members.length;
245
+ const capacity = calculateGroupCapacity(numMembers, totalLockedGold || totalVotes, totalValidators);
246
+ return {
247
+ address: groupAddress,
248
+ name,
249
+ votes: votes.toString(),
250
+ votesFormatted: formatCeloAmount(votes),
251
+ numMembers,
252
+ capacity: capacity.toString(),
253
+ capacityFormatted: formatCeloAmount(capacity),
254
+ addressFormatted: formatAddress(groupAddress),
255
+ };
256
+ }));
257
+ const total = groupAddresses.length;
258
+ const currentPage = options?.page ?? Math.floor(offset / pageSize) + 1;
259
+ return {
260
+ network: "mainnet",
261
+ groups,
262
+ totalVotes: totalVotes.toString(),
263
+ totalVotesFormatted: formatCeloAmount(totalVotes),
264
+ pagination: {
265
+ total,
266
+ page: currentPage,
267
+ pageSize,
268
+ totalPages: Math.max(Math.ceil(total / pageSize), 1),
269
+ offset,
270
+ limit,
271
+ hasMore: offset + limit < total,
272
+ },
273
+ };
274
+ }
275
+ async getValidatorGroupDetails(groupAddress) {
276
+ if (!isAddress(groupAddress)) {
277
+ throw new Error(`Invalid group address: ${groupAddress}`);
278
+ }
279
+ const client = this.getClient();
280
+ const election = CELO_CORE_CONTRACTS.election;
281
+ const validators = CELO_CORE_CONTRACTS.validators;
282
+ const accounts = CELO_CORE_CONTRACTS.accounts;
283
+ const lockedGold = CELO_CORE_CONTRACTS.lockedGold;
284
+ const [groupInfo, name, votes, eligibleGroups, totalLockedGold, allValidators] = await Promise.all([
285
+ client.readContract({
286
+ address: validators,
287
+ abi: validatorsMinimalAbi,
288
+ functionName: "getValidatorGroup",
289
+ args: [groupAddress],
290
+ }),
291
+ client
292
+ .readContract({
293
+ address: accounts,
294
+ abi: accountsAbi,
295
+ functionName: "getName",
296
+ args: [groupAddress],
297
+ })
298
+ .catch(() => `${groupAddress.slice(0, 10)}...`),
299
+ client.readContract({
300
+ address: election,
301
+ abi: electionAbi,
302
+ functionName: "getActiveVotesForGroup",
303
+ args: [groupAddress],
304
+ }),
305
+ client.readContract({
306
+ address: election,
307
+ abi: electionAbi,
308
+ functionName: "getEligibleValidatorGroups",
309
+ }),
310
+ client
311
+ .readContract({
312
+ address: lockedGold,
313
+ abi: lockedGoldAbi,
314
+ functionName: "getTotalLockedGold",
315
+ })
316
+ .catch(() => 0n),
317
+ client
318
+ .readContract({
319
+ address: validators,
320
+ abi: validatorsMinimalAbi,
321
+ functionName: "getRegisteredValidators",
322
+ })
323
+ .catch(() => []),
324
+ ]);
325
+ const members = groupInfo[0];
326
+ const lastSlashed = groupInfo[2] > 0n ? Number(groupInfo[2]) * 1000 : null;
327
+ const totalValidators = allValidators.length || MAX_ELECTABLE_VALIDATORS;
328
+ const capacity = calculateGroupCapacity(members.length, totalLockedGold || votes, totalValidators);
329
+ const memberCalls = members.flatMap((member) => [
330
+ {
331
+ address: validators,
332
+ abi: validatorsMinimalAbi,
333
+ functionName: "getValidator",
334
+ args: [member],
335
+ },
336
+ {
337
+ address: accounts,
338
+ abi: accountsAbi,
339
+ functionName: "getName",
340
+ args: [member],
341
+ },
342
+ ]);
343
+ const memberResults = await client.multicall({
344
+ contracts: memberCalls,
345
+ allowFailure: true,
346
+ });
347
+ const memberDetails = members.map((member, index) => {
348
+ const validatorResult = memberResults[index * 2];
349
+ const nameResult = memberResults[index * 2 + 1];
350
+ if (validatorResult.status !== "success") {
351
+ return {
352
+ address: member,
353
+ addressFormatted: formatAddress(member),
354
+ name: `${member.slice(0, 10)}...`,
355
+ score: "0",
356
+ scoreFormatted: "0%",
357
+ signer: null,
358
+ status: votes > 0n ? "ELECTED" : "NOT_ELECTED",
359
+ };
360
+ }
361
+ const validatorInfo = validatorResult.result;
362
+ const memberName = nameResult.status === "success"
363
+ ? nameResult.result
364
+ : `${member.slice(0, 10)}...`;
365
+ return {
366
+ address: member,
367
+ addressFormatted: formatAddress(member),
368
+ name: memberName,
369
+ score: validatorInfo[3].toString(),
370
+ scoreFormatted: formatScorePercentage(validatorInfo[3]),
371
+ signer: validatorInfo[4],
372
+ status: votes > 0n ? "ELECTED" : "NOT_ELECTED",
373
+ };
374
+ });
375
+ const eligible = eligibleGroups.some((g) => g.toLowerCase() === groupAddress.toLowerCase());
376
+ return {
377
+ network: "mainnet",
378
+ address: groupAddress,
379
+ name,
380
+ votes: votes.toString(),
381
+ votesFormatted: formatCeloAmount(votes),
382
+ capacity: capacity.toString(),
383
+ capacityFormatted: formatCeloAmount(capacity),
384
+ lastSlashed,
385
+ eligible,
386
+ numMembers: members.length,
387
+ numElected: votes > 0n ? members.length : 0,
388
+ members: memberDetails,
389
+ };
390
+ }
391
+ async getTotalStakingInfo() {
392
+ const client = this.getClient();
393
+ const totalVotes = (await client.readContract({
394
+ address: CELO_CORE_CONTRACTS.election,
395
+ abi: electionAbi,
396
+ functionName: "getTotalVotes",
397
+ }));
398
+ return {
399
+ network: "mainnet",
400
+ totalVotes: totalVotes.toString(),
401
+ totalVotesCelo: Number(totalVotes / 10n ** 18n),
402
+ totalVotesFormatted: formatCeloAmount(totalVotes),
403
+ summary: {
404
+ networkParticipation: formatCeloAmount(totalVotes),
405
+ message: `Total network staking participation: ${formatCeloAmount(totalVotes)}`,
406
+ },
407
+ };
408
+ }
409
+ }
410
+ //# sourceMappingURL=staking.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staking.service.js","sourceRoot":"","sources":["../../src/services/staking.service.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export declare class TokenService {
8
8
  private readonly clientFactory;
9
9
  constructor(clientFactory: CeloClientFactory);
10
10
  resolveToken(token: string): ResolvedToken;
11
+ /** Fetch ERC-20 metadata or native CELO info for a symbol or address. */
11
12
  getTokenInfo(token: string): Promise<{
12
13
  network: string;
13
14
  name: string;
@@ -15,6 +16,7 @@ export declare class TokenService {
15
16
  symbol: string;
16
17
  decimals: number;
17
18
  }>;
19
+ /** CELO and ERC-20 balances for specific tokens (defaults: CELO, USDm). */
18
20
  getBalances(address: `0x${string}`, tokens?: string[]): Promise<{
19
21
  network: string;
20
22
  address: `0x${string}`;
@@ -25,6 +27,7 @@ export declare class TokenService {
25
27
  formatted: string;
26
28
  }[];
27
29
  }>;
30
+ /** Scan registry stablecoins for an address; omits zero balances by default. */
28
31
  getStablecoinBalances(address: `0x${string}`, options?: {
29
32
  stablecoins?: string[];
30
33
  includeZero?: boolean;
@@ -50,5 +53,16 @@ export declare class TokenService {
50
53
  readError?: undefined;
51
54
  })[];
52
55
  }>;
56
+ /** ERC-20 balance for a specific token contract address. */
57
+ getTokenBalance(tokenAddress: `0x${string}`, accountAddress: `0x${string}`): Promise<{
58
+ network: "mainnet";
59
+ tokenAddress: `0x${string}`;
60
+ accountAddress: `0x${string}`;
61
+ name: string;
62
+ symbol: string;
63
+ decimals: number;
64
+ raw: string;
65
+ formatted: string;
66
+ }>;
53
67
  parseAmount(amount: string, decimals: number): bigint;
54
68
  }
@@ -1,5 +1,6 @@
1
1
  import { erc20Abi, formatUnits, isAddress, parseUnits } from "viem";
2
2
  import { findKnownToken, KNOWN_TOKEN_SYMBOLS, resolveStablecoins, } from "../config/chains.js";
3
+ import { normalizeAddress } from "../utils/normalize-address.js";
3
4
  export class TokenService {
4
5
  clientFactory;
5
6
  constructor(clientFactory) {
@@ -24,6 +25,7 @@ export class TokenService {
24
25
  }
25
26
  throw new Error(`Unknown token "${token}". Use ${KNOWN_TOKEN_SYMBOLS.join(", ")}, or a contract address.`);
26
27
  }
28
+ /** Fetch ERC-20 metadata or native CELO info for a symbol or address. */
27
29
  async getTokenInfo(token) {
28
30
  const resolved = this.resolveToken(token);
29
31
  if (resolved.address === "native") {
@@ -60,6 +62,7 @@ export class TokenService {
60
62
  decimals: Number(decimals),
61
63
  };
62
64
  }
65
+ /** CELO and ERC-20 balances for specific tokens (defaults: CELO, USDm). */
63
66
  async getBalances(address, tokens = ["CELO", "USDm"]) {
64
67
  const { public: client } = this.clientFactory.getClients();
65
68
  const balances = await Promise.all(tokens.map(async (tokenInput) => {
@@ -95,6 +98,7 @@ export class TokenService {
95
98
  }));
96
99
  return { network: "mainnet", address, balances };
97
100
  }
101
+ /** Scan registry stablecoins for an address; omits zero balances by default. */
98
102
  async getStablecoinBalances(address, options) {
99
103
  const coins = resolveStablecoins(options?.stablecoins);
100
104
  const { public: client } = this.clientFactory.getClients();
@@ -140,6 +144,53 @@ export class TokenService {
140
144
  stablecoins,
141
145
  };
142
146
  }
147
+ /** ERC-20 balance for a specific token contract address. */
148
+ async getTokenBalance(tokenAddress, accountAddress) {
149
+ let token;
150
+ let account;
151
+ try {
152
+ token = normalizeAddress(tokenAddress, "token address");
153
+ account = normalizeAddress(accountAddress, "account address");
154
+ }
155
+ catch (error) {
156
+ throw error instanceof Error ? error : new Error(String(error));
157
+ }
158
+ const { public: client } = this.clientFactory.getClients();
159
+ const [name, symbol, decimals, balance] = await Promise.all([
160
+ client.readContract({
161
+ address: token,
162
+ abi: erc20Abi,
163
+ functionName: "name",
164
+ }),
165
+ client.readContract({
166
+ address: token,
167
+ abi: erc20Abi,
168
+ functionName: "symbol",
169
+ }),
170
+ client.readContract({
171
+ address: token,
172
+ abi: erc20Abi,
173
+ functionName: "decimals",
174
+ }),
175
+ client.readContract({
176
+ address: token,
177
+ abi: erc20Abi,
178
+ functionName: "balanceOf",
179
+ args: [account],
180
+ }),
181
+ ]);
182
+ const dec = Number(decimals);
183
+ return {
184
+ network: "mainnet",
185
+ tokenAddress: token,
186
+ accountAddress: account,
187
+ name,
188
+ symbol,
189
+ decimals: dec,
190
+ raw: balance.toString(),
191
+ formatted: formatUnits(balance, dec),
192
+ };
193
+ }
143
194
  parseAmount(amount, decimals) {
144
195
  return parseUnits(amount, decimals);
145
196
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token.service.js","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token.service.js","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,15 @@
1
+ /**
2
+ * Token sends: estimateSend simulates gas; prepareSend builds unsigned tx steps.
3
+ * Calldata is tagged with CELINA_DATA_SUFFIX for on-chain attribution.
4
+ */
5
+ import { type Hex } from "viem";
1
6
  import type { CeloClientFactory } from "../clients/celo-client.js";
2
7
  import { type SerializedPreparedFlow } from "../types/prepared.js";
3
8
  export declare class TransactionService {
4
9
  private readonly clientFactory;
5
10
  private readonly tokenService;
6
11
  constructor(clientFactory: CeloClientFactory);
12
+ /** Simulate gas for a CELO or ERC-20 transfer from `from`. */
7
13
  estimateSend(from: `0x${string}`, to: `0x${string}`, token: string, amount: string): Promise<{
8
14
  network: "mainnet";
9
15
  from: `0x${string}`;
@@ -12,5 +18,36 @@ export declare class TransactionService {
12
18
  amount: string;
13
19
  gas: string;
14
20
  }>;
21
+ /**
22
+ * Build an unsigned send flow (native CELO or ERC-20 transfer).
23
+ * Returns `SerializedPreparedFlow` for wagmi `sendTransaction`.
24
+ */
15
25
  prepareSend(from: `0x${string}`, to: `0x${string}`, token: string, amount: string): Promise<SerializedPreparedFlow>;
26
+ /** Current gas fee data including EIP-1559 fees when supported. */
27
+ getGasFeeData(): Promise<{
28
+ network: "mainnet";
29
+ baseFeePerGas: string;
30
+ maxFeePerGas: string;
31
+ maxPriorityFeePerGas: string;
32
+ gasPrice: string;
33
+ eip1559: boolean;
34
+ }>;
35
+ /** Generic transaction gas estimate (not token-transfer specific). */
36
+ estimateTransaction(params: {
37
+ from: `0x${string}`;
38
+ to: `0x${string}`;
39
+ value?: string;
40
+ data?: Hex;
41
+ }): Promise<{
42
+ network: "mainnet";
43
+ from: `0x${string}`;
44
+ to: `0x${string}`;
45
+ gasLimit: string;
46
+ gasPrice: string;
47
+ maxFeePerGas: string;
48
+ maxPriorityFeePerGas: string;
49
+ estimatedCost: string;
50
+ estimatedCostFormatted: string;
51
+ isEip1559: boolean;
52
+ }>;
16
53
  }