@andrewkimjoseph/celina-sdk 0.2.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.
- package/build/services/contract.service.js +16 -20
- package/build/services/contract.service.js.map +1 -1
- package/build/services/nft.service.d.ts +1 -0
- package/build/services/nft.service.js +48 -39
- package/build/services/nft.service.js.map +1 -1
- package/build/services/token.service.js +6 -5
- package/build/services/token.service.js.map +1 -1
- package/build/services/transaction.service.js +18 -9
- package/build/services/transaction.service.js.map +1 -1
- package/build/utils/normalize-address.d.ts +2 -0
- package/build/utils/normalize-address.js +11 -0
- package/build/utils/normalize-address.js.map +1 -0
- package/package.json +5 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { decodeFunctionResult, encodeFunctionData,
|
|
1
|
+
import { decodeFunctionResult, encodeFunctionData, } from "viem";
|
|
2
|
+
import { normalizeAddress } from "../utils/normalize-address.js";
|
|
2
3
|
function findAbiFunction(abi, functionName) {
|
|
3
4
|
const fn = abi.find((item) => item.type === "function" && item.name === functionName);
|
|
4
5
|
if (!fn) {
|
|
@@ -12,24 +13,23 @@ export class ContractService {
|
|
|
12
13
|
this.clientFactory = clientFactory;
|
|
13
14
|
}
|
|
14
15
|
async callFunction(params) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const contractAddress = normalizeAddress(params.contractAddress, "contract address");
|
|
17
|
+
const fromAddress = params.fromAddress
|
|
18
|
+
? normalizeAddress(params.fromAddress, "from address")
|
|
19
|
+
: undefined;
|
|
18
20
|
const { public: client } = this.clientFactory.getClients();
|
|
19
21
|
const args = params.functionArgs ?? [];
|
|
20
22
|
try {
|
|
21
23
|
const result = await client.readContract({
|
|
22
|
-
address:
|
|
24
|
+
address: contractAddress,
|
|
23
25
|
abi: params.abi,
|
|
24
26
|
functionName: params.functionName,
|
|
25
27
|
args: args,
|
|
26
|
-
...(
|
|
27
|
-
? { account: params.fromAddress }
|
|
28
|
-
: {}),
|
|
28
|
+
...(fromAddress ? { account: fromAddress } : {}),
|
|
29
29
|
});
|
|
30
30
|
return {
|
|
31
31
|
network: "mainnet",
|
|
32
|
-
contractAddress
|
|
32
|
+
contractAddress,
|
|
33
33
|
functionName: params.functionName,
|
|
34
34
|
result,
|
|
35
35
|
success: true,
|
|
@@ -38,7 +38,7 @@ export class ContractService {
|
|
|
38
38
|
catch (error) {
|
|
39
39
|
return {
|
|
40
40
|
network: "mainnet",
|
|
41
|
-
contractAddress
|
|
41
|
+
contractAddress,
|
|
42
42
|
functionName: params.functionName,
|
|
43
43
|
result: null,
|
|
44
44
|
success: false,
|
|
@@ -47,12 +47,8 @@ export class ContractService {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
async estimateGas(params) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
if (!isAddress(params.fromAddress)) {
|
|
54
|
-
throw new Error(`Invalid from address: ${params.fromAddress}`);
|
|
55
|
-
}
|
|
50
|
+
const contractAddress = normalizeAddress(params.contractAddress, "contract address");
|
|
51
|
+
const fromAddress = normalizeAddress(params.fromAddress, "from address");
|
|
56
52
|
const { public: client } = this.clientFactory.getClients();
|
|
57
53
|
const args = params.functionArgs ?? [];
|
|
58
54
|
const value = params.value ? BigInt(params.value) : 0n;
|
|
@@ -63,8 +59,8 @@ export class ContractService {
|
|
|
63
59
|
args: args,
|
|
64
60
|
});
|
|
65
61
|
const gasEstimate = await client.estimateGas({
|
|
66
|
-
account:
|
|
67
|
-
to:
|
|
62
|
+
account: fromAddress,
|
|
63
|
+
to: contractAddress,
|
|
68
64
|
data,
|
|
69
65
|
value,
|
|
70
66
|
});
|
|
@@ -72,7 +68,7 @@ export class ContractService {
|
|
|
72
68
|
const totalCost = gasEstimate * gasPrice;
|
|
73
69
|
return {
|
|
74
70
|
network: "mainnet",
|
|
75
|
-
contractAddress
|
|
71
|
+
contractAddress,
|
|
76
72
|
functionName: params.functionName,
|
|
77
73
|
gasEstimate: gasEstimate.toString(),
|
|
78
74
|
gasPrice: gasPrice.toString(),
|
|
@@ -83,7 +79,7 @@ export class ContractService {
|
|
|
83
79
|
catch (error) {
|
|
84
80
|
return {
|
|
85
81
|
network: "mainnet",
|
|
86
|
-
contractAddress
|
|
82
|
+
contractAddress,
|
|
87
83
|
functionName: params.functionName,
|
|
88
84
|
gasEstimate: "0",
|
|
89
85
|
gasPrice: "0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.service.js","sourceRoot":"","sources":["../../src/services/contract.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,oBAAoB,EACpB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"contract.service.js","sourceRoot":"","sources":["../../src/services/contract.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ type NftStandard = "ERC721" | "ERC1155";
|
|
|
3
3
|
export declare class NftService {
|
|
4
4
|
private readonly clientFactory;
|
|
5
5
|
constructor(clientFactory: CeloClientFactory);
|
|
6
|
+
private assertIsContract;
|
|
6
7
|
private detectStandard;
|
|
7
8
|
getNftInfo(contractAddress: `0x${string}`, tokenId: string): Promise<{
|
|
8
9
|
network: "mainnet";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { isAddress } from "viem";
|
|
2
1
|
import { erc1155Abi, erc165Abi, erc721Abi, ERC1155_INTERFACE_ID, ERC721_INTERFACE_ID, } from "../abis/nft.js";
|
|
2
|
+
import { normalizeAddress } from "../utils/normalize-address.js";
|
|
3
3
|
function rewriteIpfsUri(uri) {
|
|
4
4
|
if (uri.startsWith("ipfs://")) {
|
|
5
5
|
return uri.replace("ipfs://", "https://ipfs.io/ipfs/");
|
|
@@ -25,6 +25,14 @@ export class NftService {
|
|
|
25
25
|
constructor(clientFactory) {
|
|
26
26
|
this.clientFactory = clientFactory;
|
|
27
27
|
}
|
|
28
|
+
async assertIsContract(address) {
|
|
29
|
+
const { public: client } = this.clientFactory.getClients();
|
|
30
|
+
const bytecode = await client.getBytecode({ address });
|
|
31
|
+
if (!bytecode || bytecode === "0x") {
|
|
32
|
+
throw new Error(`${address} is not an NFT contract on Celo mainnet (no contract bytecode). ` +
|
|
33
|
+
"Verify the address is a deployed ERC-721 or ERC-1155 collection.");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
28
36
|
async detectStandard(contractAddress) {
|
|
29
37
|
const { public: client } = this.clientFactory.getClients();
|
|
30
38
|
try {
|
|
@@ -53,14 +61,13 @@ export class NftService {
|
|
|
53
61
|
catch {
|
|
54
62
|
// fall through
|
|
55
63
|
}
|
|
56
|
-
|
|
64
|
+
throw new Error(`${contractAddress} does not implement ERC-721 or ERC-1155 (ERC-165 check failed).`);
|
|
57
65
|
}
|
|
58
66
|
async getNftInfo(contractAddress, tokenId) {
|
|
59
|
-
|
|
60
|
-
throw new Error(`Invalid contract address: ${contractAddress}`);
|
|
61
|
-
}
|
|
67
|
+
const contract = normalizeAddress(contractAddress, "contract address");
|
|
62
68
|
const { public: client } = this.clientFactory.getClients();
|
|
63
|
-
|
|
69
|
+
await this.assertIsContract(contract);
|
|
70
|
+
const standard = await this.detectStandard(contract);
|
|
64
71
|
const id = BigInt(tokenId);
|
|
65
72
|
let name;
|
|
66
73
|
let symbol;
|
|
@@ -71,21 +78,21 @@ export class NftService {
|
|
|
71
78
|
const [collectionName, collectionSymbol, supply] = await Promise.all([
|
|
72
79
|
client
|
|
73
80
|
.readContract({
|
|
74
|
-
address:
|
|
81
|
+
address: contract,
|
|
75
82
|
abi: erc721Abi,
|
|
76
83
|
functionName: "name",
|
|
77
84
|
})
|
|
78
85
|
.catch(() => undefined),
|
|
79
86
|
client
|
|
80
87
|
.readContract({
|
|
81
|
-
address:
|
|
88
|
+
address: contract,
|
|
82
89
|
abi: erc721Abi,
|
|
83
90
|
functionName: "symbol",
|
|
84
91
|
})
|
|
85
92
|
.catch(() => undefined),
|
|
86
93
|
client
|
|
87
94
|
.readContract({
|
|
88
|
-
address:
|
|
95
|
+
address: contract,
|
|
89
96
|
abi: erc721Abi,
|
|
90
97
|
functionName: "totalSupply",
|
|
91
98
|
})
|
|
@@ -96,7 +103,7 @@ export class NftService {
|
|
|
96
103
|
totalSupply = supply?.toString();
|
|
97
104
|
owner = await client
|
|
98
105
|
.readContract({
|
|
99
|
-
address:
|
|
106
|
+
address: contract,
|
|
100
107
|
abi: erc721Abi,
|
|
101
108
|
functionName: "ownerOf",
|
|
102
109
|
args: [id],
|
|
@@ -104,7 +111,7 @@ export class NftService {
|
|
|
104
111
|
.catch(() => null);
|
|
105
112
|
metadataUri = await client
|
|
106
113
|
.readContract({
|
|
107
|
-
address:
|
|
114
|
+
address: contract,
|
|
108
115
|
abi: erc721Abi,
|
|
109
116
|
functionName: "tokenURI",
|
|
110
117
|
args: [id],
|
|
@@ -114,7 +121,7 @@ export class NftService {
|
|
|
114
121
|
else {
|
|
115
122
|
metadataUri = await client
|
|
116
123
|
.readContract({
|
|
117
|
-
address:
|
|
124
|
+
address: contract,
|
|
118
125
|
abi: erc1155Abi,
|
|
119
126
|
functionName: "uri",
|
|
120
127
|
args: [id],
|
|
@@ -127,12 +134,12 @@ export class NftService {
|
|
|
127
134
|
: undefined;
|
|
128
135
|
return {
|
|
129
136
|
network: "mainnet",
|
|
130
|
-
contractAddress,
|
|
137
|
+
contractAddress: contract,
|
|
131
138
|
tokenId,
|
|
132
139
|
standard,
|
|
133
140
|
owner,
|
|
134
141
|
collection: {
|
|
135
|
-
name: name ?? `Unknown Collection (${
|
|
142
|
+
name: name ?? `Unknown Collection (${contract.slice(0, 8)}...)`,
|
|
136
143
|
symbol: symbol ?? "UNKNOWN",
|
|
137
144
|
totalSupply,
|
|
138
145
|
},
|
|
@@ -148,43 +155,45 @@ export class NftService {
|
|
|
148
155
|
};
|
|
149
156
|
}
|
|
150
157
|
async getNftBalance(contractAddress, ownerAddress, tokenId) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
if (!isAddress(ownerAddress)) {
|
|
155
|
-
throw new Error(`Invalid owner address: ${ownerAddress}`);
|
|
156
|
-
}
|
|
158
|
+
const contract = normalizeAddress(contractAddress, "contract address");
|
|
159
|
+
const owner = normalizeAddress(ownerAddress, "owner address");
|
|
157
160
|
const { public: client } = this.clientFactory.getClients();
|
|
158
|
-
|
|
161
|
+
await this.assertIsContract(contract);
|
|
162
|
+
const standard = await this.detectStandard(contract);
|
|
159
163
|
if (standard === "ERC721") {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
164
|
+
try {
|
|
165
|
+
const balance = await client.readContract({
|
|
166
|
+
address: contract,
|
|
167
|
+
abi: erc721Abi,
|
|
168
|
+
functionName: "balanceOf",
|
|
169
|
+
args: [owner],
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
network: "mainnet",
|
|
173
|
+
contractAddress: contract,
|
|
174
|
+
ownerAddress: owner,
|
|
175
|
+
tokenId: tokenId ?? null,
|
|
176
|
+
balance: balance.toString(),
|
|
177
|
+
standard,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
throw new Error(`Could not read ERC-721 balance for ${contract}: ${error instanceof Error ? error.message : String(error)}`);
|
|
182
|
+
}
|
|
174
183
|
}
|
|
175
184
|
if (!tokenId) {
|
|
176
185
|
throw new Error("Token ID is required for ERC1155 balance queries");
|
|
177
186
|
}
|
|
178
187
|
const balance = await client.readContract({
|
|
179
|
-
address:
|
|
188
|
+
address: contract,
|
|
180
189
|
abi: erc1155Abi,
|
|
181
190
|
functionName: "balanceOf",
|
|
182
|
-
args: [
|
|
191
|
+
args: [owner, BigInt(tokenId)],
|
|
183
192
|
});
|
|
184
193
|
return {
|
|
185
194
|
network: "mainnet",
|
|
186
|
-
contractAddress,
|
|
187
|
-
ownerAddress,
|
|
195
|
+
contractAddress: contract,
|
|
196
|
+
ownerAddress: owner,
|
|
188
197
|
tokenId,
|
|
189
198
|
balance: balance.toString(),
|
|
190
199
|
standard,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nft.service.js","sourceRoot":"","sources":["../../src/services/nft.service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"nft.service.js","sourceRoot":"","sources":["../../src/services/nft.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { erc20Abi, formatUnits,
|
|
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) {
|
|
@@ -148,11 +149,11 @@ export class TokenService {
|
|
|
148
149
|
let token;
|
|
149
150
|
let account;
|
|
150
151
|
try {
|
|
151
|
-
token =
|
|
152
|
-
account =
|
|
152
|
+
token = normalizeAddress(tokenAddress, "token address");
|
|
153
|
+
account = normalizeAddress(accountAddress, "account address");
|
|
153
154
|
}
|
|
154
|
-
catch {
|
|
155
|
-
throw
|
|
155
|
+
catch (error) {
|
|
156
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
156
157
|
}
|
|
157
158
|
const { public: client } = this.clientFactory.getClients();
|
|
158
159
|
const [name, symbol, decimals, balance] = await Promise.all([
|
|
@@ -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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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { concat, encodeFunctionData, erc20Abi, parseEther, parseGwei, } from "viem";
|
|
6
6
|
import { CELINA_DATA_SUFFIX } from "../config/celina-tag.js";
|
|
7
|
+
import { normalizeAddress } from "../utils/normalize-address.js";
|
|
7
8
|
import { serializePreparedFlow, } from "../types/prepared.js";
|
|
8
9
|
import { TokenService } from "./token.service.js";
|
|
9
10
|
function taggedCalldata(data) {
|
|
@@ -129,25 +130,33 @@ export class TransactionService {
|
|
|
129
130
|
}
|
|
130
131
|
/** Generic transaction gas estimate (not token-transfer specific). */
|
|
131
132
|
async estimateTransaction(params) {
|
|
133
|
+
const from = normalizeAddress(params.from, "from address");
|
|
134
|
+
const to = normalizeAddress(params.to, "to address");
|
|
132
135
|
const { public: client } = this.clientFactory.getClients();
|
|
133
136
|
const value = params.value ? BigInt(params.value) : 0n;
|
|
134
137
|
const data = params.data ?? "0x";
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
138
|
+
let gasLimit;
|
|
139
|
+
try {
|
|
140
|
+
gasLimit = await client.estimateGas({
|
|
141
|
+
account: from,
|
|
142
|
+
to,
|
|
139
143
|
value,
|
|
140
144
|
data,
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
149
|
+
throw new Error(`Transaction gas estimation failed: ${message}. ` +
|
|
150
|
+
"Ensure from/to addresses differ for empty transfers, or provide valid calldata.");
|
|
151
|
+
}
|
|
152
|
+
const feeData = await this.getGasFeeData();
|
|
144
153
|
const maxFee = BigInt(feeData.maxFeePerGas);
|
|
145
154
|
const estimatedCost = gasLimit * maxFee;
|
|
146
155
|
const estimatedCostCelo = Number(estimatedCost) / 1e18;
|
|
147
156
|
return {
|
|
148
157
|
network: "mainnet",
|
|
149
|
-
from
|
|
150
|
-
to
|
|
158
|
+
from,
|
|
159
|
+
to,
|
|
151
160
|
gasLimit: gasLimit.toString(),
|
|
152
161
|
gasPrice: feeData.gasPrice,
|
|
153
162
|
maxFeePerGas: feeData.maxFeePerGas,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.service.js","sourceRoot":"","sources":["../../src/services/transaction.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"transaction.service.js","sourceRoot":"","sources":["../../src/services/transaction.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getAddress } from "viem";
|
|
2
|
+
/** Normalize a hex address to EIP-55 checksum form. */
|
|
3
|
+
export function normalizeAddress(address, label = "address") {
|
|
4
|
+
try {
|
|
5
|
+
return getAddress(address);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
throw new Error(`Invalid ${label}: ${address}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=normalize-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-address.js","sourceRoot":"","sources":["../../src/utils/normalize-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,KAAK,GAAG,SAAS;IAEjB,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrewkimjoseph/celina-sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Celina SDK — Celo mainnet reads and unsigned transaction preparation for frontend apps.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "rm -rf build && tsc",
|
|
23
23
|
"dev": "tsc --watch",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:unit": "vitest run --config vitest.unit.config.ts",
|
|
24
26
|
"prepublishOnly": "npm run build",
|
|
25
27
|
"prepare": "npm run build"
|
|
26
28
|
},
|
|
@@ -58,6 +60,7 @@
|
|
|
58
60
|
},
|
|
59
61
|
"devDependencies": {
|
|
60
62
|
"@types/node": "^22.0.0",
|
|
61
|
-
"typescript": "^5.8.2"
|
|
63
|
+
"typescript": "^5.8.2",
|
|
64
|
+
"vitest": "^3.2.4"
|
|
62
65
|
}
|
|
63
66
|
}
|