@chainstream-io/sdk 2.0.9 → 2.0.11

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/dist/index.cjs CHANGED
@@ -82,10 +82,13 @@ __export(index_exports, {
82
82
  WsRankingType: () => WsRankingType,
83
83
  WsTokenActivityType: () => WsTokenActivityType,
84
84
  buildSignMessage: () => buildSignMessage,
85
+ buildSiwxMessage: () => buildSiwxMessage,
85
86
  calculatePnl: () => calculatePnl,
86
87
  claimRedpacket: () => claimRedpacket,
88
+ clearSiwxTokenCache: () => clearSiwxTokenCache,
87
89
  createEndpoint: () => createEndpoint,
88
90
  createRedpacket: () => createRedpacket,
91
+ createSiwxToken: () => createSiwxToken,
89
92
  createToken: () => createToken,
90
93
  createWalletAuthHeaders: () => createWalletAuthHeaders,
91
94
  deleteEndpoint: () => deleteEndpoint,
@@ -136,6 +139,7 @@ __export(index_exports, {
136
139
  getRedpackets: () => getRedpackets,
137
140
  getRedpacketsByAddress: () => getRedpacketsByAddress,
138
141
  getSecurity: () => getSecurity,
142
+ getSiwxToken: () => getSiwxToken,
139
143
  getStats: () => getStats,
140
144
  getStatsMulti: () => getStatsMulti,
141
145
  getStocksTokens: () => getStocksTokens,
@@ -192,24 +196,69 @@ var import_event_source_polyfill = require("event-source-polyfill");
192
196
  var import_axios = __toESM(require("axios"), 1);
193
197
  var import_axios_retry = __toESM(require("axios-retry"), 1);
194
198
 
195
- // src/wallet-auth.ts
199
+ // src/siwx-auth.ts
196
200
  var import_crypto = require("crypto");
197
- var SIGNATURE_PREFIX = "chainstream";
198
- function buildSignMessage(chain, address, timestamp, nonce) {
199
- return `${SIGNATURE_PREFIX}:${chain}:${address}:${timestamp}:${nonce}`;
201
+ var SIWX_DOMAIN = "api.chainstream.io";
202
+ var SIWX_URI = "https://api.chainstream.io";
203
+ var SIWX_VERSION = "1";
204
+ var DEFAULT_CHAIN_ID = "8453";
205
+ var DEFAULT_EXPIRES_IN_SECONDS = 3600;
206
+ var REFRESH_BEFORE_SECONDS = 60;
207
+ function buildSiwxMessage(address, chain, nonce, issuedAt, expiresAt) {
208
+ const chainLabel = chain === "evm" ? "Ethereum" : "Solana";
209
+ const chainId = chain === "evm" ? DEFAULT_CHAIN_ID : "mainnet";
210
+ return [
211
+ `${SIWX_DOMAIN} wants you to sign in with your ${chainLabel} account:`,
212
+ address,
213
+ "",
214
+ "Sign in to ChainStream API",
215
+ "",
216
+ `URI: ${SIWX_URI}`,
217
+ `Version: ${SIWX_VERSION}`,
218
+ `Chain ID: ${chainId}`,
219
+ `Nonce: ${nonce}`,
220
+ `Issued At: ${issuedAt.toISOString()}`,
221
+ `Expiration Time: ${expiresAt.toISOString()}`
222
+ ].join("\n");
200
223
  }
201
- async function createWalletAuthHeaders(signer) {
202
- const timestamp = Math.floor(Date.now() / 1e3).toString();
224
+ async function createSiwxToken(signer, expiresInSeconds = DEFAULT_EXPIRES_IN_SECONDS) {
203
225
  const nonce = (0, import_crypto.randomBytes)(16).toString("hex");
204
- const message = buildSignMessage(signer.chain, signer.address, timestamp, nonce);
226
+ const issuedAt = /* @__PURE__ */ new Date();
227
+ const expiresAt = new Date(Date.now() + expiresInSeconds * 1e3);
228
+ const message = buildSiwxMessage(signer.address, signer.chain, nonce, issuedAt, expiresAt);
205
229
  const signature = await signer.signMessage(message);
206
- return {
207
- "X-Wallet-Address": signer.address,
208
- "X-Wallet-Chain": signer.chain,
209
- "X-Wallet-Signature": signature,
210
- "X-Wallet-Timestamp": timestamp,
211
- "X-Wallet-Nonce": nonce
212
- };
230
+ const messageB64 = Buffer.from(message).toString("base64");
231
+ const token = `${messageB64}.${signature}`;
232
+ return { token, expiresAt };
233
+ }
234
+ var cachedToken = null;
235
+ var cachedExpiresAt = null;
236
+ var refreshPromise = null;
237
+ async function getSiwxToken(signer) {
238
+ if (cachedToken && cachedExpiresAt) {
239
+ const now = /* @__PURE__ */ new Date();
240
+ const refreshThreshold = new Date(cachedExpiresAt.getTime() - REFRESH_BEFORE_SECONDS * 1e3);
241
+ if (now < refreshThreshold) {
242
+ return cachedToken;
243
+ }
244
+ if (now < cachedExpiresAt && !refreshPromise) {
245
+ refreshPromise = refreshToken(signer).finally(() => {
246
+ refreshPromise = null;
247
+ });
248
+ return cachedToken;
249
+ }
250
+ }
251
+ await refreshToken(signer);
252
+ return cachedToken;
253
+ }
254
+ async function refreshToken(signer) {
255
+ const { token, expiresAt } = await createSiwxToken(signer);
256
+ cachedToken = token;
257
+ cachedExpiresAt = expiresAt;
258
+ }
259
+ function clearSiwxTokenCache() {
260
+ cachedToken = null;
261
+ cachedExpiresAt = null;
213
262
  }
214
263
 
215
264
  // src/openapi-client/chainstreamApiClient.ts
@@ -230,10 +279,8 @@ var configure = (options) => {
230
279
  });
231
280
  axiosInstance.interceptors.request.use(async (config) => {
232
281
  if (options.walletSigner) {
233
- const walletHeaders = await createWalletAuthHeaders(options.walletSigner);
234
- Object.entries(walletHeaders).forEach(([key, value]) => {
235
- config.headers[key] = value;
236
- });
282
+ const token = await getSiwxToken(options.walletSigner);
283
+ config.headers.Authorization = `SIWX ${token}`;
237
284
  } else if (options.apiKey) {
238
285
  config.headers["X-API-KEY"] = options.apiKey;
239
286
  } else if (options.accessToken) {
@@ -3046,6 +3093,26 @@ var QuoteDex = {
3046
3093
  raydium: "raydium",
3047
3094
  pumpfun: "pumpfun"
3048
3095
  };
3096
+
3097
+ // src/wallet-auth.ts
3098
+ var import_crypto2 = require("crypto");
3099
+ var SIGNATURE_PREFIX = "chainstream";
3100
+ function buildSignMessage(chain, address, timestamp, nonce) {
3101
+ return `${SIGNATURE_PREFIX}:${chain}:${address}:${timestamp}:${nonce}`;
3102
+ }
3103
+ async function createWalletAuthHeaders(signer) {
3104
+ const timestamp = Math.floor(Date.now() / 1e3).toString();
3105
+ const nonce = (0, import_crypto2.randomBytes)(16).toString("hex");
3106
+ const message = buildSignMessage(signer.chain, signer.address, timestamp, nonce);
3107
+ const signature = await signer.signMessage(message);
3108
+ return {
3109
+ "X-Wallet-Address": signer.address,
3110
+ "X-Wallet-Chain": signer.chain,
3111
+ "X-Wallet-Signature": signature,
3112
+ "X-Wallet-Timestamp": timestamp,
3113
+ "X-Wallet-Nonce": nonce
3114
+ };
3115
+ }
3049
3116
  // Annotate the CommonJS export names for ESM import in node:
3050
3117
  0 && (module.exports = {
3051
3118
  ActivityType,
@@ -3098,10 +3165,13 @@ var QuoteDex = {
3098
3165
  WsRankingType,
3099
3166
  WsTokenActivityType,
3100
3167
  buildSignMessage,
3168
+ buildSiwxMessage,
3101
3169
  calculatePnl,
3102
3170
  claimRedpacket,
3171
+ clearSiwxTokenCache,
3103
3172
  createEndpoint,
3104
3173
  createRedpacket,
3174
+ createSiwxToken,
3105
3175
  createToken,
3106
3176
  createWalletAuthHeaders,
3107
3177
  deleteEndpoint,
@@ -3152,6 +3222,7 @@ var QuoteDex = {
3152
3222
  getRedpackets,
3153
3223
  getRedpacketsByAddress,
3154
3224
  getSecurity,
3225
+ getSiwxToken,
3155
3226
  getStats,
3156
3227
  getStatsMulti,
3157
3228
  getStocksTokens,