@sun-protocol/sun-sdk-api 0.1.0-beta.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.
- package/README.md +28 -0
- package/dist/index.cjs +487 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +214 -0
- package/dist/index.d.ts +214 -0
- package/dist/index.js +444 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @sun-protocol/sun-sdk-api
|
|
2
|
+
|
|
3
|
+
HTTP clients for SUN.io, SunPump, Router, TronScan, price, and time services.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sun-protocol/sun-sdk-api
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Example
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { RouterApiClient } from '@sun-protocol/sun-sdk-api'
|
|
15
|
+
|
|
16
|
+
const routes = await new RouterApiClient().getRoutes(
|
|
17
|
+
'https://open.sun.io/apiv2/quote/swap',
|
|
18
|
+
{ fromToken, toToken, amountIn: '1000000', typeList: 'v2,v3,v4' },
|
|
19
|
+
)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Primary exports include `RouterApiClient`, `SunApiClient`, `SunPumpApiClient`, `TronScanClient`, `PriceClient`, `requestJson`, and API envelope helpers.
|
|
23
|
+
|
|
24
|
+
This package is HTTP-only. It does not import TronWeb, access wallets, sign transactions, or broadcast them. Clients accept an injectable `fetchImpl` and optional `jsonParser`; importing or constructing a client does not perform a request.
|
|
25
|
+
|
|
26
|
+
Requires Node.js 20 or a modern browser with `fetch`.
|
|
27
|
+
|
|
28
|
+
[Full API documentation](https://github.com/sun-protocol/sun-sdk/blob/main/docs/sdk/api/api.md)
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
PRICE_DEFAULT_BASE_URL: () => PRICE_DEFAULT_BASE_URL,
|
|
24
|
+
PriceClient: () => PriceClient,
|
|
25
|
+
RouterApiClient: () => RouterApiClient,
|
|
26
|
+
SUNPUMP_DEFAULT_BASE_URL: () => SUNPUMP_DEFAULT_BASE_URL,
|
|
27
|
+
SUN_OPEN_API_DEFAULT_BASE_URL: () => SUN_OPEN_API_DEFAULT_BASE_URL,
|
|
28
|
+
SunApiClient: () => SunApiClient,
|
|
29
|
+
SunHttpClient: () => SunHttpClient,
|
|
30
|
+
SunPumpApiClient: () => SunPumpApiClient,
|
|
31
|
+
TRONSCAN_DEFAULT_BASE_URL: () => TRONSCAN_DEFAULT_BASE_URL,
|
|
32
|
+
TronScanClient: () => TronScanClient,
|
|
33
|
+
buildRouterUniversalUrl: () => buildRouterUniversalUrl,
|
|
34
|
+
buildSunPumpUrl: () => buildSunPumpUrl,
|
|
35
|
+
defaultFetch: () => defaultFetch,
|
|
36
|
+
defaultJsonParser: () => defaultJsonParser,
|
|
37
|
+
getServerTime: () => getServerTime,
|
|
38
|
+
parseApiEnvelope: () => parseApiEnvelope,
|
|
39
|
+
requestJson: () => requestJson
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(index_exports);
|
|
42
|
+
|
|
43
|
+
// src/envelope.ts
|
|
44
|
+
var import_sun_sdk_core = require("@sun-protocol/sun-sdk-core");
|
|
45
|
+
function parseApiEnvelope(payload) {
|
|
46
|
+
if (payload.code === 0 || payload.code === 200) {
|
|
47
|
+
return payload.data;
|
|
48
|
+
}
|
|
49
|
+
const message = payload.msg ?? payload.message ?? `Sun API request failed with code ${payload.code}`;
|
|
50
|
+
throw new import_sun_sdk_core.SDKError("SDK_API_ERROR", message, { code: payload.code, payload });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/http.ts
|
|
54
|
+
var import_sun_sdk_core3 = require("@sun-protocol/sun-sdk-core");
|
|
55
|
+
|
|
56
|
+
// src/internal.ts
|
|
57
|
+
var import_sun_sdk_core2 = require("@sun-protocol/sun-sdk-core");
|
|
58
|
+
var defaultFetch = (input, init) => globalThis.fetch(input, init);
|
|
59
|
+
var defaultJsonParser = (text) => JSON.parse(text);
|
|
60
|
+
function excerpt(text) {
|
|
61
|
+
return text.length > 500 ? `${text.slice(0, 500)}\u2026` : text;
|
|
62
|
+
}
|
|
63
|
+
function extractApiMessage(text, jsonParser) {
|
|
64
|
+
try {
|
|
65
|
+
const parsed = jsonParser(text);
|
|
66
|
+
if (typeof parsed?.msg === "string") return parsed.msg;
|
|
67
|
+
if (typeof parsed?.message === "string") return parsed.message;
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
70
|
+
return void 0;
|
|
71
|
+
}
|
|
72
|
+
function pathOf(url) {
|
|
73
|
+
try {
|
|
74
|
+
return new URL(url).pathname;
|
|
75
|
+
} catch {
|
|
76
|
+
return url;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function requestJson(url, opts) {
|
|
80
|
+
const init = opts.init ?? { method: "GET", headers: { Accept: "application/json" } };
|
|
81
|
+
const jsonParser = opts.jsonParser ?? defaultJsonParser;
|
|
82
|
+
const res = await opts.fetchImpl(url, init);
|
|
83
|
+
const text = await res.text();
|
|
84
|
+
const path = pathOf(url);
|
|
85
|
+
if (!res.ok) {
|
|
86
|
+
throw new import_sun_sdk_core2.SDKError("SDK_API_ERROR", `HTTP ${res.status} from ${opts.service} (${path})`, {
|
|
87
|
+
service: opts.service,
|
|
88
|
+
path,
|
|
89
|
+
status: res.status,
|
|
90
|
+
body: excerpt(text),
|
|
91
|
+
apiMessage: extractApiMessage(text, jsonParser)
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (!text) return void 0;
|
|
95
|
+
try {
|
|
96
|
+
return jsonParser(text);
|
|
97
|
+
} catch {
|
|
98
|
+
throw new import_sun_sdk_core2.SDKError("SDK_API_ERROR", `${opts.service} returned non-JSON body (${path})`, {
|
|
99
|
+
service: opts.service,
|
|
100
|
+
path,
|
|
101
|
+
status: res.status,
|
|
102
|
+
body: excerpt(text)
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/http.ts
|
|
108
|
+
var SunHttpClient = class {
|
|
109
|
+
fetchImpl;
|
|
110
|
+
jsonParser;
|
|
111
|
+
constructor(options = {}) {
|
|
112
|
+
this.fetchImpl = options.fetchImpl ?? defaultFetch;
|
|
113
|
+
this.jsonParser = options.jsonParser ?? defaultJsonParser;
|
|
114
|
+
}
|
|
115
|
+
async getEnvelope(url) {
|
|
116
|
+
const response = await this.fetchImpl(url, {
|
|
117
|
+
method: "GET",
|
|
118
|
+
headers: { Accept: "application/json" }
|
|
119
|
+
});
|
|
120
|
+
const text = await response.text();
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new import_sun_sdk_core3.SDKError("SDK_API_ERROR", `HTTP ${response.status} from Sun API`, { url, body: text });
|
|
123
|
+
}
|
|
124
|
+
let payload;
|
|
125
|
+
try {
|
|
126
|
+
payload = this.jsonParser(text);
|
|
127
|
+
} catch {
|
|
128
|
+
throw new import_sun_sdk_core3.SDKError("SDK_API_ERROR", "Sun API returned non-JSON response", { url, body: text });
|
|
129
|
+
}
|
|
130
|
+
return parseApiEnvelope(payload);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// src/router-universal.ts
|
|
135
|
+
function buildRouterUniversalUrl(baseUrl, params) {
|
|
136
|
+
const url = new URL(baseUrl);
|
|
137
|
+
const basePath = url.pathname.replace(/\/+$/, "");
|
|
138
|
+
url.pathname = `${basePath || "/swap"}/routerUniversal`;
|
|
139
|
+
url.search = "";
|
|
140
|
+
url.hash = "";
|
|
141
|
+
url.searchParams.append("fromToken", params.fromToken);
|
|
142
|
+
url.searchParams.append("toToken", params.toToken);
|
|
143
|
+
url.searchParams.append("amountIn", params.amountIn);
|
|
144
|
+
url.searchParams.append("typeList", params.typeList ?? "");
|
|
145
|
+
url.searchParams.append("includeUnverifiedV4Hook", String(params.includeUnverifiedV4Hook ?? true));
|
|
146
|
+
return url.toString();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// src/price.ts
|
|
150
|
+
var PRICE_DEFAULT_BASE_URL = "https://c.tronlink.org";
|
|
151
|
+
var PriceClient = class {
|
|
152
|
+
baseUrl;
|
|
153
|
+
fetchImpl;
|
|
154
|
+
jsonParser;
|
|
155
|
+
constructor(opts = {}) {
|
|
156
|
+
this.baseUrl = (opts.baseUrl ?? PRICE_DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
157
|
+
this.fetchImpl = opts.fetchImpl ?? defaultFetch;
|
|
158
|
+
this.jsonParser = opts.jsonParser ?? defaultJsonParser;
|
|
159
|
+
}
|
|
160
|
+
getPrice(symbols, convert = "USD") {
|
|
161
|
+
const url = new URL("/v1/cryptocurrency/getprice", this.baseUrl);
|
|
162
|
+
url.searchParams.append("symbol", symbols.join(","));
|
|
163
|
+
url.searchParams.append("convert", convert);
|
|
164
|
+
return requestJson(url.toString(), { service: "Price", fetchImpl: this.fetchImpl, jsonParser: this.jsonParser });
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
var RouterApiClient = class {
|
|
168
|
+
fetchImpl;
|
|
169
|
+
jsonParser;
|
|
170
|
+
constructor(opts = {}) {
|
|
171
|
+
this.fetchImpl = opts.fetchImpl ?? defaultFetch;
|
|
172
|
+
this.jsonParser = opts.jsonParser ?? defaultJsonParser;
|
|
173
|
+
}
|
|
174
|
+
getRoutes(baseUrl, params) {
|
|
175
|
+
return requestJson(buildRouterUniversalUrl(baseUrl, params), {
|
|
176
|
+
service: "Router",
|
|
177
|
+
fetchImpl: this.fetchImpl,
|
|
178
|
+
jsonParser: this.jsonParser
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// src/sun-api.ts
|
|
184
|
+
var SUN_OPEN_API_DEFAULT_BASE_URL = "https://open.sun.io";
|
|
185
|
+
var SunApiClient = class {
|
|
186
|
+
baseUrl;
|
|
187
|
+
fetchImpl;
|
|
188
|
+
jsonParser;
|
|
189
|
+
constructor(opts = {}) {
|
|
190
|
+
this.baseUrl = (opts.baseUrl ?? SUN_OPEN_API_DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
191
|
+
this.fetchImpl = opts.fetchImpl ?? defaultFetch;
|
|
192
|
+
this.jsonParser = opts.jsonParser ?? defaultJsonParser;
|
|
193
|
+
}
|
|
194
|
+
get(path, params) {
|
|
195
|
+
const url = new URL(path, this.baseUrl);
|
|
196
|
+
if (params) for (const [k, v] of Object.entries(params)) {
|
|
197
|
+
if (v !== void 0 && v !== null && v !== "") url.searchParams.append(k, String(v));
|
|
198
|
+
}
|
|
199
|
+
return requestJson(url.toString(), {
|
|
200
|
+
service: "SunAPI",
|
|
201
|
+
fetchImpl: this.fetchImpl,
|
|
202
|
+
jsonParser: this.jsonParser
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Transactions / Tokens
|
|
206
|
+
scanTransactions(params = {}) {
|
|
207
|
+
return this.get("/apiv2/transactions/scan", params);
|
|
208
|
+
}
|
|
209
|
+
getTokens(params = {}) {
|
|
210
|
+
return this.get("/apiv2/tokens", params);
|
|
211
|
+
}
|
|
212
|
+
searchTokens(params = {}) {
|
|
213
|
+
return this.get("/apiv2/tokens/search", params);
|
|
214
|
+
}
|
|
215
|
+
getPrice(params = {}) {
|
|
216
|
+
return this.get("/apiv2/price", params);
|
|
217
|
+
}
|
|
218
|
+
// Protocol
|
|
219
|
+
getProtocol(params = {}) {
|
|
220
|
+
return this.get("/apiv2/protocols", params);
|
|
221
|
+
}
|
|
222
|
+
getVolHistory(params = {}) {
|
|
223
|
+
return this.get("/apiv2/protocols/history/vol", params);
|
|
224
|
+
}
|
|
225
|
+
getLiqHistory(params = {}) {
|
|
226
|
+
return this.get("/apiv2/protocols/history/liq", params);
|
|
227
|
+
}
|
|
228
|
+
getUsersCountHistory(params = {}) {
|
|
229
|
+
return this.get("/apiv2/protocols/history/usersCount", params);
|
|
230
|
+
}
|
|
231
|
+
getTransactionsHistory(params = {}) {
|
|
232
|
+
return this.get("/apiv2/protocols/history/transactions", params);
|
|
233
|
+
}
|
|
234
|
+
getPoolsCountHistory(params = {}) {
|
|
235
|
+
return this.get("/apiv2/protocols/history/poolsCount", params);
|
|
236
|
+
}
|
|
237
|
+
// Positions
|
|
238
|
+
getUserPositions(params = {}) {
|
|
239
|
+
return this.get("/apiv2/positions/user", params);
|
|
240
|
+
}
|
|
241
|
+
getPoolUserPositionTick(params) {
|
|
242
|
+
return this.get("/apiv2/positions/tick", params);
|
|
243
|
+
}
|
|
244
|
+
// Pools
|
|
245
|
+
getPools(params = {}) {
|
|
246
|
+
return this.get("/apiv2/pools", params);
|
|
247
|
+
}
|
|
248
|
+
getTopApyPoolList(params = {}) {
|
|
249
|
+
return this.get("/apiv2/pools/top_apy_list", params);
|
|
250
|
+
}
|
|
251
|
+
searchPools(params = {}) {
|
|
252
|
+
return this.get("/apiv2/pools/search", params);
|
|
253
|
+
}
|
|
254
|
+
searchCountPools(params = {}) {
|
|
255
|
+
return this.get("/apiv2/pools/search/count", params);
|
|
256
|
+
}
|
|
257
|
+
getPoolHooks() {
|
|
258
|
+
return this.get("/apiv2/pools/hooks");
|
|
259
|
+
}
|
|
260
|
+
getPoolVolHistory(params) {
|
|
261
|
+
return this.get("/apiv2/pools/history/vol", params);
|
|
262
|
+
}
|
|
263
|
+
getPoolLiqHistory(params) {
|
|
264
|
+
return this.get("/apiv2/pools/history/liq", params);
|
|
265
|
+
}
|
|
266
|
+
// Pairs / Farms
|
|
267
|
+
getPairs(params = {}) {
|
|
268
|
+
return this.get("/apiv2/pairs", params);
|
|
269
|
+
}
|
|
270
|
+
getFarms(params = {}) {
|
|
271
|
+
return this.get("/apiv2/farms", params);
|
|
272
|
+
}
|
|
273
|
+
getFarmTransactions(params = {}) {
|
|
274
|
+
return this.get("/apiv2/farms/transactions", params);
|
|
275
|
+
}
|
|
276
|
+
getFarmPositions(params = {}) {
|
|
277
|
+
return this.get("/apiv2/farms/positions/user", params);
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
// src/sunpump.ts
|
|
282
|
+
var import_sun_sdk_chains = require("@sun-protocol/sun-sdk-chains");
|
|
283
|
+
var import_sun_sdk_core4 = require("@sun-protocol/sun-sdk-core");
|
|
284
|
+
var SUNPUMP_DEFAULT_BASE_URL = (0, import_sun_sdk_chains.getNetworkEndpoints)("mainnet").sunPump;
|
|
285
|
+
function buildSunPumpUrl(baseUrl, path, query = {}) {
|
|
286
|
+
const normalizedBaseUrl = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
287
|
+
const normalizedPath = path.replace(/^\/+/, "");
|
|
288
|
+
const url = new URL(normalizedPath, normalizedBaseUrl);
|
|
289
|
+
for (const [key, value] of Object.entries(query)) {
|
|
290
|
+
if (value !== void 0) url.searchParams.set(key, String(value));
|
|
291
|
+
}
|
|
292
|
+
return url.toString();
|
|
293
|
+
}
|
|
294
|
+
function queryString(query) {
|
|
295
|
+
if (!query) return "";
|
|
296
|
+
const usp = new URLSearchParams();
|
|
297
|
+
for (const [key, value] of Object.entries(query)) {
|
|
298
|
+
if (value === void 0 || value === null || value === "") continue;
|
|
299
|
+
usp.append(key, String(value));
|
|
300
|
+
}
|
|
301
|
+
const s = usp.toString();
|
|
302
|
+
return s ? `?${s}` : "";
|
|
303
|
+
}
|
|
304
|
+
var SunPumpApiClient = class {
|
|
305
|
+
baseUrl;
|
|
306
|
+
fetchImpl;
|
|
307
|
+
jsonParser;
|
|
308
|
+
constructor(opts = {}) {
|
|
309
|
+
const baseUrl = opts.baseUrl ?? (opts.network ? (0, import_sun_sdk_chains.getNetworkEndpoints)(opts.network).sunPump : SUNPUMP_DEFAULT_BASE_URL);
|
|
310
|
+
if (!baseUrl?.trim()) {
|
|
311
|
+
if (opts.baseUrl !== void 0) {
|
|
312
|
+
throw new import_sun_sdk_core4.SDKError("SDK_INVALID_ARGUMENT", "SunPump API base URL must not be empty");
|
|
313
|
+
}
|
|
314
|
+
throw new import_sun_sdk_core4.SDKError("SDK_UNSUPPORTED_NETWORK", "SunPump API is unavailable on this network", {
|
|
315
|
+
network: opts.network
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
319
|
+
this.fetchImpl = opts.fetchImpl ?? defaultFetch;
|
|
320
|
+
this.jsonParser = opts.jsonParser ?? defaultJsonParser;
|
|
321
|
+
}
|
|
322
|
+
request(path, query) {
|
|
323
|
+
return requestJson(`${this.baseUrl}${path}${queryString(query)}`, {
|
|
324
|
+
service: "SunPump",
|
|
325
|
+
fetchImpl: this.fetchImpl,
|
|
326
|
+
jsonParser: this.jsonParser,
|
|
327
|
+
init: { method: "GET", headers: { Accept: "application/json" } }
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
post(path, body) {
|
|
331
|
+
return requestJson(`${this.baseUrl}${path}`, {
|
|
332
|
+
service: "SunPump",
|
|
333
|
+
fetchImpl: this.fetchImpl,
|
|
334
|
+
jsonParser: this.jsonParser,
|
|
335
|
+
init: { method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json" }, body: JSON.stringify(body) }
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
// Token info
|
|
339
|
+
listTokens(query = {}) {
|
|
340
|
+
return this.request("/token", query);
|
|
341
|
+
}
|
|
342
|
+
getToken(contractAddress) {
|
|
343
|
+
return this.request(`/token/${encodeURIComponent(contractAddress)}`);
|
|
344
|
+
}
|
|
345
|
+
searchTokens(query = {}) {
|
|
346
|
+
return this.request("/token/search", query);
|
|
347
|
+
}
|
|
348
|
+
searchTokensV2(query = {}) {
|
|
349
|
+
return this.request("/token/searchV2", query);
|
|
350
|
+
}
|
|
351
|
+
tokensByOwner(query) {
|
|
352
|
+
return this.request("/token/search/by_owner", query);
|
|
353
|
+
}
|
|
354
|
+
tokenHolders(query) {
|
|
355
|
+
return this.request("/token/holders", query);
|
|
356
|
+
}
|
|
357
|
+
tokenHoldersV2(query) {
|
|
358
|
+
return this.request("/token/holdersV2", query);
|
|
359
|
+
}
|
|
360
|
+
userFavors(query) {
|
|
361
|
+
return this.request("/token/getUserFavors", query);
|
|
362
|
+
}
|
|
363
|
+
ranking(query) {
|
|
364
|
+
return this.request("/token/getRanking", query);
|
|
365
|
+
}
|
|
366
|
+
kingOfHill() {
|
|
367
|
+
return this.request("/token/getKingOfHill");
|
|
368
|
+
}
|
|
369
|
+
pumpTokenList() {
|
|
370
|
+
return this.request("/token/SunPumpTokenList.json");
|
|
371
|
+
}
|
|
372
|
+
// Transactions
|
|
373
|
+
tokenTransactions(contractAddress, query = {}) {
|
|
374
|
+
return this.request(`/transactions/token/${encodeURIComponent(contractAddress)}`, query);
|
|
375
|
+
}
|
|
376
|
+
userTransactions(ownerAddress, query = {}) {
|
|
377
|
+
return this.request(`/transactions/holder/${encodeURIComponent(ownerAddress)}`, query);
|
|
378
|
+
}
|
|
379
|
+
// Portfolio
|
|
380
|
+
portfolio(address, query = {}) {
|
|
381
|
+
return this.request(`/holders/${encodeURIComponent(address)}/tokens`, query);
|
|
382
|
+
}
|
|
383
|
+
// AI agent launch
|
|
384
|
+
agentTokenLaunch(params) {
|
|
385
|
+
return this.post("/ai/agentTokenLaunch", params);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
// src/time.ts
|
|
390
|
+
var import_sun_sdk_core5 = require("@sun-protocol/sun-sdk-core");
|
|
391
|
+
async function getServerTime(url, fetchImpl = defaultFetch, jsonParser = defaultJsonParser) {
|
|
392
|
+
const controller = new AbortController();
|
|
393
|
+
let timer;
|
|
394
|
+
try {
|
|
395
|
+
const payload = await Promise.race([
|
|
396
|
+
requestJson(url, {
|
|
397
|
+
service: "Time",
|
|
398
|
+
fetchImpl,
|
|
399
|
+
jsonParser,
|
|
400
|
+
init: {
|
|
401
|
+
method: "GET",
|
|
402
|
+
headers: { Accept: "application/json" },
|
|
403
|
+
cache: "no-store",
|
|
404
|
+
signal: controller.signal
|
|
405
|
+
}
|
|
406
|
+
}),
|
|
407
|
+
new Promise((_, reject) => {
|
|
408
|
+
timer = setTimeout(() => {
|
|
409
|
+
reject(new import_sun_sdk_core5.SDKError("SDK_API_ERROR", "Time service request timed out"));
|
|
410
|
+
controller.abort();
|
|
411
|
+
}, 3e3);
|
|
412
|
+
})
|
|
413
|
+
]);
|
|
414
|
+
if (typeof payload !== "object" || payload === null || !("code" in payload) || payload.code !== 0 && payload.code !== "0" || !("data" in payload) || typeof payload.data !== "object" || payload.data === null || !("serverTimeStamp" in payload.data)) {
|
|
415
|
+
throw new import_sun_sdk_core5.SDKError("SDK_API_ERROR", "Time service returned an invalid response");
|
|
416
|
+
}
|
|
417
|
+
const value = payload.data.serverTimeStamp;
|
|
418
|
+
const timestamp = typeof value === "number" || typeof value === "string" && /^\d+$/.test(value) ? Number(value) : NaN;
|
|
419
|
+
if (!Number.isSafeInteger(timestamp) || timestamp < 9466848e5 || timestamp >= 41024448e5) {
|
|
420
|
+
throw new import_sun_sdk_core5.SDKError("SDK_API_ERROR", "Time service returned an invalid millisecond timestamp");
|
|
421
|
+
}
|
|
422
|
+
return timestamp;
|
|
423
|
+
} finally {
|
|
424
|
+
clearTimeout(timer);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// src/tronscan.ts
|
|
429
|
+
var import_sun_sdk_chains2 = require("@sun-protocol/sun-sdk-chains");
|
|
430
|
+
var TRONSCAN_DEFAULT_BASE_URL = (0, import_sun_sdk_chains2.getNetworkEndpoints)("mainnet").tronScan;
|
|
431
|
+
var TronScanClient = class {
|
|
432
|
+
baseUrl;
|
|
433
|
+
fetchImpl;
|
|
434
|
+
jsonParser;
|
|
435
|
+
apiKey;
|
|
436
|
+
constructor(opts = {}) {
|
|
437
|
+
const chainBaseUrl = opts.network ? (0, import_sun_sdk_chains2.getNetworkEndpoints)(opts.network).tronScan : void 0;
|
|
438
|
+
this.baseUrl = (opts.baseUrl ?? chainBaseUrl ?? TRONSCAN_DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
439
|
+
this.fetchImpl = opts.fetchImpl ?? defaultFetch;
|
|
440
|
+
this.jsonParser = opts.jsonParser ?? defaultJsonParser;
|
|
441
|
+
this.apiKey = opts.apiKey;
|
|
442
|
+
}
|
|
443
|
+
get(path, params) {
|
|
444
|
+
const url = new URL(path, this.baseUrl);
|
|
445
|
+
if (params) for (const [k, v] of Object.entries(params)) {
|
|
446
|
+
if (v !== void 0 && v !== null && v !== "") url.searchParams.append(k, String(v));
|
|
447
|
+
}
|
|
448
|
+
const headers = { Accept: "application/json" };
|
|
449
|
+
if (this.apiKey) headers["TRON-PRO-API-KEY"] = this.apiKey;
|
|
450
|
+
return requestJson(url.toString(), {
|
|
451
|
+
service: "TronScan",
|
|
452
|
+
fetchImpl: this.fetchImpl,
|
|
453
|
+
jsonParser: this.jsonParser,
|
|
454
|
+
init: { method: "GET", headers }
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
getTokenTrc20(params) {
|
|
458
|
+
return this.get("/api/token_trc20", params);
|
|
459
|
+
}
|
|
460
|
+
getTokenHolderBalance(params) {
|
|
461
|
+
return this.get("/api/token_trc20/holders", params);
|
|
462
|
+
}
|
|
463
|
+
getAccountTokens(params) {
|
|
464
|
+
return this.get("/api/account/tokens", params);
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
468
|
+
0 && (module.exports = {
|
|
469
|
+
PRICE_DEFAULT_BASE_URL,
|
|
470
|
+
PriceClient,
|
|
471
|
+
RouterApiClient,
|
|
472
|
+
SUNPUMP_DEFAULT_BASE_URL,
|
|
473
|
+
SUN_OPEN_API_DEFAULT_BASE_URL,
|
|
474
|
+
SunApiClient,
|
|
475
|
+
SunHttpClient,
|
|
476
|
+
SunPumpApiClient,
|
|
477
|
+
TRONSCAN_DEFAULT_BASE_URL,
|
|
478
|
+
TronScanClient,
|
|
479
|
+
buildRouterUniversalUrl,
|
|
480
|
+
buildSunPumpUrl,
|
|
481
|
+
defaultFetch,
|
|
482
|
+
defaultJsonParser,
|
|
483
|
+
getServerTime,
|
|
484
|
+
parseApiEnvelope,
|
|
485
|
+
requestJson
|
|
486
|
+
});
|
|
487
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/envelope.ts","../src/http.ts","../src/internal.ts","../src/router-universal.ts","../src/price.ts","../src/sun-api.ts","../src/sunpump.ts","../src/time.ts","../src/tronscan.ts"],"sourcesContent":["export * from './envelope.js'\nexport * from './http.js'\nexport * from './internal.js'\nexport * from './price.js'\nexport * from './router-universal.js'\nexport * from './sun-api.js'\nexport * from './sunpump.js'\nexport * from './time.js'\nexport * from './tronscan.js'\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\n\nexport interface SunApiEnvelope<T> {\n readonly code: number\n readonly msg?: string\n readonly message?: string\n readonly data: T\n readonly pagination?: { pageNum: number; pageSize: number; total: number }\n}\n\nexport function parseApiEnvelope<T>(payload: SunApiEnvelope<T>): T {\n if (payload.code === 0 || payload.code === 200) {\n return payload.data\n }\n\n const message = payload.msg ?? payload.message ?? `Sun API request failed with code ${payload.code}`\n throw new SDKError('SDK_API_ERROR', message, { code: payload.code, payload })\n}\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\nimport { parseApiEnvelope, type SunApiEnvelope } from './envelope.js'\nimport { defaultFetch, defaultJsonParser, type FetchLike, type JsonParser } from './internal.js'\n\nexport interface HttpClientOptions {\n readonly fetchImpl?: FetchLike\n readonly jsonParser?: JsonParser\n}\n\nexport class SunHttpClient {\n private readonly fetchImpl: FetchLike\n private readonly jsonParser: JsonParser\n\n constructor(options: HttpClientOptions = {}) {\n this.fetchImpl = options.fetchImpl ?? defaultFetch\n this.jsonParser = options.jsonParser ?? defaultJsonParser\n }\n\n async getEnvelope<T>(url: string): Promise<T> {\n const response = await this.fetchImpl(url, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n })\n const text = await response.text()\n\n if (!response.ok) {\n throw new SDKError('SDK_API_ERROR', `HTTP ${response.status} from Sun API`, { url, body: text })\n }\n\n let payload: SunApiEnvelope<T>\n try {\n payload = this.jsonParser(text) as SunApiEnvelope<T>\n } catch {\n throw new SDKError('SDK_API_ERROR', 'Sun API returned non-JSON response', { url, body: text })\n }\n\n return parseApiEnvelope(payload)\n }\n}\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>\nexport type JsonParser = (text: string) => unknown\n\nexport const defaultFetch: FetchLike = (input, init) => globalThis.fetch(input, init)\nexport const defaultJsonParser: JsonParser = (text) => JSON.parse(text)\n\nexport interface RequestJsonOptions {\n readonly service: string\n readonly fetchImpl: FetchLike\n readonly init?: RequestInit\n readonly jsonParser?: JsonParser\n}\n\nfunction excerpt(text: string): string {\n return text.length > 500 ? `${text.slice(0, 500)}…` : text\n}\n\nfunction extractApiMessage(text: string, jsonParser: JsonParser): string | undefined {\n try {\n const parsed = jsonParser(text) as { msg?: unknown; message?: unknown }\n if (typeof parsed?.msg === 'string') return parsed.msg\n if (typeof parsed?.message === 'string') return parsed.message\n } catch { /* not JSON */ }\n return undefined\n}\n\nfunction pathOf(url: string): string {\n try { return new URL(url).pathname } catch { return url }\n}\n\nexport async function requestJson<T = unknown>(url: string, opts: RequestJsonOptions): Promise<T> {\n const init = opts.init ?? { method: 'GET', headers: { Accept: 'application/json' } }\n const jsonParser = opts.jsonParser ?? defaultJsonParser\n const res = await opts.fetchImpl(url, init)\n const text = await res.text()\n const path = pathOf(url)\n if (!res.ok) {\n throw new SDKError('SDK_API_ERROR', `HTTP ${res.status} from ${opts.service} (${path})`, {\n service: opts.service, path, status: res.status, body: excerpt(text), apiMessage: extractApiMessage(text, jsonParser),\n })\n }\n if (!text) return undefined as unknown as T\n try {\n return jsonParser(text) as T\n } catch {\n throw new SDKError('SDK_API_ERROR', `${opts.service} returned non-JSON body (${path})`, {\n service: opts.service, path, status: res.status, body: excerpt(text),\n })\n }\n}\n","export interface RouterUniversalParams {\n readonly fromToken: string\n readonly toToken: string\n readonly amountIn: string\n readonly typeList?: string\n readonly includeUnverifiedV4Hook?: boolean\n}\n\nexport interface RouterRouteAmountFields {\n /** Decimal display value returned by Router. */\n readonly amountIn: string\n /** Integer input amount in the input token's base units. */\n readonly amountInRaw: string\n /** Decimal display value returned by Router. */\n readonly amountOut: string\n /** Integer output amount in the output token's base units. */\n readonly amountOutRaw: string\n /** Decimal display value after Router's minimum-output calculation. */\n readonly amountOutMinimum?: string\n /** Integer minimum output in the output token's base units. */\n readonly amountOutMinimumRaw?: string\n}\n\nexport interface RouterRoute extends RouterRouteAmountFields {\n readonly [key: string]: unknown\n}\n\nexport interface RouterUniversalResponse {\n readonly code: number\n readonly message?: string\n readonly data: RouterRoute[]\n}\n\nexport function buildRouterUniversalUrl(baseUrl: string, params: RouterUniversalParams): string {\n const url = new URL(baseUrl)\n const basePath = url.pathname.replace(/\\/+$/, '')\n url.pathname = `${basePath || '/swap'}/routerUniversal`\n url.search = ''\n url.hash = ''\n url.searchParams.append('fromToken', params.fromToken)\n url.searchParams.append('toToken', params.toToken)\n url.searchParams.append('amountIn', params.amountIn)\n url.searchParams.append('typeList', params.typeList ?? '')\n url.searchParams.append('includeUnverifiedV4Hook', String(params.includeUnverifiedV4Hook ?? true))\n return url.toString()\n}\n","import { defaultFetch, defaultJsonParser, requestJson, type FetchLike, type JsonParser } from './internal.js'\nimport { buildRouterUniversalUrl, type RouterUniversalParams, type RouterUniversalResponse } from './router-universal.js'\n\nexport const PRICE_DEFAULT_BASE_URL = 'https://c.tronlink.org'\nexport interface PriceOptions { baseUrl?: string; fetchImpl?: FetchLike; jsonParser?: JsonParser }\nexport class PriceClient {\n private readonly baseUrl: string\n private readonly fetchImpl: FetchLike\n private readonly jsonParser: JsonParser\n constructor(opts: PriceOptions = {}) {\n this.baseUrl = (opts.baseUrl ?? PRICE_DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.fetchImpl = opts.fetchImpl ?? defaultFetch\n this.jsonParser = opts.jsonParser ?? defaultJsonParser\n }\n getPrice<T = unknown>(symbols: string[], convert = 'USD'): Promise<T> {\n const url = new URL('/v1/cryptocurrency/getprice', this.baseUrl)\n url.searchParams.append('symbol', symbols.join(','))\n url.searchParams.append('convert', convert)\n return requestJson<T>(url.toString(), { service: 'Price', fetchImpl: this.fetchImpl, jsonParser: this.jsonParser })\n }\n}\n\nexport interface RouterApiOptions { fetchImpl?: FetchLike; jsonParser?: JsonParser }\nexport class RouterApiClient {\n private readonly fetchImpl: FetchLike\n private readonly jsonParser: JsonParser\n constructor(opts: RouterApiOptions = {}) {\n this.fetchImpl = opts.fetchImpl ?? defaultFetch\n this.jsonParser = opts.jsonParser ?? defaultJsonParser\n }\n getRoutes(baseUrl: string, params: RouterUniversalParams): Promise<RouterUniversalResponse> {\n return requestJson<RouterUniversalResponse>(buildRouterUniversalUrl(baseUrl, params), {\n service: 'Router', fetchImpl: this.fetchImpl, jsonParser: this.jsonParser,\n })\n }\n}\n","import { defaultFetch, defaultJsonParser, requestJson, type FetchLike, type JsonParser } from './internal.js'\n\nexport const SUN_OPEN_API_DEFAULT_BASE_URL = 'https://open.sun.io'\nexport interface ApiResponse<T = unknown> { code: number; message?: string; msg?: string; data: T }\nexport interface SunApiOptions { baseUrl?: string; fetchImpl?: FetchLike; jsonParser?: JsonParser }\n\nexport class SunApiClient {\n private readonly baseUrl: string\n private readonly fetchImpl: FetchLike\n private readonly jsonParser: JsonParser\n constructor(opts: SunApiOptions = {}) {\n this.baseUrl = (opts.baseUrl ?? SUN_OPEN_API_DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.fetchImpl = opts.fetchImpl ?? defaultFetch\n this.jsonParser = opts.jsonParser ?? defaultJsonParser\n }\n private get<T = unknown>(path: string, params?: Record<string, unknown>): Promise<ApiResponse<T>> {\n const url = new URL(path, this.baseUrl)\n if (params) for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== null && v !== '') url.searchParams.append(k, String(v))\n }\n return requestJson<ApiResponse<T>>(url.toString(), {\n service: 'SunAPI', fetchImpl: this.fetchImpl, jsonParser: this.jsonParser,\n })\n }\n // Transactions / Tokens\n scanTransactions(params: Record<string, unknown> = {}) { return this.get('/apiv2/transactions/scan', params) }\n getTokens(params: Record<string, unknown> = {}) { return this.get('/apiv2/tokens', params) }\n searchTokens(params: Record<string, unknown> = {}) { return this.get('/apiv2/tokens/search', params) }\n getPrice(params: Record<string, unknown> = {}) { return this.get('/apiv2/price', params) }\n // Protocol\n getProtocol(params: Record<string, unknown> = {}) { return this.get('/apiv2/protocols', params) }\n getVolHistory(params: Record<string, unknown> = {}) { return this.get('/apiv2/protocols/history/vol', params) }\n getLiqHistory(params: Record<string, unknown> = {}) { return this.get('/apiv2/protocols/history/liq', params) }\n getUsersCountHistory(params: Record<string, unknown> = {}) { return this.get('/apiv2/protocols/history/usersCount', params) }\n getTransactionsHistory(params: Record<string, unknown> = {}) { return this.get('/apiv2/protocols/history/transactions', params) }\n getPoolsCountHistory(params: Record<string, unknown> = {}) { return this.get('/apiv2/protocols/history/poolsCount', params) }\n // Positions\n getUserPositions(params: Record<string, unknown> = {}) { return this.get('/apiv2/positions/user', params) }\n getPoolUserPositionTick(params: Record<string, unknown>) { return this.get('/apiv2/positions/tick', params) }\n // Pools\n getPools(params: Record<string, unknown> = {}) { return this.get('/apiv2/pools', params) }\n getTopApyPoolList(params: Record<string, unknown> = {}) { return this.get('/apiv2/pools/top_apy_list', params) }\n searchPools(params: Record<string, unknown> = {}) { return this.get('/apiv2/pools/search', params) }\n searchCountPools(params: Record<string, unknown> = {}) { return this.get('/apiv2/pools/search/count', params) }\n getPoolHooks() { return this.get('/apiv2/pools/hooks') }\n getPoolVolHistory(params: Record<string, unknown>) { return this.get('/apiv2/pools/history/vol', params) }\n getPoolLiqHistory(params: Record<string, unknown>) { return this.get('/apiv2/pools/history/liq', params) }\n // Pairs / Farms\n getPairs(params: Record<string, unknown> = {}) { return this.get('/apiv2/pairs', params) }\n getFarms(params: Record<string, unknown> = {}) { return this.get('/apiv2/farms', params) }\n getFarmTransactions(params: Record<string, unknown> = {}) { return this.get('/apiv2/farms/transactions', params) }\n getFarmPositions(params: Record<string, unknown> = {}) { return this.get('/apiv2/farms/positions/user', params) }\n}\n","import { defaultFetch, defaultJsonParser, requestJson, type FetchLike, type JsonParser } from './internal.js'\nimport { getNetworkEndpoints } from '@sun-protocol/sun-sdk-chains'\nimport { SDKError, type Network } from '@sun-protocol/sun-sdk-core'\n\nexport const SUNPUMP_DEFAULT_BASE_URL = getNetworkEndpoints('mainnet').sunPump!\n\nexport function buildSunPumpUrl(\n baseUrl: string,\n path: string,\n query: Record<string, string | number | boolean | undefined> = {},\n): string {\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`\n const normalizedPath = path.replace(/^\\/+/, '')\n const url = new URL(normalizedPath, normalizedBaseUrl)\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value))\n }\n return url.toString()\n}\n\ntype QueryValue = string | number | boolean | null | undefined\nexport type SunPumpQuery = Record<string, QueryValue>\n\nexport interface SunPumpEnvelope<T = unknown> {\n readonly code: number\n readonly msg?: string\n readonly data: T\n readonly pagination?: { pageNum: number; pageSize: number; total: number }\n}\n\nexport interface AgentTokenLaunchParams {\n name: string\n symbol: string\n description: string\n imageBase64?: string\n twitterUrl?: string\n telegramUrl?: string\n websiteUrl?: string\n tweetUsername?: string\n}\n\nexport interface SunPumpApiOptions {\n network?: Network\n baseUrl?: string\n fetchImpl?: FetchLike\n jsonParser?: JsonParser\n}\n\nfunction queryString(query?: SunPumpQuery): string {\n if (!query) return ''\n const usp = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === '') continue\n usp.append(key, String(value))\n }\n const s = usp.toString()\n return s ? `?${s}` : ''\n}\n\nexport class SunPumpApiClient {\n private readonly baseUrl: string\n private readonly fetchImpl: FetchLike\n private readonly jsonParser: JsonParser\n constructor(opts: SunPumpApiOptions = {}) {\n const baseUrl = opts.baseUrl ?? (opts.network\n ? getNetworkEndpoints(opts.network).sunPump\n : SUNPUMP_DEFAULT_BASE_URL)\n if (!baseUrl?.trim()) {\n if (opts.baseUrl !== undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'SunPump API base URL must not be empty')\n }\n throw new SDKError('SDK_UNSUPPORTED_NETWORK', 'SunPump API is unavailable on this network', {\n network: opts.network,\n })\n }\n this.baseUrl = baseUrl.replace(/\\/+$/, '')\n this.fetchImpl = opts.fetchImpl ?? defaultFetch\n this.jsonParser = opts.jsonParser ?? defaultJsonParser\n }\n\n private request<T = unknown>(path: string, query?: SunPumpQuery): Promise<T> {\n return requestJson<T>(`${this.baseUrl}${path}${queryString(query)}`, {\n service: 'SunPump', fetchImpl: this.fetchImpl,\n jsonParser: this.jsonParser,\n init: { method: 'GET', headers: { Accept: 'application/json' } },\n })\n }\n private post<T = unknown>(path: string, body: unknown): Promise<T> {\n return requestJson<T>(`${this.baseUrl}${path}`, {\n service: 'SunPump', fetchImpl: this.fetchImpl,\n jsonParser: this.jsonParser,\n init: { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(body) },\n })\n }\n\n // Token info\n listTokens(query: SunPumpQuery = {}) { return this.request('/token', query) }\n getToken(contractAddress: string) { return this.request(`/token/${encodeURIComponent(contractAddress)}`) }\n searchTokens(query: SunPumpQuery = {}) { return this.request('/token/search', query) }\n searchTokensV2(query: SunPumpQuery = {}) { return this.request('/token/searchV2', query) }\n tokensByOwner(query: SunPumpQuery) { return this.request('/token/search/by_owner', query) }\n tokenHolders(query: SunPumpQuery) { return this.request('/token/holders', query) }\n tokenHoldersV2(query: SunPumpQuery) { return this.request('/token/holdersV2', query) }\n userFavors(query: SunPumpQuery) { return this.request('/token/getUserFavors', query) }\n ranking(query: SunPumpQuery) { return this.request('/token/getRanking', query) }\n kingOfHill() { return this.request('/token/getKingOfHill') }\n pumpTokenList() { return this.request('/token/SunPumpTokenList.json') }\n // Transactions\n tokenTransactions(contractAddress: string, query: SunPumpQuery = {}) {\n return this.request(`/transactions/token/${encodeURIComponent(contractAddress)}`, query)\n }\n userTransactions(ownerAddress: string, query: SunPumpQuery = {}) {\n return this.request(`/transactions/holder/${encodeURIComponent(ownerAddress)}`, query)\n }\n // Portfolio\n portfolio(address: string, query: SunPumpQuery = {}) {\n return this.request(`/holders/${encodeURIComponent(address)}/tokens`, query)\n }\n // AI agent launch\n agentTokenLaunch(params: AgentTokenLaunchParams) { return this.post('/ai/agentTokenLaunch', params) }\n}\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\nimport { defaultFetch, defaultJsonParser, requestJson, type FetchLike, type JsonParser } from './internal.js'\n\n/** Reads Unix milliseconds from the SUN time service, with a 3-second limit. */\nexport async function getServerTime(\n url: string,\n fetchImpl: FetchLike = defaultFetch,\n jsonParser: JsonParser = defaultJsonParser,\n): Promise<number> {\n const controller = new AbortController()\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n const payload = await Promise.race([\n requestJson<unknown>(url, {\n service: 'Time',\n fetchImpl,\n jsonParser,\n init: {\n method: 'GET',\n headers: { Accept: 'application/json' },\n cache: 'no-store',\n signal: controller.signal,\n },\n }),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new SDKError('SDK_API_ERROR', 'Time service request timed out'))\n controller.abort()\n }, 3_000)\n }),\n ])\n if (typeof payload !== 'object' || payload === null || !('code' in payload) ||\n (payload.code !== 0 && payload.code !== '0') || !('data' in payload) ||\n typeof payload.data !== 'object' || payload.data === null || !('serverTimeStamp' in payload.data)) {\n throw new SDKError('SDK_API_ERROR', 'Time service returned an invalid response')\n }\n const value = payload.data.serverTimeStamp\n const timestamp = typeof value === 'number' || (typeof value === 'string' && /^\\d+$/.test(value))\n ? Number(value)\n : NaN\n // Validate milliseconds (2000–2100) without trusting the client's possibly skewed clock.\n if (!Number.isSafeInteger(timestamp) || timestamp < 946_684_800_000 || timestamp >= 4_102_444_800_000) {\n throw new SDKError('SDK_API_ERROR', 'Time service returned an invalid millisecond timestamp')\n }\n return timestamp\n } finally {\n clearTimeout(timer)\n }\n}\n","import { getNetworkEndpoints } from '@sun-protocol/sun-sdk-chains'\nimport type { Network } from '@sun-protocol/sun-sdk-core'\nimport { defaultFetch, defaultJsonParser, requestJson, type FetchLike, type JsonParser } from './internal.js'\n\nexport const TRONSCAN_DEFAULT_BASE_URL = getNetworkEndpoints('mainnet').tronScan\nexport interface TronScanOptions { network?: Network; baseUrl?: string; fetchImpl?: FetchLike; apiKey?: string; jsonParser?: JsonParser }\n\nexport class TronScanClient {\n private readonly baseUrl: string\n private readonly fetchImpl: FetchLike\n private readonly jsonParser: JsonParser\n private readonly apiKey: string | undefined\n constructor(opts: TronScanOptions = {}) {\n const chainBaseUrl = opts.network ? getNetworkEndpoints(opts.network).tronScan : undefined\n this.baseUrl = (opts.baseUrl ?? chainBaseUrl ?? TRONSCAN_DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.fetchImpl = opts.fetchImpl ?? defaultFetch\n this.jsonParser = opts.jsonParser ?? defaultJsonParser\n this.apiKey = opts.apiKey\n }\n private get<T = unknown>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(path, this.baseUrl)\n if (params) for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== null && v !== '') url.searchParams.append(k, String(v))\n }\n const headers: Record<string, string> = { Accept: 'application/json' }\n if (this.apiKey) headers['TRON-PRO-API-KEY'] = this.apiKey\n return requestJson<T>(url.toString(), {\n service: 'TronScan', fetchImpl: this.fetchImpl, jsonParser: this.jsonParser,\n init: { method: 'GET', headers },\n })\n }\n getTokenTrc20(params: Record<string, unknown>) { return this.get('/api/token_trc20', params) }\n getTokenHolderBalance(params: Record<string, unknown>) { return this.get('/api/token_trc20/holders', params) }\n getAccountTokens(params: Record<string, unknown>) { return this.get('/api/account/tokens', params) }\n}\n"],"mappings":"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","names":["import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_chains"]}
|