@andrewkimjoseph/celina-sdk 0.2.3 → 0.2.4
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/build/config/aave.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { isAddress } from "viem";
|
|
2
1
|
import { findKnownToken } from "./chains.js";
|
|
2
|
+
const HEX_ADDRESS_RE = /^0x[a-fA-F0-9]{40}$/;
|
|
3
3
|
/** Aave V3 on Celo mainnet — from bgd-labs/aave-address-book AaveV3Celo */
|
|
4
4
|
export const AAVE_POOL = "0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402";
|
|
5
5
|
export const AAVE_CHAIN_ID = 42220;
|
|
@@ -52,9 +52,10 @@ export function resolveAaveAsset(token) {
|
|
|
52
52
|
return byKnownSymbol;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
if (
|
|
55
|
+
if (HEX_ADDRESS_RE.test(normalized)) {
|
|
56
56
|
const lower = normalized.toLowerCase();
|
|
57
|
-
const byAddress = Object.values(AAVE_ASSETS).find((asset) => asset.underlying.toLowerCase() === lower
|
|
57
|
+
const byAddress = Object.values(AAVE_ASSETS).find((asset) => asset.underlying.toLowerCase() === lower ||
|
|
58
|
+
asset.aToken.toLowerCase() === lower);
|
|
58
59
|
if (byAddress) {
|
|
59
60
|
return byAddress;
|
|
60
61
|
}
|
package/build/config/aave.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aave.js","sourceRoot":"","sources":["../../src/config/aave.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"aave.js","sourceRoot":"","sources":["../../src/config/aave.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAG,4CAAqD,CAAC;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AAQnC,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,4CAA4C;QACxD,MAAM,EAAE,4CAA4C;KACrD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,4CAA4C;QACxD,MAAM,EAAE,4CAA4C;KACrD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,4CAA4C;QACxD,MAAM,EAAE,4CAA4C;KACrD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,4CAA4C;QACxD,MAAM,EAAE,4CAA4C;KACrD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,4CAA4C;QACxD,MAAM,EAAE,4CAA4C;KACrD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,4CAA4C;QACxD,MAAM,EAAE,4CAA4C;KACrD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACE,CAAC;AAEX,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAC/C,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,KAAK;YACxC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CACvC,CAAC;QACF,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CACnE,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,UAAU,KAAK,kDAAkD,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACtG,CAAC;AACJ,CAAC"}
|
|
@@ -8,29 +8,33 @@ export declare class TokenService {
|
|
|
8
8
|
private readonly clientFactory;
|
|
9
9
|
constructor(clientFactory: CeloClientFactory);
|
|
10
10
|
/**
|
|
11
|
-
* Resolve a
|
|
12
|
-
* @
|
|
13
|
-
* @throws If token is unknown
|
|
11
|
+
* Resolve a Celo mainnet registry token by symbol, alias, or registry address.
|
|
12
|
+
* @throws If the token is not in the Celo registry
|
|
14
13
|
*/
|
|
15
14
|
resolveToken(token: string): ResolvedToken;
|
|
16
|
-
/** Fetch
|
|
15
|
+
/** Fetch registry token metadata on Celo mainnet. */
|
|
17
16
|
getTokenInfo(token: string): Promise<{
|
|
18
|
-
network:
|
|
19
|
-
name: string;
|
|
17
|
+
network: "mainnet";
|
|
20
18
|
address: `0x${string}` | "native";
|
|
19
|
+
name: string;
|
|
21
20
|
symbol: string;
|
|
22
21
|
decimals: number;
|
|
23
22
|
}>;
|
|
24
|
-
/** CELO and ERC-20 balances for
|
|
23
|
+
/** CELO and ERC-20 balances for registry tokens (defaults: CELO, USDm). */
|
|
25
24
|
getBalances(address: `0x${string}`, tokens?: string[]): Promise<{
|
|
26
|
-
network:
|
|
25
|
+
network: "mainnet";
|
|
27
26
|
address: `0x${string}`;
|
|
28
|
-
balances: {
|
|
27
|
+
balances: ({
|
|
29
28
|
token: string;
|
|
30
|
-
address:
|
|
29
|
+
address: "native";
|
|
31
30
|
raw: string;
|
|
32
31
|
formatted: string;
|
|
33
|
-
}
|
|
32
|
+
} | {
|
|
33
|
+
token: string;
|
|
34
|
+
address: `0x${string}`;
|
|
35
|
+
raw: string;
|
|
36
|
+
formatted: string;
|
|
37
|
+
})[];
|
|
34
38
|
}>;
|
|
35
39
|
/**
|
|
36
40
|
* Scan registry stablecoins for an address; omits zero balances by default.
|
|
@@ -63,8 +67,17 @@ export declare class TokenService {
|
|
|
63
67
|
readError?: undefined;
|
|
64
68
|
})[];
|
|
65
69
|
}>;
|
|
66
|
-
/**
|
|
67
|
-
getTokenBalance(
|
|
70
|
+
/** Balance for a Celo mainnet registry token (symbol or registry address). */
|
|
71
|
+
getTokenBalance(token: string, accountAddress: `0x${string}`): Promise<{
|
|
72
|
+
network: "mainnet";
|
|
73
|
+
tokenAddress: "native";
|
|
74
|
+
accountAddress: `0x${string}`;
|
|
75
|
+
name: string;
|
|
76
|
+
symbol: string;
|
|
77
|
+
decimals: number;
|
|
78
|
+
raw: string;
|
|
79
|
+
formatted: string;
|
|
80
|
+
} | {
|
|
68
81
|
network: "mainnet";
|
|
69
82
|
tokenAddress: `0x${string}`;
|
|
70
83
|
accountAddress: `0x${string}`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { erc20Abi, formatUnits,
|
|
1
|
+
import { erc20Abi, formatUnits, parseUnits } from "viem";
|
|
2
2
|
import { findKnownToken, KNOWN_TOKEN_SYMBOLS, resolveStablecoins, } from "../config/chains.js";
|
|
3
3
|
import { normalizeAddress } from "../utils/normalize-address.js";
|
|
4
4
|
export class TokenService {
|
|
@@ -7,67 +7,32 @@ export class TokenService {
|
|
|
7
7
|
this.clientFactory = clientFactory;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* Resolve a
|
|
11
|
-
* @
|
|
12
|
-
* @throws If token is unknown
|
|
10
|
+
* Resolve a Celo mainnet registry token by symbol, alias, or registry address.
|
|
11
|
+
* @throws If the token is not in the Celo registry
|
|
13
12
|
*/
|
|
14
13
|
resolveToken(token) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
address: known.address,
|
|
20
|
-
symbol: known.symbol,
|
|
21
|
-
decimals: known.decimals,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
if (isAddress(normalized)) {
|
|
25
|
-
return {
|
|
26
|
-
address: normalized,
|
|
27
|
-
symbol: normalized,
|
|
28
|
-
decimals: 18,
|
|
29
|
-
};
|
|
14
|
+
const known = findKnownToken(token.trim());
|
|
15
|
+
if (!known) {
|
|
16
|
+
throw new Error(`Unknown token "${token}" on Celo mainnet. Use ${KNOWN_TOKEN_SYMBOLS.join(", ")}.`);
|
|
30
17
|
}
|
|
31
|
-
|
|
18
|
+
return {
|
|
19
|
+
address: known.address,
|
|
20
|
+
symbol: known.symbol,
|
|
21
|
+
decimals: known.decimals,
|
|
22
|
+
};
|
|
32
23
|
}
|
|
33
|
-
/** Fetch
|
|
24
|
+
/** Fetch registry token metadata on Celo mainnet. */
|
|
34
25
|
async getTokenInfo(token) {
|
|
35
26
|
const resolved = this.resolveToken(token);
|
|
36
|
-
if (resolved.address === "native") {
|
|
37
|
-
return {
|
|
38
|
-
...resolved,
|
|
39
|
-
network: "mainnet",
|
|
40
|
-
name: "Celo",
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
const { public: client } = this.clientFactory.getClients();
|
|
44
|
-
const address = resolved.address;
|
|
45
|
-
const [name, symbol, decimals] = await Promise.all([
|
|
46
|
-
client.readContract({
|
|
47
|
-
address,
|
|
48
|
-
abi: erc20Abi,
|
|
49
|
-
functionName: "name",
|
|
50
|
-
}),
|
|
51
|
-
client.readContract({
|
|
52
|
-
address,
|
|
53
|
-
abi: erc20Abi,
|
|
54
|
-
functionName: "symbol",
|
|
55
|
-
}),
|
|
56
|
-
client.readContract({
|
|
57
|
-
address,
|
|
58
|
-
abi: erc20Abi,
|
|
59
|
-
functionName: "decimals",
|
|
60
|
-
}),
|
|
61
|
-
]);
|
|
62
27
|
return {
|
|
63
28
|
network: "mainnet",
|
|
64
|
-
address,
|
|
65
|
-
name,
|
|
66
|
-
symbol,
|
|
67
|
-
decimals:
|
|
29
|
+
address: resolved.address,
|
|
30
|
+
name: resolved.address === "native" ? "Celo" : resolved.symbol,
|
|
31
|
+
symbol: resolved.symbol,
|
|
32
|
+
decimals: resolved.decimals,
|
|
68
33
|
};
|
|
69
34
|
}
|
|
70
|
-
/** CELO and ERC-20 balances for
|
|
35
|
+
/** CELO and ERC-20 balances for registry tokens (defaults: CELO, USDm). */
|
|
71
36
|
async getBalances(address, tokens = ["CELO", "USDm"]) {
|
|
72
37
|
const { public: client } = this.clientFactory.getClients();
|
|
73
38
|
const balances = await Promise.all(tokens.map(async (tokenInput) => {
|
|
@@ -87,18 +52,11 @@ export class TokenService {
|
|
|
87
52
|
functionName: "balanceOf",
|
|
88
53
|
args: [address],
|
|
89
54
|
});
|
|
90
|
-
const decimals = token.symbol === token.address
|
|
91
|
-
? Number(await client.readContract({
|
|
92
|
-
address: token.address,
|
|
93
|
-
abi: erc20Abi,
|
|
94
|
-
functionName: "decimals",
|
|
95
|
-
}))
|
|
96
|
-
: token.decimals;
|
|
97
55
|
return {
|
|
98
56
|
token: token.symbol,
|
|
99
57
|
address: token.address,
|
|
100
58
|
raw: balance.toString(),
|
|
101
|
-
formatted: formatUnits(balance, decimals),
|
|
59
|
+
formatted: formatUnits(balance, token.decimals),
|
|
102
60
|
};
|
|
103
61
|
}));
|
|
104
62
|
return { network: "mainnet", address, balances };
|
|
@@ -154,51 +112,39 @@ export class TokenService {
|
|
|
154
112
|
stablecoins,
|
|
155
113
|
};
|
|
156
114
|
}
|
|
157
|
-
/**
|
|
158
|
-
async getTokenBalance(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
token = normalizeAddress(tokenAddress, "token address");
|
|
163
|
-
account = normalizeAddress(accountAddress, "account address");
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
throw error instanceof Error ? error : new Error(String(error));
|
|
167
|
-
}
|
|
115
|
+
/** Balance for a Celo mainnet registry token (symbol or registry address). */
|
|
116
|
+
async getTokenBalance(token, accountAddress) {
|
|
117
|
+
const resolved = this.resolveToken(token);
|
|
118
|
+
const account = normalizeAddress(accountAddress, "account address");
|
|
168
119
|
const { public: client } = this.clientFactory.getClients();
|
|
169
|
-
|
|
170
|
-
client.
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
functionName: "balanceOf",
|
|
189
|
-
args: [account],
|
|
190
|
-
}),
|
|
191
|
-
]);
|
|
192
|
-
const dec = Number(decimals);
|
|
120
|
+
if (resolved.address === "native") {
|
|
121
|
+
const balance = await client.getBalance({ address: account });
|
|
122
|
+
return {
|
|
123
|
+
network: "mainnet",
|
|
124
|
+
tokenAddress: "native",
|
|
125
|
+
accountAddress: account,
|
|
126
|
+
name: "Celo",
|
|
127
|
+
symbol: "CELO",
|
|
128
|
+
decimals: resolved.decimals,
|
|
129
|
+
raw: balance.toString(),
|
|
130
|
+
formatted: formatUnits(balance, resolved.decimals),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const balance = await client.readContract({
|
|
134
|
+
address: resolved.address,
|
|
135
|
+
abi: erc20Abi,
|
|
136
|
+
functionName: "balanceOf",
|
|
137
|
+
args: [account],
|
|
138
|
+
});
|
|
193
139
|
return {
|
|
194
140
|
network: "mainnet",
|
|
195
|
-
tokenAddress:
|
|
141
|
+
tokenAddress: resolved.address,
|
|
196
142
|
accountAddress: account,
|
|
197
|
-
name,
|
|
198
|
-
symbol,
|
|
199
|
-
decimals:
|
|
143
|
+
name: resolved.symbol,
|
|
144
|
+
symbol: resolved.symbol,
|
|
145
|
+
decimals: resolved.decimals,
|
|
200
146
|
raw: balance.toString(),
|
|
201
|
-
formatted: formatUnits(balance,
|
|
147
|
+
formatted: formatUnits(balance, resolved.decimals),
|
|
202
148
|
};
|
|
203
149
|
}
|
|
204
150
|
parseAmount(amount, decimals) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.service.js","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"token.service.js","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"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"}
|