@rougechain/sdk 0.3.6 → 0.3.7

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 CHANGED
@@ -112,10 +112,27 @@ await rc.burn(wallet, 500);
112
112
  ## DEX (`rc.dex`)
113
113
 
114
114
  ```typescript
115
+ // List all pools
116
+ const pools = await rc.dex.getPools();
117
+
118
+ // Get a single pool
119
+ const pool = await rc.dex.getPool("XRGE-MTK");
120
+
121
+ // Get price history (PriceSnapshot[]) — for building charts
122
+ const prices = await rc.dex.getPriceHistory("XRGE-MTK");
123
+ // Each snapshot: { pool_id, timestamp, block_height, reserve_a, reserve_b, price_a_in_b, price_b_in_a }
124
+
125
+ // Get pool stats (volume, trade count)
126
+ const stats = await rc.dex.getPoolStats("XRGE-MTK");
127
+
128
+ // Get pool events (swaps, adds, removes)
129
+ const events = await rc.dex.getPoolEvents("XRGE-MTK");
130
+
115
131
  // Get a swap quote
116
132
  const quote = await rc.dex.quote({
117
133
  poolId: "XRGE-MTK",
118
134
  tokenIn: "XRGE",
135
+ tokenOut: "MTK",
119
136
  amountIn: 100,
120
137
  });
121
138
  console.log(`You'll receive ${quote.amount_out} MTK`);
@@ -329,6 +346,7 @@ import type {
329
346
  Block, Transaction, TokenMetadata, NftCollection,
330
347
  NftToken, LiquidityPool, BalanceResponse, Validator,
331
348
  BridgeConfig, MailMessage, MessengerMessage, WalletKeys,
349
+ PriceSnapshot, PoolEvent, PoolStats, SwapQuote,
332
350
  } from "@rougechain/sdk";
333
351
  ```
334
352
 
package/dist/index.cjs CHANGED
@@ -545,8 +545,11 @@ var DexClient = class {
545
545
  );
546
546
  return data.events;
547
547
  }
548
- async getPoolPrices(poolId) {
549
- return this.rc.get(`/pool/${poolId}/prices`);
548
+ async getPriceHistory(poolId) {
549
+ const data = await this.rc.get(
550
+ `/pool/${poolId}/prices`
551
+ );
552
+ return data.prices;
550
553
  }
551
554
  async getPoolStats(poolId) {
552
555
  return this.rc.get(`/pool/${poolId}/stats`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/signer.ts","../src/client.ts","../src/wallet.ts"],"names":["ml_dsa65"],"mappings":"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","file":"index.cjs","sourcesContent":["export function hexToBytes(hex: string): Uint8Array {\r\n const bytes = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n}\r\n\r\nexport function generateNonce(): string {\r\n const bytes = crypto.getRandomValues(new Uint8Array(16));\r\n return bytesToHex(bytes);\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { hexToBytes, bytesToHex, generateNonce } from \"./utils.js\";\r\nimport type {\r\n TransactionPayload,\r\n SignedTransaction,\r\n WalletKeys,\r\n} from \"./types.js\";\r\n\r\nexport const BURN_ADDRESS =\r\n \"XRGE_BURN_0x000000000000000000000000000000000000000000000000000000000000DEAD\";\r\n\r\nfunction sortKeysDeep(obj: unknown): unknown {\r\n if (Array.isArray(obj)) return obj.map(sortKeysDeep);\r\n if (obj !== null && typeof obj === \"object\") {\r\n const sorted: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj).sort()) {\r\n sorted[key] = sortKeysDeep((obj as Record<string, unknown>)[key]);\r\n }\r\n return sorted;\r\n }\r\n return obj;\r\n}\r\n\r\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(sortKeysDeep(payload));\r\n return new TextEncoder().encode(json);\r\n}\r\n\r\nexport function signTransaction(\r\n payload: TransactionPayload,\r\n privateKey: string,\r\n publicKey: string\r\n): SignedTransaction {\r\n const payloadBytes = serializePayload(payload);\r\n const signature = ml_dsa65.sign(payloadBytes, hexToBytes(privateKey));\r\n return {\r\n payload,\r\n signature: bytesToHex(signature),\r\n public_key: publicKey,\r\n };\r\n}\r\n\r\nexport function verifyTransaction(signedTx: SignedTransaction): boolean {\r\n try {\r\n const payloadBytes = serializePayload(signedTx.payload);\r\n return ml_dsa65.verify(\r\n hexToBytes(signedTx.signature),\r\n payloadBytes,\r\n hexToBytes(signedTx.public_key)\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function isBurnAddress(address: string): boolean {\r\n return address === BURN_ADDRESS;\r\n}\r\n\r\n// ===== Transaction builders =====\r\n\r\nfunction buildAndSign(\r\n wallet: WalletKeys,\r\n payload: Omit<TransactionPayload, \"from\" | \"timestamp\" | \"nonce\">\r\n): SignedTransaction {\r\n const full: TransactionPayload = {\r\n ...payload,\r\n from: wallet.publicKey,\r\n timestamp: Date.now(),\r\n nonce: generateNonce(),\r\n } as TransactionPayload;\r\n return signTransaction(full, wallet.privateKey, wallet.publicKey);\r\n}\r\n\r\nexport function createSignedTransfer(\r\n wallet: WalletKeys,\r\n to: string,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"transfer\", to, amount, fee, token });\r\n}\r\n\r\nexport function createSignedTokenCreation(\r\n wallet: WalletKeys,\r\n tokenName: string,\r\n tokenSymbol: string,\r\n initialSupply: number,\r\n fee = 10,\r\n image?: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_token\",\r\n token_name: tokenName,\r\n token_symbol: tokenSymbol,\r\n initial_supply: initialSupply,\r\n fee,\r\n ...(image ? { image } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataUpdate(\r\n wallet: WalletKeys,\r\n tokenSymbol: string,\r\n metadata: {\r\n image?: string;\r\n description?: string;\r\n website?: string;\r\n twitter?: string;\r\n discord?: string;\r\n }\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"update_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n ...(metadata.image !== undefined ? { image: metadata.image } : {}),\r\n ...(metadata.description !== undefined ? { description: metadata.description } : {}),\r\n ...(metadata.website !== undefined ? { website: metadata.website } : {}),\r\n ...(metadata.twitter !== undefined ? { twitter: metadata.twitter } : {}),\r\n ...(metadata.discord !== undefined ? { discord: metadata.discord } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataClaim(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"claim_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n });\r\n}\r\n\r\nexport function createSignedSwap(\r\n wallet: WalletKeys,\r\n tokenIn: string,\r\n tokenOut: string,\r\n amountIn: number,\r\n minAmountOut: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"swap\",\r\n token_in: tokenIn,\r\n token_out: tokenOut,\r\n amount_in: amountIn,\r\n min_amount_out: minAmountOut,\r\n });\r\n}\r\n\r\nexport function createSignedPoolCreation(\r\n wallet: WalletKeys,\r\n tokenA: string,\r\n tokenB: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_pool\",\r\n token_a: tokenA,\r\n token_b: tokenB,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedAddLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"add_liquidity\",\r\n pool_id: poolId,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedRemoveLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n lpAmount: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"remove_liquidity\",\r\n pool_id: poolId,\r\n lp_amount: lpAmount,\r\n });\r\n}\r\n\r\nexport function createSignedStake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"stake\", amount, fee });\r\n}\r\n\r\nexport function createSignedUnstake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"unstake\", amount, fee });\r\n}\r\n\r\nexport function createSignedFaucetRequest(\r\n wallet: WalletKeys\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"faucet\" });\r\n}\r\n\r\nexport function createSignedBurn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"transfer\",\r\n to: BURN_ADDRESS,\r\n amount,\r\n fee,\r\n token,\r\n });\r\n}\r\n\r\n// ===== Bridge builders =====\r\n\r\nexport function createSignedBridgeWithdraw(\r\n wallet: WalletKeys,\r\n amount: number,\r\n evmAddress: string,\r\n tokenSymbol = \"qETH\",\r\n fee = 0.1\r\n): SignedTransaction {\r\n const evm = evmAddress.startsWith(\"0x\") ? evmAddress : `0x${evmAddress}`;\r\n return buildAndSign(wallet, {\r\n type: \"bridge_withdraw\",\r\n amount,\r\n fee,\r\n tokenSymbol,\r\n evmAddress: evm,\r\n });\r\n}\r\n\r\n// ===== NFT builders =====\r\n\r\nexport function createSignedNftCreateCollection(\r\n wallet: WalletKeys,\r\n symbol: string,\r\n name: string,\r\n opts: {\r\n maxSupply?: number;\r\n royaltyBps?: number;\r\n image?: string;\r\n description?: string;\r\n } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_create_collection\",\r\n symbol,\r\n name,\r\n fee: 50,\r\n maxSupply: opts.maxSupply,\r\n royaltyBps: opts.royaltyBps,\r\n image: opts.image,\r\n description: opts.description,\r\n });\r\n}\r\n\r\nexport function createSignedNftMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n name: string,\r\n opts: { metadataUri?: string; attributes?: unknown } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_mint\",\r\n collectionId,\r\n name,\r\n fee: 5,\r\n metadataUri: opts.metadataUri,\r\n attributes: opts.attributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftBatchMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n names: string[],\r\n opts: { uris?: string[]; batchAttributes?: unknown[] } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_batch_mint\",\r\n collectionId,\r\n names,\r\n fee: 5 * names.length,\r\n uris: opts.uris,\r\n batchAttributes: opts.batchAttributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftTransfer(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n to: string,\r\n salePrice?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_transfer\",\r\n collectionId,\r\n tokenId,\r\n to,\r\n fee: 1,\r\n salePrice,\r\n });\r\n}\r\n\r\nexport function createSignedNftBurn(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_burn\",\r\n collectionId,\r\n tokenId,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftLock(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n locked: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_lock\",\r\n collectionId,\r\n tokenId,\r\n locked,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftFreezeCollection(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n frozen: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_freeze_collection\",\r\n collectionId,\r\n frozen,\r\n fee: 0.1,\r\n });\r\n}\r\n","import {\r\n createSignedTransfer,\r\n createSignedTokenCreation,\r\n createSignedSwap,\r\n createSignedPoolCreation,\r\n createSignedAddLiquidity,\r\n createSignedRemoveLiquidity,\r\n createSignedStake,\r\n createSignedUnstake,\r\n createSignedFaucetRequest,\r\n createSignedBurn,\r\n createSignedBridgeWithdraw,\r\n createSignedNftCreateCollection,\r\n createSignedNftMint,\r\n createSignedNftBatchMint,\r\n createSignedNftTransfer,\r\n createSignedNftBurn,\r\n createSignedNftLock,\r\n createSignedNftFreezeCollection,\r\n createSignedTokenMetadataUpdate,\r\n createSignedTokenMetadataClaim,\r\n} from \"./signer.js\";\r\nimport type {\r\n WalletKeys,\r\n ApiResponse,\r\n SignedTransaction,\r\n NodeStats,\r\n Block,\r\n TokenMetadata,\r\n BalanceResponse,\r\n LiquidityPool,\r\n SwapQuote,\r\n PoolEvent,\r\n PoolStats,\r\n NftCollection,\r\n NftToken,\r\n Validator,\r\n BridgeConfig,\r\n BridgeWithdrawal,\r\n XrgeBridgeConfig,\r\n TransferParams,\r\n CreateTokenParams,\r\n SwapParams,\r\n CreatePoolParams,\r\n AddLiquidityParams,\r\n RemoveLiquidityParams,\r\n StakeParams,\r\n CreateNftCollectionParams,\r\n MintNftParams,\r\n BatchMintNftParams,\r\n TransferNftParams,\r\n BurnNftParams,\r\n LockNftParams,\r\n FreezeCollectionParams,\r\n BridgeWithdrawParams,\r\n BridgeClaimParams,\r\n XrgeBridgeClaimParams,\r\n XrgeBridgeWithdrawParams,\r\n SwapQuoteParams,\r\n TokenMetadataUpdateParams,\r\n TokenHolder,\r\n MailMessage,\r\n SendMailParams,\r\n MessengerWallet,\r\n MessengerConversation,\r\n MessengerMessage,\r\n} from \"./types.js\";\r\n\r\ntype FetchFn = typeof globalThis.fetch;\r\n\r\nexport interface RougeChainOptions {\r\n /** Custom fetch implementation (defaults to globalThis.fetch) */\r\n fetch?: FetchFn;\r\n /** Optional API key for authenticated endpoints */\r\n apiKey?: string;\r\n}\r\n\r\nexport class RougeChain {\r\n /** @internal */ readonly baseUrl: string;\r\n /** @internal */ readonly fetchFn: FetchFn;\r\n /** @internal */ readonly headers: Record<string, string>;\r\n\r\n public readonly nft: NftClient;\r\n public readonly dex: DexClient;\r\n public readonly bridge: BridgeClient;\r\n public readonly mail: MailClient;\r\n public readonly messenger: MessengerClient;\r\n\r\n constructor(baseUrl: string, options: RougeChainOptions = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\r\n this.headers = { \"Content-Type\": \"application/json\" };\r\n if (options.apiKey) {\r\n this.headers[\"X-API-Key\"] = options.apiKey;\r\n }\r\n\r\n this.nft = new NftClient(this);\r\n this.dex = new DexClient(this);\r\n this.bridge = new BridgeClient(this);\r\n this.mail = new MailClient(this);\r\n this.messenger = new MessengerClient(this);\r\n }\r\n\r\n // ===== Internal helpers =====\r\n\r\n /** @internal */\r\n async get<T = unknown>(path: string): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n headers: this.headers,\r\n });\r\n if (!res.ok) {\r\n throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async post<T = unknown>(path: string, body: unknown): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(\r\n `POST ${path} failed: ${res.status} ${res.statusText} ${text}`\r\n );\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async submitTx(\r\n endpoint: string,\r\n signedTx: SignedTransaction\r\n ): Promise<ApiResponse> {\r\n try {\r\n const raw = await this.post<Record<string, unknown>>(endpoint, signedTx);\r\n const { success, error, ...rest } = raw;\r\n return {\r\n success: success as boolean,\r\n error: error as string | undefined,\r\n data: Object.keys(rest).length > 0 ? rest : undefined,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ===== Stats & Health =====\r\n\r\n async getStats(): Promise<NodeStats> {\r\n return this.get<NodeStats>(\"/stats\");\r\n }\r\n\r\n async getHealth(): Promise<{ status: string; chain_id: string; height: number }> {\r\n return this.get(\"/health\");\r\n }\r\n\r\n // ===== Blocks =====\r\n\r\n async getBlocks(opts: { limit?: number } = {}): Promise<Block[]> {\r\n const q = opts.limit ? `?limit=${opts.limit}` : \"\";\r\n const data = await this.get<{ blocks: Block[] }>(`/blocks${q}`);\r\n return data.blocks;\r\n }\r\n\r\n async getBlocksSummary(\r\n range: \"1h\" | \"24h\" | \"7d\" = \"24h\"\r\n ): Promise<unknown> {\r\n return this.get(`/blocks/summary?range=${range}`);\r\n }\r\n\r\n // ===== Balance =====\r\n\r\n async getBalance(publicKey: string): Promise<BalanceResponse> {\r\n return this.get<BalanceResponse>(`/balance/${publicKey}`);\r\n }\r\n\r\n async getTokenBalance(publicKey: string, token: string): Promise<number> {\r\n const data = await this.get<{ balance: number }>(\r\n `/balance/${publicKey}/${token}`\r\n );\r\n return data.balance;\r\n }\r\n\r\n // ===== Transactions =====\r\n\r\n async getTransactions(\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<unknown> {\r\n const params = new URLSearchParams();\r\n if (opts.limit) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.get(`/txs${q ? `?${q}` : \"\"}`);\r\n }\r\n\r\n // ===== Tokens =====\r\n\r\n async getTokens(): Promise<TokenMetadata[]> {\r\n const data = await this.get<{ tokens: TokenMetadata[]; success: boolean }>(\r\n \"/tokens\"\r\n );\r\n return data.tokens;\r\n }\r\n\r\n async getTokenMetadata(symbol: string): Promise<TokenMetadata> {\r\n return this.get<TokenMetadata>(`/token/${symbol}/metadata`);\r\n }\r\n\r\n async getTokenHolders(\r\n symbol: string\r\n ): Promise<TokenHolder[]> {\r\n const data = await this.get<{ holders: TokenHolder[] }>(\r\n `/token/${symbol}/holders`\r\n );\r\n return data.holders;\r\n }\r\n\r\n async getTokenTransactions(\r\n symbol: string\r\n ): Promise<unknown> {\r\n return this.get(`/token/${symbol}/transactions`);\r\n }\r\n\r\n // ===== Validators =====\r\n\r\n async getValidators(): Promise<Validator[]> {\r\n const data = await this.get<{ validators: Validator[] }>(\"/validators\");\r\n return data.validators;\r\n }\r\n\r\n async getValidatorStats(): Promise<unknown> {\r\n return this.get(\"/validators/stats\");\r\n }\r\n\r\n async getFinality(): Promise<{\r\n finalized_height: number;\r\n tip_height: number;\r\n total_stake: number;\r\n finalized_stake: number;\r\n }> {\r\n return this.get(\"/finality\");\r\n }\r\n\r\n // ===== Peers =====\r\n\r\n async getPeers(): Promise<string[]> {\r\n const data = await this.get<{ peers: string[] }>(\"/peers\");\r\n return data.peers;\r\n }\r\n\r\n // ===== Burned =====\r\n\r\n async getBurnedTokens(): Promise<{\r\n burned: Record<string, number>;\r\n total_xrge_burned: number;\r\n }> {\r\n return this.get(\"/burned\");\r\n }\r\n\r\n // ===== Write operations =====\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTransfer(\r\n wallet,\r\n params.to,\r\n params.amount,\r\n params.fee,\r\n params.token\r\n );\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async createToken(\r\n wallet: WalletKeys,\r\n params: CreateTokenParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenCreation(\r\n wallet,\r\n params.name,\r\n params.symbol,\r\n params.totalSupply,\r\n params.fee,\r\n params.image\r\n );\r\n return this.submitTx(\"/v2/token/create\", tx);\r\n }\r\n\r\n async stake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedStake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/stake\", tx);\r\n }\r\n\r\n async unstake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnstake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/unstake\", tx);\r\n }\r\n\r\n async faucet(wallet: WalletKeys): Promise<ApiResponse> {\r\n const tx = createSignedFaucetRequest(wallet);\r\n return this.submitTx(\"/v2/faucet\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedBurn(wallet, amount, fee, token);\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async updateTokenMetadata(\r\n wallet: WalletKeys,\r\n params: TokenMetadataUpdateParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataUpdate(wallet, params.symbol, {\r\n image: params.image,\r\n description: params.description,\r\n website: params.website,\r\n twitter: params.twitter,\r\n discord: params.discord,\r\n });\r\n return this.submitTx(\"/v2/token/metadata/update\", tx);\r\n }\r\n\r\n async claimTokenMetadata(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataClaim(wallet, tokenSymbol);\r\n return this.submitTx(\"/v2/token/metadata/claim\", tx);\r\n }\r\n}\r\n\r\n// ===== NFT Sub-client =====\r\n\r\nclass NftClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getCollections(): Promise<NftCollection[]> {\r\n const data = await this.rc.get<{ collections: NftCollection[] }>(\r\n \"/nft/collections\"\r\n );\r\n return data.collections;\r\n }\r\n\r\n async getCollection(collectionId: string): Promise<NftCollection> {\r\n return this.rc.get<NftCollection>(\r\n `/nft/collection/${encodeURIComponent(collectionId)}`\r\n );\r\n }\r\n\r\n /**\r\n * Poll until a collection exists on-chain (i.e. the create tx has been mined).\r\n * Useful after `createCollection` since the tx goes to the mempool first.\r\n * @returns the collection once found, or throws after the timeout.\r\n */\r\n async waitForCollection(\r\n collectionId: string,\r\n opts: { timeoutMs?: number; pollMs?: number } = {}\r\n ): Promise<NftCollection> {\r\n const timeout = opts.timeoutMs ?? 30_000;\r\n const poll = opts.pollMs ?? 1_000;\r\n const deadline = Date.now() + timeout;\r\n while (Date.now() < deadline) {\r\n try {\r\n return await this.getCollection(collectionId);\r\n } catch {\r\n await new Promise((r) => setTimeout(r, poll));\r\n }\r\n }\r\n throw new Error(\r\n `Collection \"${collectionId}\" not found after ${timeout}ms — the create transaction may not have been mined yet`\r\n );\r\n }\r\n\r\n async getTokens(\r\n collectionId: string,\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<{ tokens: NftToken[]; total: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset !== undefined) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.rc.get(\r\n `/nft/collection/${encodeURIComponent(collectionId)}/tokens${q ? `?${q}` : \"\"}`\r\n );\r\n }\r\n\r\n async getToken(\r\n collectionId: string,\r\n tokenId: number\r\n ): Promise<NftToken> {\r\n return this.rc.get<NftToken>(\r\n `/nft/token/${encodeURIComponent(collectionId)}/${tokenId}`\r\n );\r\n }\r\n\r\n async getByOwner(pubkey: string): Promise<NftToken[]> {\r\n const data = await this.rc.get<{ nfts: NftToken[] }>(\r\n `/nft/owner/${encodeURIComponent(pubkey)}`\r\n );\r\n return data.nfts;\r\n }\r\n\r\n // Write operations\r\n\r\n async createCollection(\r\n wallet: WalletKeys,\r\n params: CreateNftCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftCreateCollection(wallet, params.symbol, params.name, {\r\n maxSupply: params.maxSupply,\r\n royaltyBps: params.royaltyBps,\r\n image: params.image,\r\n description: params.description,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/collection/create\", tx);\r\n }\r\n\r\n async mint(\r\n wallet: WalletKeys,\r\n params: MintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftMint(wallet, params.collectionId, params.name, {\r\n metadataUri: params.metadataUri,\r\n attributes: params.attributes,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/mint\", tx);\r\n }\r\n\r\n async batchMint(\r\n wallet: WalletKeys,\r\n params: BatchMintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBatchMint(\r\n wallet,\r\n params.collectionId,\r\n params.names,\r\n { uris: params.uris, batchAttributes: params.batchAttributes }\r\n );\r\n return this.rc.submitTx(\"/v2/nft/batch-mint\", tx);\r\n }\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftTransfer(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.to,\r\n params.salePrice\r\n );\r\n return this.rc.submitTx(\"/v2/nft/transfer\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n params: BurnNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBurn(wallet, params.collectionId, params.tokenId);\r\n return this.rc.submitTx(\"/v2/nft/burn\", tx);\r\n }\r\n\r\n async lock(\r\n wallet: WalletKeys,\r\n params: LockNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftLock(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.locked\r\n );\r\n return this.rc.submitTx(\"/v2/nft/lock\", tx);\r\n }\r\n\r\n async freezeCollection(\r\n wallet: WalletKeys,\r\n params: FreezeCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftFreezeCollection(\r\n wallet,\r\n params.collectionId,\r\n params.frozen\r\n );\r\n return this.rc.submitTx(\"/v2/nft/freeze-collection\", tx);\r\n }\r\n}\r\n\r\n// ===== DEX Sub-client =====\r\n\r\nclass DexClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getPools(): Promise<LiquidityPool[]> {\r\n const data = await this.rc.get<{ pools: LiquidityPool[] }>(\"/pools\");\r\n return data.pools;\r\n }\r\n\r\n async getPool(poolId: string): Promise<LiquidityPool> {\r\n return this.rc.get<LiquidityPool>(`/pool/${poolId}`);\r\n }\r\n\r\n async getPoolEvents(poolId: string): Promise<PoolEvent[]> {\r\n const data = await this.rc.get<{ events: PoolEvent[] }>(\r\n `/pool/${poolId}/events`\r\n );\r\n return data.events;\r\n }\r\n\r\n async getPoolPrices(poolId: string): Promise<unknown> {\r\n return this.rc.get(`/pool/${poolId}/prices`);\r\n }\r\n\r\n async getPoolStats(poolId: string): Promise<PoolStats> {\r\n return this.rc.get<PoolStats>(`/pool/${poolId}/stats`);\r\n }\r\n\r\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\r\n return this.rc.post<SwapQuote>(\"/swap/quote\", {\r\n pool_id: params.poolId,\r\n token_in: params.tokenIn,\r\n token_out: params.tokenOut,\r\n amount_in: params.amountIn,\r\n });\r\n }\r\n\r\n // Write operations\r\n\r\n async swap(\r\n wallet: WalletKeys,\r\n params: SwapParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedSwap(\r\n wallet,\r\n params.tokenIn,\r\n params.tokenOut,\r\n params.amountIn,\r\n params.minAmountOut\r\n );\r\n return this.rc.submitTx(\"/v2/swap/execute\", tx);\r\n }\r\n\r\n async createPool(\r\n wallet: WalletKeys,\r\n params: CreatePoolParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedPoolCreation(\r\n wallet,\r\n params.tokenA,\r\n params.tokenB,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/create\", tx);\r\n }\r\n\r\n async addLiquidity(\r\n wallet: WalletKeys,\r\n params: AddLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedAddLiquidity(\r\n wallet,\r\n params.poolId,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/add-liquidity\", tx);\r\n }\r\n\r\n async removeLiquidity(\r\n wallet: WalletKeys,\r\n params: RemoveLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedRemoveLiquidity(wallet, params.poolId, params.lpAmount);\r\n return this.rc.submitTx(\"/v2/pool/remove-liquidity\", tx);\r\n }\r\n}\r\n\r\n// ===== Bridge Sub-client =====\r\n\r\nclass BridgeClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getConfig(): Promise<BridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n custodyAddress: data.custodyAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n supportedTokens: data.supportedTokens as string[] | undefined,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async getWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n }\r\n\r\n /** Withdraw qETH/qUSDC — signed client-side, private key never sent to server */\r\n async withdraw(\r\n wallet: WalletKeys,\r\n params: BridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const tokenSymbol = params.tokenSymbol ?? \"qETH\";\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n tokenSymbol,\r\n params.fee\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amountUnits: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n /** Claim qETH or qUSDC after depositing on Base Sepolia */\r\n async claim(params: BridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n evmSignature: params.evmSignature,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n token: params.token ?? \"ETH\",\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ── XRGE Bridge ──\r\n\r\n async getXrgeConfig(): Promise<XrgeBridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/xrge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n vaultAddress: data.vaultAddress as string | undefined,\r\n tokenAddress: data.tokenAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async claimXrge(params: XrgeBridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n amount: params.amount,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async withdrawXrge(\r\n wallet: WalletKeys,\r\n params: XrgeBridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n \"XRGE\",\r\n 0.1\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amount: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getXrgeWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n try {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/xrge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n// ===== Mail Sub-client =====\r\n\r\nclass MailClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async send(params: SendMailParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/send\", params);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getInbox(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/inbox?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getSent(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/sent?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getTrash(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/trash?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getMessage(id: string): Promise<MailMessage> {\r\n return this.rc.get<MailMessage>(`/mail/message/${encodeURIComponent(id)}`);\r\n }\r\n\r\n async move(messageId: string, folder: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/move\", {\r\n messageId,\r\n folder,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/read\", {\r\n messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async delete(id: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/mail/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Messenger Sub-client =====\r\n\r\nclass MessengerClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getWallets(): Promise<MessengerWallet[]> {\r\n const data = await this.rc.get<{ wallets: MessengerWallet[] }>(\"/messenger/wallets\");\r\n return data.wallets ?? [];\r\n }\r\n\r\n async registerWallet(opts: {\r\n id: string;\r\n displayName: string;\r\n signingPublicKey: string;\r\n encryptionPublicKey: string;\r\n }): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/wallets/register\", opts);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getConversations(\r\n walletId: string,\r\n opts: { signingPublicKey?: string; encryptionPublicKey?: string } = {}\r\n ): Promise<MessengerConversation[]> {\r\n const params = new URLSearchParams({ walletId });\r\n if (opts.signingPublicKey) params.set(\"signingPublicKey\", opts.signingPublicKey);\r\n if (opts.encryptionPublicKey) params.set(\"encryptionPublicKey\", opts.encryptionPublicKey);\r\n const data = await this.rc.get<{ conversations: MessengerConversation[] }>(\r\n `/messenger/conversations?${params.toString()}`\r\n );\r\n return data.conversations ?? [];\r\n }\r\n\r\n async createConversation(participants: string[]): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/conversations\", {\r\n participants,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getMessages(conversationId: string): Promise<MessengerMessage[]> {\r\n const data = await this.rc.get<{ messages: MessengerMessage[] }>(\r\n `/messenger/messages?conversationId=${encodeURIComponent(conversationId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async sendMessage(\r\n conversationId: string,\r\n sender: string,\r\n encryptedContent: string,\r\n opts: {\r\n mediaType?: string;\r\n mediaData?: string;\r\n selfDestruct?: boolean;\r\n destructAfterSeconds?: number;\r\n } = {}\r\n ): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages\", {\r\n conversation_id: conversationId,\r\n sender,\r\n encrypted_content: encryptedContent,\r\n media_type: opts.mediaType,\r\n media_data: opts.mediaData,\r\n self_destruct: opts.selfDestruct,\r\n destruct_after_seconds: opts.destructAfterSeconds,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/messenger/messages/${encodeURIComponent(messageId)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages/read\", {\r\n message_id: messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { bytesToHex, hexToBytes } from \"./utils.js\";\r\nimport type { WalletKeys } from \"./types.js\";\r\n\r\nexport class Wallet implements WalletKeys {\r\n public readonly publicKey: string;\r\n public readonly privateKey: string;\r\n\r\n private constructor(publicKey: string, privateKey: string) {\r\n this.publicKey = publicKey;\r\n this.privateKey = privateKey;\r\n }\r\n\r\n /**\r\n * Generate a new ML-DSA-65 keypair.\r\n * Uses crypto.getRandomValues for secure randomness.\r\n */\r\n static generate(): Wallet {\r\n const keypair = ml_dsa65.keygen();\r\n return new Wallet(\r\n bytesToHex(keypair.publicKey),\r\n bytesToHex(keypair.secretKey)\r\n );\r\n }\r\n\r\n /**\r\n * Restore a wallet from existing hex-encoded keys.\r\n */\r\n static fromKeys(publicKey: string, privateKey: string): Wallet {\r\n return new Wallet(publicKey, privateKey);\r\n }\r\n\r\n /**\r\n * Export keys as a plain object (for serialization/storage).\r\n */\r\n toJSON(): WalletKeys {\r\n return { publicKey: this.publicKey, privateKey: this.privateKey };\r\n }\r\n\r\n /**\r\n * Verify that the keypair is valid by signing and verifying a test message.\r\n */\r\n verify(): boolean {\r\n try {\r\n const msg = new TextEncoder().encode(\"rougechain-verify\");\r\n const sig = ml_dsa65.sign(msg, hexToBytes(this.privateKey));\r\n return ml_dsa65.verify(sig, msg, hexToBytes(this.publicKey));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/signer.ts","../src/client.ts","../src/wallet.ts"],"names":["ml_dsa65"],"mappings":"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","file":"index.cjs","sourcesContent":["export function hexToBytes(hex: string): Uint8Array {\r\n const bytes = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n}\r\n\r\nexport function generateNonce(): string {\r\n const bytes = crypto.getRandomValues(new Uint8Array(16));\r\n return bytesToHex(bytes);\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { hexToBytes, bytesToHex, generateNonce } from \"./utils.js\";\r\nimport type {\r\n TransactionPayload,\r\n SignedTransaction,\r\n WalletKeys,\r\n} from \"./types.js\";\r\n\r\nexport const BURN_ADDRESS =\r\n \"XRGE_BURN_0x000000000000000000000000000000000000000000000000000000000000DEAD\";\r\n\r\nfunction sortKeysDeep(obj: unknown): unknown {\r\n if (Array.isArray(obj)) return obj.map(sortKeysDeep);\r\n if (obj !== null && typeof obj === \"object\") {\r\n const sorted: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj).sort()) {\r\n sorted[key] = sortKeysDeep((obj as Record<string, unknown>)[key]);\r\n }\r\n return sorted;\r\n }\r\n return obj;\r\n}\r\n\r\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(sortKeysDeep(payload));\r\n return new TextEncoder().encode(json);\r\n}\r\n\r\nexport function signTransaction(\r\n payload: TransactionPayload,\r\n privateKey: string,\r\n publicKey: string\r\n): SignedTransaction {\r\n const payloadBytes = serializePayload(payload);\r\n const signature = ml_dsa65.sign(payloadBytes, hexToBytes(privateKey));\r\n return {\r\n payload,\r\n signature: bytesToHex(signature),\r\n public_key: publicKey,\r\n };\r\n}\r\n\r\nexport function verifyTransaction(signedTx: SignedTransaction): boolean {\r\n try {\r\n const payloadBytes = serializePayload(signedTx.payload);\r\n return ml_dsa65.verify(\r\n hexToBytes(signedTx.signature),\r\n payloadBytes,\r\n hexToBytes(signedTx.public_key)\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function isBurnAddress(address: string): boolean {\r\n return address === BURN_ADDRESS;\r\n}\r\n\r\n// ===== Transaction builders =====\r\n\r\nfunction buildAndSign(\r\n wallet: WalletKeys,\r\n payload: Omit<TransactionPayload, \"from\" | \"timestamp\" | \"nonce\">\r\n): SignedTransaction {\r\n const full: TransactionPayload = {\r\n ...payload,\r\n from: wallet.publicKey,\r\n timestamp: Date.now(),\r\n nonce: generateNonce(),\r\n } as TransactionPayload;\r\n return signTransaction(full, wallet.privateKey, wallet.publicKey);\r\n}\r\n\r\nexport function createSignedTransfer(\r\n wallet: WalletKeys,\r\n to: string,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"transfer\", to, amount, fee, token });\r\n}\r\n\r\nexport function createSignedTokenCreation(\r\n wallet: WalletKeys,\r\n tokenName: string,\r\n tokenSymbol: string,\r\n initialSupply: number,\r\n fee = 10,\r\n image?: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_token\",\r\n token_name: tokenName,\r\n token_symbol: tokenSymbol,\r\n initial_supply: initialSupply,\r\n fee,\r\n ...(image ? { image } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataUpdate(\r\n wallet: WalletKeys,\r\n tokenSymbol: string,\r\n metadata: {\r\n image?: string;\r\n description?: string;\r\n website?: string;\r\n twitter?: string;\r\n discord?: string;\r\n }\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"update_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n ...(metadata.image !== undefined ? { image: metadata.image } : {}),\r\n ...(metadata.description !== undefined ? { description: metadata.description } : {}),\r\n ...(metadata.website !== undefined ? { website: metadata.website } : {}),\r\n ...(metadata.twitter !== undefined ? { twitter: metadata.twitter } : {}),\r\n ...(metadata.discord !== undefined ? { discord: metadata.discord } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataClaim(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"claim_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n });\r\n}\r\n\r\nexport function createSignedSwap(\r\n wallet: WalletKeys,\r\n tokenIn: string,\r\n tokenOut: string,\r\n amountIn: number,\r\n minAmountOut: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"swap\",\r\n token_in: tokenIn,\r\n token_out: tokenOut,\r\n amount_in: amountIn,\r\n min_amount_out: minAmountOut,\r\n });\r\n}\r\n\r\nexport function createSignedPoolCreation(\r\n wallet: WalletKeys,\r\n tokenA: string,\r\n tokenB: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_pool\",\r\n token_a: tokenA,\r\n token_b: tokenB,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedAddLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"add_liquidity\",\r\n pool_id: poolId,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedRemoveLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n lpAmount: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"remove_liquidity\",\r\n pool_id: poolId,\r\n lp_amount: lpAmount,\r\n });\r\n}\r\n\r\nexport function createSignedStake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"stake\", amount, fee });\r\n}\r\n\r\nexport function createSignedUnstake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"unstake\", amount, fee });\r\n}\r\n\r\nexport function createSignedFaucetRequest(\r\n wallet: WalletKeys\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"faucet\" });\r\n}\r\n\r\nexport function createSignedBurn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"transfer\",\r\n to: BURN_ADDRESS,\r\n amount,\r\n fee,\r\n token,\r\n });\r\n}\r\n\r\n// ===== Bridge builders =====\r\n\r\nexport function createSignedBridgeWithdraw(\r\n wallet: WalletKeys,\r\n amount: number,\r\n evmAddress: string,\r\n tokenSymbol = \"qETH\",\r\n fee = 0.1\r\n): SignedTransaction {\r\n const evm = evmAddress.startsWith(\"0x\") ? evmAddress : `0x${evmAddress}`;\r\n return buildAndSign(wallet, {\r\n type: \"bridge_withdraw\",\r\n amount,\r\n fee,\r\n tokenSymbol,\r\n evmAddress: evm,\r\n });\r\n}\r\n\r\n// ===== NFT builders =====\r\n\r\nexport function createSignedNftCreateCollection(\r\n wallet: WalletKeys,\r\n symbol: string,\r\n name: string,\r\n opts: {\r\n maxSupply?: number;\r\n royaltyBps?: number;\r\n image?: string;\r\n description?: string;\r\n } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_create_collection\",\r\n symbol,\r\n name,\r\n fee: 50,\r\n maxSupply: opts.maxSupply,\r\n royaltyBps: opts.royaltyBps,\r\n image: opts.image,\r\n description: opts.description,\r\n });\r\n}\r\n\r\nexport function createSignedNftMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n name: string,\r\n opts: { metadataUri?: string; attributes?: unknown } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_mint\",\r\n collectionId,\r\n name,\r\n fee: 5,\r\n metadataUri: opts.metadataUri,\r\n attributes: opts.attributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftBatchMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n names: string[],\r\n opts: { uris?: string[]; batchAttributes?: unknown[] } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_batch_mint\",\r\n collectionId,\r\n names,\r\n fee: 5 * names.length,\r\n uris: opts.uris,\r\n batchAttributes: opts.batchAttributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftTransfer(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n to: string,\r\n salePrice?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_transfer\",\r\n collectionId,\r\n tokenId,\r\n to,\r\n fee: 1,\r\n salePrice,\r\n });\r\n}\r\n\r\nexport function createSignedNftBurn(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_burn\",\r\n collectionId,\r\n tokenId,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftLock(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n locked: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_lock\",\r\n collectionId,\r\n tokenId,\r\n locked,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftFreezeCollection(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n frozen: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_freeze_collection\",\r\n collectionId,\r\n frozen,\r\n fee: 0.1,\r\n });\r\n}\r\n","import {\r\n createSignedTransfer,\r\n createSignedTokenCreation,\r\n createSignedSwap,\r\n createSignedPoolCreation,\r\n createSignedAddLiquidity,\r\n createSignedRemoveLiquidity,\r\n createSignedStake,\r\n createSignedUnstake,\r\n createSignedFaucetRequest,\r\n createSignedBurn,\r\n createSignedBridgeWithdraw,\r\n createSignedNftCreateCollection,\r\n createSignedNftMint,\r\n createSignedNftBatchMint,\r\n createSignedNftTransfer,\r\n createSignedNftBurn,\r\n createSignedNftLock,\r\n createSignedNftFreezeCollection,\r\n createSignedTokenMetadataUpdate,\r\n createSignedTokenMetadataClaim,\r\n} from \"./signer.js\";\r\nimport type {\r\n WalletKeys,\r\n ApiResponse,\r\n SignedTransaction,\r\n NodeStats,\r\n Block,\r\n TokenMetadata,\r\n BalanceResponse,\r\n LiquidityPool,\r\n SwapQuote,\r\n PoolEvent,\r\n PoolStats,\r\n NftCollection,\r\n NftToken,\r\n Validator,\r\n BridgeConfig,\r\n BridgeWithdrawal,\r\n XrgeBridgeConfig,\r\n TransferParams,\r\n CreateTokenParams,\r\n SwapParams,\r\n CreatePoolParams,\r\n AddLiquidityParams,\r\n RemoveLiquidityParams,\r\n StakeParams,\r\n CreateNftCollectionParams,\r\n MintNftParams,\r\n BatchMintNftParams,\r\n TransferNftParams,\r\n BurnNftParams,\r\n LockNftParams,\r\n FreezeCollectionParams,\r\n BridgeWithdrawParams,\r\n BridgeClaimParams,\r\n XrgeBridgeClaimParams,\r\n XrgeBridgeWithdrawParams,\r\n SwapQuoteParams,\r\n TokenMetadataUpdateParams,\r\n TokenHolder,\r\n MailMessage,\r\n SendMailParams,\r\n MessengerWallet,\r\n MessengerConversation,\r\n MessengerMessage,\r\n PriceSnapshot,\r\n} from \"./types.js\";\r\n\r\ntype FetchFn = typeof globalThis.fetch;\r\n\r\nexport interface RougeChainOptions {\r\n /** Custom fetch implementation (defaults to globalThis.fetch) */\r\n fetch?: FetchFn;\r\n /** Optional API key for authenticated endpoints */\r\n apiKey?: string;\r\n}\r\n\r\nexport class RougeChain {\r\n /** @internal */ readonly baseUrl: string;\r\n /** @internal */ readonly fetchFn: FetchFn;\r\n /** @internal */ readonly headers: Record<string, string>;\r\n\r\n public readonly nft: NftClient;\r\n public readonly dex: DexClient;\r\n public readonly bridge: BridgeClient;\r\n public readonly mail: MailClient;\r\n public readonly messenger: MessengerClient;\r\n\r\n constructor(baseUrl: string, options: RougeChainOptions = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\r\n this.headers = { \"Content-Type\": \"application/json\" };\r\n if (options.apiKey) {\r\n this.headers[\"X-API-Key\"] = options.apiKey;\r\n }\r\n\r\n this.nft = new NftClient(this);\r\n this.dex = new DexClient(this);\r\n this.bridge = new BridgeClient(this);\r\n this.mail = new MailClient(this);\r\n this.messenger = new MessengerClient(this);\r\n }\r\n\r\n // ===== Internal helpers =====\r\n\r\n /** @internal */\r\n async get<T = unknown>(path: string): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n headers: this.headers,\r\n });\r\n if (!res.ok) {\r\n throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async post<T = unknown>(path: string, body: unknown): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(\r\n `POST ${path} failed: ${res.status} ${res.statusText} ${text}`\r\n );\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async submitTx(\r\n endpoint: string,\r\n signedTx: SignedTransaction\r\n ): Promise<ApiResponse> {\r\n try {\r\n const raw = await this.post<Record<string, unknown>>(endpoint, signedTx);\r\n const { success, error, ...rest } = raw;\r\n return {\r\n success: success as boolean,\r\n error: error as string | undefined,\r\n data: Object.keys(rest).length > 0 ? rest : undefined,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ===== Stats & Health =====\r\n\r\n async getStats(): Promise<NodeStats> {\r\n return this.get<NodeStats>(\"/stats\");\r\n }\r\n\r\n async getHealth(): Promise<{ status: string; chain_id: string; height: number }> {\r\n return this.get(\"/health\");\r\n }\r\n\r\n // ===== Blocks =====\r\n\r\n async getBlocks(opts: { limit?: number } = {}): Promise<Block[]> {\r\n const q = opts.limit ? `?limit=${opts.limit}` : \"\";\r\n const data = await this.get<{ blocks: Block[] }>(`/blocks${q}`);\r\n return data.blocks;\r\n }\r\n\r\n async getBlocksSummary(\r\n range: \"1h\" | \"24h\" | \"7d\" = \"24h\"\r\n ): Promise<unknown> {\r\n return this.get(`/blocks/summary?range=${range}`);\r\n }\r\n\r\n // ===== Balance =====\r\n\r\n async getBalance(publicKey: string): Promise<BalanceResponse> {\r\n return this.get<BalanceResponse>(`/balance/${publicKey}`);\r\n }\r\n\r\n async getTokenBalance(publicKey: string, token: string): Promise<number> {\r\n const data = await this.get<{ balance: number }>(\r\n `/balance/${publicKey}/${token}`\r\n );\r\n return data.balance;\r\n }\r\n\r\n // ===== Transactions =====\r\n\r\n async getTransactions(\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<unknown> {\r\n const params = new URLSearchParams();\r\n if (opts.limit) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.get(`/txs${q ? `?${q}` : \"\"}`);\r\n }\r\n\r\n // ===== Tokens =====\r\n\r\n async getTokens(): Promise<TokenMetadata[]> {\r\n const data = await this.get<{ tokens: TokenMetadata[]; success: boolean }>(\r\n \"/tokens\"\r\n );\r\n return data.tokens;\r\n }\r\n\r\n async getTokenMetadata(symbol: string): Promise<TokenMetadata> {\r\n return this.get<TokenMetadata>(`/token/${symbol}/metadata`);\r\n }\r\n\r\n async getTokenHolders(\r\n symbol: string\r\n ): Promise<TokenHolder[]> {\r\n const data = await this.get<{ holders: TokenHolder[] }>(\r\n `/token/${symbol}/holders`\r\n );\r\n return data.holders;\r\n }\r\n\r\n async getTokenTransactions(\r\n symbol: string\r\n ): Promise<unknown> {\r\n return this.get(`/token/${symbol}/transactions`);\r\n }\r\n\r\n // ===== Validators =====\r\n\r\n async getValidators(): Promise<Validator[]> {\r\n const data = await this.get<{ validators: Validator[] }>(\"/validators\");\r\n return data.validators;\r\n }\r\n\r\n async getValidatorStats(): Promise<unknown> {\r\n return this.get(\"/validators/stats\");\r\n }\r\n\r\n async getFinality(): Promise<{\r\n finalized_height: number;\r\n tip_height: number;\r\n total_stake: number;\r\n finalized_stake: number;\r\n }> {\r\n return this.get(\"/finality\");\r\n }\r\n\r\n // ===== Peers =====\r\n\r\n async getPeers(): Promise<string[]> {\r\n const data = await this.get<{ peers: string[] }>(\"/peers\");\r\n return data.peers;\r\n }\r\n\r\n // ===== Burned =====\r\n\r\n async getBurnedTokens(): Promise<{\r\n burned: Record<string, number>;\r\n total_xrge_burned: number;\r\n }> {\r\n return this.get(\"/burned\");\r\n }\r\n\r\n // ===== Write operations =====\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTransfer(\r\n wallet,\r\n params.to,\r\n params.amount,\r\n params.fee,\r\n params.token\r\n );\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async createToken(\r\n wallet: WalletKeys,\r\n params: CreateTokenParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenCreation(\r\n wallet,\r\n params.name,\r\n params.symbol,\r\n params.totalSupply,\r\n params.fee,\r\n params.image\r\n );\r\n return this.submitTx(\"/v2/token/create\", tx);\r\n }\r\n\r\n async stake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedStake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/stake\", tx);\r\n }\r\n\r\n async unstake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnstake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/unstake\", tx);\r\n }\r\n\r\n async faucet(wallet: WalletKeys): Promise<ApiResponse> {\r\n const tx = createSignedFaucetRequest(wallet);\r\n return this.submitTx(\"/v2/faucet\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedBurn(wallet, amount, fee, token);\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async updateTokenMetadata(\r\n wallet: WalletKeys,\r\n params: TokenMetadataUpdateParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataUpdate(wallet, params.symbol, {\r\n image: params.image,\r\n description: params.description,\r\n website: params.website,\r\n twitter: params.twitter,\r\n discord: params.discord,\r\n });\r\n return this.submitTx(\"/v2/token/metadata/update\", tx);\r\n }\r\n\r\n async claimTokenMetadata(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataClaim(wallet, tokenSymbol);\r\n return this.submitTx(\"/v2/token/metadata/claim\", tx);\r\n }\r\n}\r\n\r\n// ===== NFT Sub-client =====\r\n\r\nclass NftClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getCollections(): Promise<NftCollection[]> {\r\n const data = await this.rc.get<{ collections: NftCollection[] }>(\r\n \"/nft/collections\"\r\n );\r\n return data.collections;\r\n }\r\n\r\n async getCollection(collectionId: string): Promise<NftCollection> {\r\n return this.rc.get<NftCollection>(\r\n `/nft/collection/${encodeURIComponent(collectionId)}`\r\n );\r\n }\r\n\r\n /**\r\n * Poll until a collection exists on-chain (i.e. the create tx has been mined).\r\n * Useful after `createCollection` since the tx goes to the mempool first.\r\n * @returns the collection once found, or throws after the timeout.\r\n */\r\n async waitForCollection(\r\n collectionId: string,\r\n opts: { timeoutMs?: number; pollMs?: number } = {}\r\n ): Promise<NftCollection> {\r\n const timeout = opts.timeoutMs ?? 30_000;\r\n const poll = opts.pollMs ?? 1_000;\r\n const deadline = Date.now() + timeout;\r\n while (Date.now() < deadline) {\r\n try {\r\n return await this.getCollection(collectionId);\r\n } catch {\r\n await new Promise((r) => setTimeout(r, poll));\r\n }\r\n }\r\n throw new Error(\r\n `Collection \"${collectionId}\" not found after ${timeout}ms — the create transaction may not have been mined yet`\r\n );\r\n }\r\n\r\n async getTokens(\r\n collectionId: string,\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<{ tokens: NftToken[]; total: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset !== undefined) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.rc.get(\r\n `/nft/collection/${encodeURIComponent(collectionId)}/tokens${q ? `?${q}` : \"\"}`\r\n );\r\n }\r\n\r\n async getToken(\r\n collectionId: string,\r\n tokenId: number\r\n ): Promise<NftToken> {\r\n return this.rc.get<NftToken>(\r\n `/nft/token/${encodeURIComponent(collectionId)}/${tokenId}`\r\n );\r\n }\r\n\r\n async getByOwner(pubkey: string): Promise<NftToken[]> {\r\n const data = await this.rc.get<{ nfts: NftToken[] }>(\r\n `/nft/owner/${encodeURIComponent(pubkey)}`\r\n );\r\n return data.nfts;\r\n }\r\n\r\n // Write operations\r\n\r\n async createCollection(\r\n wallet: WalletKeys,\r\n params: CreateNftCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftCreateCollection(wallet, params.symbol, params.name, {\r\n maxSupply: params.maxSupply,\r\n royaltyBps: params.royaltyBps,\r\n image: params.image,\r\n description: params.description,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/collection/create\", tx);\r\n }\r\n\r\n async mint(\r\n wallet: WalletKeys,\r\n params: MintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftMint(wallet, params.collectionId, params.name, {\r\n metadataUri: params.metadataUri,\r\n attributes: params.attributes,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/mint\", tx);\r\n }\r\n\r\n async batchMint(\r\n wallet: WalletKeys,\r\n params: BatchMintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBatchMint(\r\n wallet,\r\n params.collectionId,\r\n params.names,\r\n { uris: params.uris, batchAttributes: params.batchAttributes }\r\n );\r\n return this.rc.submitTx(\"/v2/nft/batch-mint\", tx);\r\n }\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftTransfer(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.to,\r\n params.salePrice\r\n );\r\n return this.rc.submitTx(\"/v2/nft/transfer\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n params: BurnNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBurn(wallet, params.collectionId, params.tokenId);\r\n return this.rc.submitTx(\"/v2/nft/burn\", tx);\r\n }\r\n\r\n async lock(\r\n wallet: WalletKeys,\r\n params: LockNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftLock(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.locked\r\n );\r\n return this.rc.submitTx(\"/v2/nft/lock\", tx);\r\n }\r\n\r\n async freezeCollection(\r\n wallet: WalletKeys,\r\n params: FreezeCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftFreezeCollection(\r\n wallet,\r\n params.collectionId,\r\n params.frozen\r\n );\r\n return this.rc.submitTx(\"/v2/nft/freeze-collection\", tx);\r\n }\r\n}\r\n\r\n// ===== DEX Sub-client =====\r\n\r\nclass DexClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getPools(): Promise<LiquidityPool[]> {\r\n const data = await this.rc.get<{ pools: LiquidityPool[] }>(\"/pools\");\r\n return data.pools;\r\n }\r\n\r\n async getPool(poolId: string): Promise<LiquidityPool> {\r\n return this.rc.get<LiquidityPool>(`/pool/${poolId}`);\r\n }\r\n\r\n async getPoolEvents(poolId: string): Promise<PoolEvent[]> {\r\n const data = await this.rc.get<{ events: PoolEvent[] }>(\r\n `/pool/${poolId}/events`\r\n );\r\n return data.events;\r\n }\r\n\r\n async getPriceHistory(poolId: string): Promise<PriceSnapshot[]> {\r\n const data = await this.rc.get<{ prices: PriceSnapshot[] }>(\r\n `/pool/${poolId}/prices`\r\n );\r\n return data.prices;\r\n }\r\n\r\n async getPoolStats(poolId: string): Promise<PoolStats> {\r\n return this.rc.get<PoolStats>(`/pool/${poolId}/stats`);\r\n }\r\n\r\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\r\n return this.rc.post<SwapQuote>(\"/swap/quote\", {\r\n pool_id: params.poolId,\r\n token_in: params.tokenIn,\r\n token_out: params.tokenOut,\r\n amount_in: params.amountIn,\r\n });\r\n }\r\n\r\n // Write operations\r\n\r\n async swap(\r\n wallet: WalletKeys,\r\n params: SwapParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedSwap(\r\n wallet,\r\n params.tokenIn,\r\n params.tokenOut,\r\n params.amountIn,\r\n params.minAmountOut\r\n );\r\n return this.rc.submitTx(\"/v2/swap/execute\", tx);\r\n }\r\n\r\n async createPool(\r\n wallet: WalletKeys,\r\n params: CreatePoolParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedPoolCreation(\r\n wallet,\r\n params.tokenA,\r\n params.tokenB,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/create\", tx);\r\n }\r\n\r\n async addLiquidity(\r\n wallet: WalletKeys,\r\n params: AddLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedAddLiquidity(\r\n wallet,\r\n params.poolId,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/add-liquidity\", tx);\r\n }\r\n\r\n async removeLiquidity(\r\n wallet: WalletKeys,\r\n params: RemoveLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedRemoveLiquidity(wallet, params.poolId, params.lpAmount);\r\n return this.rc.submitTx(\"/v2/pool/remove-liquidity\", tx);\r\n }\r\n}\r\n\r\n// ===== Bridge Sub-client =====\r\n\r\nclass BridgeClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getConfig(): Promise<BridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n custodyAddress: data.custodyAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n supportedTokens: data.supportedTokens as string[] | undefined,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async getWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n }\r\n\r\n /** Withdraw qETH/qUSDC — signed client-side, private key never sent to server */\r\n async withdraw(\r\n wallet: WalletKeys,\r\n params: BridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const tokenSymbol = params.tokenSymbol ?? \"qETH\";\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n tokenSymbol,\r\n params.fee\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amountUnits: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n /** Claim qETH or qUSDC after depositing on Base Sepolia */\r\n async claim(params: BridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n evmSignature: params.evmSignature,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n token: params.token ?? \"ETH\",\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ── XRGE Bridge ──\r\n\r\n async getXrgeConfig(): Promise<XrgeBridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/xrge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n vaultAddress: data.vaultAddress as string | undefined,\r\n tokenAddress: data.tokenAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async claimXrge(params: XrgeBridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n amount: params.amount,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async withdrawXrge(\r\n wallet: WalletKeys,\r\n params: XrgeBridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n \"XRGE\",\r\n 0.1\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amount: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getXrgeWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n try {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/xrge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n// ===== Mail Sub-client =====\r\n\r\nclass MailClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async send(params: SendMailParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/send\", params);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getInbox(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/inbox?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getSent(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/sent?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getTrash(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/trash?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getMessage(id: string): Promise<MailMessage> {\r\n return this.rc.get<MailMessage>(`/mail/message/${encodeURIComponent(id)}`);\r\n }\r\n\r\n async move(messageId: string, folder: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/move\", {\r\n messageId,\r\n folder,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/read\", {\r\n messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async delete(id: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/mail/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Messenger Sub-client =====\r\n\r\nclass MessengerClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getWallets(): Promise<MessengerWallet[]> {\r\n const data = await this.rc.get<{ wallets: MessengerWallet[] }>(\"/messenger/wallets\");\r\n return data.wallets ?? [];\r\n }\r\n\r\n async registerWallet(opts: {\r\n id: string;\r\n displayName: string;\r\n signingPublicKey: string;\r\n encryptionPublicKey: string;\r\n }): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/wallets/register\", opts);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getConversations(\r\n walletId: string,\r\n opts: { signingPublicKey?: string; encryptionPublicKey?: string } = {}\r\n ): Promise<MessengerConversation[]> {\r\n const params = new URLSearchParams({ walletId });\r\n if (opts.signingPublicKey) params.set(\"signingPublicKey\", opts.signingPublicKey);\r\n if (opts.encryptionPublicKey) params.set(\"encryptionPublicKey\", opts.encryptionPublicKey);\r\n const data = await this.rc.get<{ conversations: MessengerConversation[] }>(\r\n `/messenger/conversations?${params.toString()}`\r\n );\r\n return data.conversations ?? [];\r\n }\r\n\r\n async createConversation(participants: string[]): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/conversations\", {\r\n participants,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getMessages(conversationId: string): Promise<MessengerMessage[]> {\r\n const data = await this.rc.get<{ messages: MessengerMessage[] }>(\r\n `/messenger/messages?conversationId=${encodeURIComponent(conversationId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async sendMessage(\r\n conversationId: string,\r\n sender: string,\r\n encryptedContent: string,\r\n opts: {\r\n mediaType?: string;\r\n mediaData?: string;\r\n selfDestruct?: boolean;\r\n destructAfterSeconds?: number;\r\n } = {}\r\n ): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages\", {\r\n conversation_id: conversationId,\r\n sender,\r\n encrypted_content: encryptedContent,\r\n media_type: opts.mediaType,\r\n media_data: opts.mediaData,\r\n self_destruct: opts.selfDestruct,\r\n destruct_after_seconds: opts.destructAfterSeconds,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/messenger/messages/${encodeURIComponent(messageId)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages/read\", {\r\n message_id: messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { bytesToHex, hexToBytes } from \"./utils.js\";\r\nimport type { WalletKeys } from \"./types.js\";\r\n\r\nexport class Wallet implements WalletKeys {\r\n public readonly publicKey: string;\r\n public readonly privateKey: string;\r\n\r\n private constructor(publicKey: string, privateKey: string) {\r\n this.publicKey = publicKey;\r\n this.privateKey = privateKey;\r\n }\r\n\r\n /**\r\n * Generate a new ML-DSA-65 keypair.\r\n * Uses crypto.getRandomValues for secure randomness.\r\n */\r\n static generate(): Wallet {\r\n const keypair = ml_dsa65.keygen();\r\n return new Wallet(\r\n bytesToHex(keypair.publicKey),\r\n bytesToHex(keypair.secretKey)\r\n );\r\n }\r\n\r\n /**\r\n * Restore a wallet from existing hex-encoded keys.\r\n */\r\n static fromKeys(publicKey: string, privateKey: string): Wallet {\r\n return new Wallet(publicKey, privateKey);\r\n }\r\n\r\n /**\r\n * Export keys as a plain object (for serialization/storage).\r\n */\r\n toJSON(): WalletKeys {\r\n return { publicKey: this.publicKey, privateKey: this.privateKey };\r\n }\r\n\r\n /**\r\n * Verify that the keypair is valid by signing and verifying a test message.\r\n */\r\n verify(): boolean {\r\n try {\r\n const msg = new TextEncoder().encode(\"rougechain-verify\");\r\n const sig = ml_dsa65.sign(msg, hexToBytes(this.privateKey));\r\n return ml_dsa65.verify(sig, msg, hexToBytes(this.publicKey));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
package/dist/index.d.cts CHANGED
@@ -157,6 +157,15 @@ interface PoolStats {
157
157
  trades_24h: number;
158
158
  tvl: number;
159
159
  }
160
+ interface PriceSnapshot {
161
+ pool_id: string;
162
+ timestamp: number;
163
+ block_height: number;
164
+ reserve_a: number;
165
+ reserve_b: number;
166
+ price_a_in_b: number;
167
+ price_b_in_a: number;
168
+ }
160
169
  interface NftCollection {
161
170
  collection_id: string;
162
171
  symbol: string;
@@ -478,7 +487,7 @@ declare class DexClient {
478
487
  getPools(): Promise<LiquidityPool[]>;
479
488
  getPool(poolId: string): Promise<LiquidityPool>;
480
489
  getPoolEvents(poolId: string): Promise<PoolEvent[]>;
481
- getPoolPrices(poolId: string): Promise<unknown>;
490
+ getPriceHistory(poolId: string): Promise<PriceSnapshot[]>;
482
491
  getPoolStats(poolId: string): Promise<PoolStats>;
483
492
  quote(params: SwapQuoteParams): Promise<SwapQuote>;
484
493
  swap(wallet: WalletKeys, params: SwapParams): Promise<ApiResponse>;
@@ -580,4 +589,4 @@ declare function hexToBytes(hex: string): Uint8Array;
580
589
  declare function bytesToHex(bytes: Uint8Array): string;
581
590
  declare function generateNonce(): string;
582
591
 
583
- export { type AddLiquidityParams, type ApiResponse, BURN_ADDRESS, type BalanceResponse, type BatchMintNftParams, type Block, type BlockHeader, type BridgeClaimParams, type BridgeConfig, type BridgeWithdrawParams, type BridgeWithdrawal, type BurnNftParams, type CreateNftCollectionParams, type CreatePoolParams, type CreateTokenParams, type FreezeCollectionParams, type LiquidityPool, type LockNftParams, type MailMessage, type MessengerConversation, type MessengerMessage, type MessengerWallet, type MintNftParams, type NftCollection, type NftToken, type NodeStats, type PoolEvent, type PoolStats, type RemoveLiquidityParams, RougeChain, type RougeChainOptions, type SendMailParams, type SignedTransaction, type StakeParams, type SwapParams, type SwapQuote, type SwapQuoteParams, type TokenHolder, type TokenMetadata, type TokenMetadataUpdateParams, type Transaction, type TransactionPayload, type TransactionType, type TransferNftParams, type TransferParams, type Validator, Wallet, type WalletKeys, type XrgeBridgeClaimParams, type XrgeBridgeConfig, type XrgeBridgeWithdrawParams, bytesToHex, createSignedBridgeWithdraw, createSignedTokenMetadataClaim, createSignedTokenMetadataUpdate, generateNonce, hexToBytes, isBurnAddress, serializePayload, signTransaction, verifyTransaction };
592
+ export { type AddLiquidityParams, type ApiResponse, BURN_ADDRESS, type BalanceResponse, type BatchMintNftParams, type Block, type BlockHeader, type BridgeClaimParams, type BridgeConfig, type BridgeWithdrawParams, type BridgeWithdrawal, type BurnNftParams, type CreateNftCollectionParams, type CreatePoolParams, type CreateTokenParams, type FreezeCollectionParams, type LiquidityPool, type LockNftParams, type MailMessage, type MessengerConversation, type MessengerMessage, type MessengerWallet, type MintNftParams, type NftCollection, type NftToken, type NodeStats, type PoolEvent, type PoolStats, type PriceSnapshot, type RemoveLiquidityParams, RougeChain, type RougeChainOptions, type SendMailParams, type SignedTransaction, type StakeParams, type SwapParams, type SwapQuote, type SwapQuoteParams, type TokenHolder, type TokenMetadata, type TokenMetadataUpdateParams, type Transaction, type TransactionPayload, type TransactionType, type TransferNftParams, type TransferParams, type Validator, Wallet, type WalletKeys, type XrgeBridgeClaimParams, type XrgeBridgeConfig, type XrgeBridgeWithdrawParams, bytesToHex, createSignedBridgeWithdraw, createSignedTokenMetadataClaim, createSignedTokenMetadataUpdate, generateNonce, hexToBytes, isBurnAddress, serializePayload, signTransaction, verifyTransaction };
package/dist/index.d.ts CHANGED
@@ -157,6 +157,15 @@ interface PoolStats {
157
157
  trades_24h: number;
158
158
  tvl: number;
159
159
  }
160
+ interface PriceSnapshot {
161
+ pool_id: string;
162
+ timestamp: number;
163
+ block_height: number;
164
+ reserve_a: number;
165
+ reserve_b: number;
166
+ price_a_in_b: number;
167
+ price_b_in_a: number;
168
+ }
160
169
  interface NftCollection {
161
170
  collection_id: string;
162
171
  symbol: string;
@@ -478,7 +487,7 @@ declare class DexClient {
478
487
  getPools(): Promise<LiquidityPool[]>;
479
488
  getPool(poolId: string): Promise<LiquidityPool>;
480
489
  getPoolEvents(poolId: string): Promise<PoolEvent[]>;
481
- getPoolPrices(poolId: string): Promise<unknown>;
490
+ getPriceHistory(poolId: string): Promise<PriceSnapshot[]>;
482
491
  getPoolStats(poolId: string): Promise<PoolStats>;
483
492
  quote(params: SwapQuoteParams): Promise<SwapQuote>;
484
493
  swap(wallet: WalletKeys, params: SwapParams): Promise<ApiResponse>;
@@ -580,4 +589,4 @@ declare function hexToBytes(hex: string): Uint8Array;
580
589
  declare function bytesToHex(bytes: Uint8Array): string;
581
590
  declare function generateNonce(): string;
582
591
 
583
- export { type AddLiquidityParams, type ApiResponse, BURN_ADDRESS, type BalanceResponse, type BatchMintNftParams, type Block, type BlockHeader, type BridgeClaimParams, type BridgeConfig, type BridgeWithdrawParams, type BridgeWithdrawal, type BurnNftParams, type CreateNftCollectionParams, type CreatePoolParams, type CreateTokenParams, type FreezeCollectionParams, type LiquidityPool, type LockNftParams, type MailMessage, type MessengerConversation, type MessengerMessage, type MessengerWallet, type MintNftParams, type NftCollection, type NftToken, type NodeStats, type PoolEvent, type PoolStats, type RemoveLiquidityParams, RougeChain, type RougeChainOptions, type SendMailParams, type SignedTransaction, type StakeParams, type SwapParams, type SwapQuote, type SwapQuoteParams, type TokenHolder, type TokenMetadata, type TokenMetadataUpdateParams, type Transaction, type TransactionPayload, type TransactionType, type TransferNftParams, type TransferParams, type Validator, Wallet, type WalletKeys, type XrgeBridgeClaimParams, type XrgeBridgeConfig, type XrgeBridgeWithdrawParams, bytesToHex, createSignedBridgeWithdraw, createSignedTokenMetadataClaim, createSignedTokenMetadataUpdate, generateNonce, hexToBytes, isBurnAddress, serializePayload, signTransaction, verifyTransaction };
592
+ export { type AddLiquidityParams, type ApiResponse, BURN_ADDRESS, type BalanceResponse, type BatchMintNftParams, type Block, type BlockHeader, type BridgeClaimParams, type BridgeConfig, type BridgeWithdrawParams, type BridgeWithdrawal, type BurnNftParams, type CreateNftCollectionParams, type CreatePoolParams, type CreateTokenParams, type FreezeCollectionParams, type LiquidityPool, type LockNftParams, type MailMessage, type MessengerConversation, type MessengerMessage, type MessengerWallet, type MintNftParams, type NftCollection, type NftToken, type NodeStats, type PoolEvent, type PoolStats, type PriceSnapshot, type RemoveLiquidityParams, RougeChain, type RougeChainOptions, type SendMailParams, type SignedTransaction, type StakeParams, type SwapParams, type SwapQuote, type SwapQuoteParams, type TokenHolder, type TokenMetadata, type TokenMetadataUpdateParams, type Transaction, type TransactionPayload, type TransactionType, type TransferNftParams, type TransferParams, type Validator, Wallet, type WalletKeys, type XrgeBridgeClaimParams, type XrgeBridgeConfig, type XrgeBridgeWithdrawParams, bytesToHex, createSignedBridgeWithdraw, createSignedTokenMetadataClaim, createSignedTokenMetadataUpdate, generateNonce, hexToBytes, isBurnAddress, serializePayload, signTransaction, verifyTransaction };
package/dist/index.js CHANGED
@@ -543,8 +543,11 @@ var DexClient = class {
543
543
  );
544
544
  return data.events;
545
545
  }
546
- async getPoolPrices(poolId) {
547
- return this.rc.get(`/pool/${poolId}/prices`);
546
+ async getPriceHistory(poolId) {
547
+ const data = await this.rc.get(
548
+ `/pool/${poolId}/prices`
549
+ );
550
+ return data.prices;
548
551
  }
549
552
  async getPoolStats(poolId) {
550
553
  return this.rc.get(`/pool/${poolId}/stats`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/signer.ts","../src/client.ts","../src/wallet.ts"],"names":["ml_dsa65"],"mappings":"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","file":"index.js","sourcesContent":["export function hexToBytes(hex: string): Uint8Array {\r\n const bytes = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n}\r\n\r\nexport function generateNonce(): string {\r\n const bytes = crypto.getRandomValues(new Uint8Array(16));\r\n return bytesToHex(bytes);\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { hexToBytes, bytesToHex, generateNonce } from \"./utils.js\";\r\nimport type {\r\n TransactionPayload,\r\n SignedTransaction,\r\n WalletKeys,\r\n} from \"./types.js\";\r\n\r\nexport const BURN_ADDRESS =\r\n \"XRGE_BURN_0x000000000000000000000000000000000000000000000000000000000000DEAD\";\r\n\r\nfunction sortKeysDeep(obj: unknown): unknown {\r\n if (Array.isArray(obj)) return obj.map(sortKeysDeep);\r\n if (obj !== null && typeof obj === \"object\") {\r\n const sorted: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj).sort()) {\r\n sorted[key] = sortKeysDeep((obj as Record<string, unknown>)[key]);\r\n }\r\n return sorted;\r\n }\r\n return obj;\r\n}\r\n\r\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(sortKeysDeep(payload));\r\n return new TextEncoder().encode(json);\r\n}\r\n\r\nexport function signTransaction(\r\n payload: TransactionPayload,\r\n privateKey: string,\r\n publicKey: string\r\n): SignedTransaction {\r\n const payloadBytes = serializePayload(payload);\r\n const signature = ml_dsa65.sign(payloadBytes, hexToBytes(privateKey));\r\n return {\r\n payload,\r\n signature: bytesToHex(signature),\r\n public_key: publicKey,\r\n };\r\n}\r\n\r\nexport function verifyTransaction(signedTx: SignedTransaction): boolean {\r\n try {\r\n const payloadBytes = serializePayload(signedTx.payload);\r\n return ml_dsa65.verify(\r\n hexToBytes(signedTx.signature),\r\n payloadBytes,\r\n hexToBytes(signedTx.public_key)\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function isBurnAddress(address: string): boolean {\r\n return address === BURN_ADDRESS;\r\n}\r\n\r\n// ===== Transaction builders =====\r\n\r\nfunction buildAndSign(\r\n wallet: WalletKeys,\r\n payload: Omit<TransactionPayload, \"from\" | \"timestamp\" | \"nonce\">\r\n): SignedTransaction {\r\n const full: TransactionPayload = {\r\n ...payload,\r\n from: wallet.publicKey,\r\n timestamp: Date.now(),\r\n nonce: generateNonce(),\r\n } as TransactionPayload;\r\n return signTransaction(full, wallet.privateKey, wallet.publicKey);\r\n}\r\n\r\nexport function createSignedTransfer(\r\n wallet: WalletKeys,\r\n to: string,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"transfer\", to, amount, fee, token });\r\n}\r\n\r\nexport function createSignedTokenCreation(\r\n wallet: WalletKeys,\r\n tokenName: string,\r\n tokenSymbol: string,\r\n initialSupply: number,\r\n fee = 10,\r\n image?: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_token\",\r\n token_name: tokenName,\r\n token_symbol: tokenSymbol,\r\n initial_supply: initialSupply,\r\n fee,\r\n ...(image ? { image } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataUpdate(\r\n wallet: WalletKeys,\r\n tokenSymbol: string,\r\n metadata: {\r\n image?: string;\r\n description?: string;\r\n website?: string;\r\n twitter?: string;\r\n discord?: string;\r\n }\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"update_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n ...(metadata.image !== undefined ? { image: metadata.image } : {}),\r\n ...(metadata.description !== undefined ? { description: metadata.description } : {}),\r\n ...(metadata.website !== undefined ? { website: metadata.website } : {}),\r\n ...(metadata.twitter !== undefined ? { twitter: metadata.twitter } : {}),\r\n ...(metadata.discord !== undefined ? { discord: metadata.discord } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataClaim(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"claim_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n });\r\n}\r\n\r\nexport function createSignedSwap(\r\n wallet: WalletKeys,\r\n tokenIn: string,\r\n tokenOut: string,\r\n amountIn: number,\r\n minAmountOut: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"swap\",\r\n token_in: tokenIn,\r\n token_out: tokenOut,\r\n amount_in: amountIn,\r\n min_amount_out: minAmountOut,\r\n });\r\n}\r\n\r\nexport function createSignedPoolCreation(\r\n wallet: WalletKeys,\r\n tokenA: string,\r\n tokenB: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_pool\",\r\n token_a: tokenA,\r\n token_b: tokenB,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedAddLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"add_liquidity\",\r\n pool_id: poolId,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedRemoveLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n lpAmount: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"remove_liquidity\",\r\n pool_id: poolId,\r\n lp_amount: lpAmount,\r\n });\r\n}\r\n\r\nexport function createSignedStake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"stake\", amount, fee });\r\n}\r\n\r\nexport function createSignedUnstake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"unstake\", amount, fee });\r\n}\r\n\r\nexport function createSignedFaucetRequest(\r\n wallet: WalletKeys\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"faucet\" });\r\n}\r\n\r\nexport function createSignedBurn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"transfer\",\r\n to: BURN_ADDRESS,\r\n amount,\r\n fee,\r\n token,\r\n });\r\n}\r\n\r\n// ===== Bridge builders =====\r\n\r\nexport function createSignedBridgeWithdraw(\r\n wallet: WalletKeys,\r\n amount: number,\r\n evmAddress: string,\r\n tokenSymbol = \"qETH\",\r\n fee = 0.1\r\n): SignedTransaction {\r\n const evm = evmAddress.startsWith(\"0x\") ? evmAddress : `0x${evmAddress}`;\r\n return buildAndSign(wallet, {\r\n type: \"bridge_withdraw\",\r\n amount,\r\n fee,\r\n tokenSymbol,\r\n evmAddress: evm,\r\n });\r\n}\r\n\r\n// ===== NFT builders =====\r\n\r\nexport function createSignedNftCreateCollection(\r\n wallet: WalletKeys,\r\n symbol: string,\r\n name: string,\r\n opts: {\r\n maxSupply?: number;\r\n royaltyBps?: number;\r\n image?: string;\r\n description?: string;\r\n } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_create_collection\",\r\n symbol,\r\n name,\r\n fee: 50,\r\n maxSupply: opts.maxSupply,\r\n royaltyBps: opts.royaltyBps,\r\n image: opts.image,\r\n description: opts.description,\r\n });\r\n}\r\n\r\nexport function createSignedNftMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n name: string,\r\n opts: { metadataUri?: string; attributes?: unknown } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_mint\",\r\n collectionId,\r\n name,\r\n fee: 5,\r\n metadataUri: opts.metadataUri,\r\n attributes: opts.attributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftBatchMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n names: string[],\r\n opts: { uris?: string[]; batchAttributes?: unknown[] } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_batch_mint\",\r\n collectionId,\r\n names,\r\n fee: 5 * names.length,\r\n uris: opts.uris,\r\n batchAttributes: opts.batchAttributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftTransfer(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n to: string,\r\n salePrice?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_transfer\",\r\n collectionId,\r\n tokenId,\r\n to,\r\n fee: 1,\r\n salePrice,\r\n });\r\n}\r\n\r\nexport function createSignedNftBurn(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_burn\",\r\n collectionId,\r\n tokenId,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftLock(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n locked: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_lock\",\r\n collectionId,\r\n tokenId,\r\n locked,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftFreezeCollection(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n frozen: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_freeze_collection\",\r\n collectionId,\r\n frozen,\r\n fee: 0.1,\r\n });\r\n}\r\n","import {\r\n createSignedTransfer,\r\n createSignedTokenCreation,\r\n createSignedSwap,\r\n createSignedPoolCreation,\r\n createSignedAddLiquidity,\r\n createSignedRemoveLiquidity,\r\n createSignedStake,\r\n createSignedUnstake,\r\n createSignedFaucetRequest,\r\n createSignedBurn,\r\n createSignedBridgeWithdraw,\r\n createSignedNftCreateCollection,\r\n createSignedNftMint,\r\n createSignedNftBatchMint,\r\n createSignedNftTransfer,\r\n createSignedNftBurn,\r\n createSignedNftLock,\r\n createSignedNftFreezeCollection,\r\n createSignedTokenMetadataUpdate,\r\n createSignedTokenMetadataClaim,\r\n} from \"./signer.js\";\r\nimport type {\r\n WalletKeys,\r\n ApiResponse,\r\n SignedTransaction,\r\n NodeStats,\r\n Block,\r\n TokenMetadata,\r\n BalanceResponse,\r\n LiquidityPool,\r\n SwapQuote,\r\n PoolEvent,\r\n PoolStats,\r\n NftCollection,\r\n NftToken,\r\n Validator,\r\n BridgeConfig,\r\n BridgeWithdrawal,\r\n XrgeBridgeConfig,\r\n TransferParams,\r\n CreateTokenParams,\r\n SwapParams,\r\n CreatePoolParams,\r\n AddLiquidityParams,\r\n RemoveLiquidityParams,\r\n StakeParams,\r\n CreateNftCollectionParams,\r\n MintNftParams,\r\n BatchMintNftParams,\r\n TransferNftParams,\r\n BurnNftParams,\r\n LockNftParams,\r\n FreezeCollectionParams,\r\n BridgeWithdrawParams,\r\n BridgeClaimParams,\r\n XrgeBridgeClaimParams,\r\n XrgeBridgeWithdrawParams,\r\n SwapQuoteParams,\r\n TokenMetadataUpdateParams,\r\n TokenHolder,\r\n MailMessage,\r\n SendMailParams,\r\n MessengerWallet,\r\n MessengerConversation,\r\n MessengerMessage,\r\n} from \"./types.js\";\r\n\r\ntype FetchFn = typeof globalThis.fetch;\r\n\r\nexport interface RougeChainOptions {\r\n /** Custom fetch implementation (defaults to globalThis.fetch) */\r\n fetch?: FetchFn;\r\n /** Optional API key for authenticated endpoints */\r\n apiKey?: string;\r\n}\r\n\r\nexport class RougeChain {\r\n /** @internal */ readonly baseUrl: string;\r\n /** @internal */ readonly fetchFn: FetchFn;\r\n /** @internal */ readonly headers: Record<string, string>;\r\n\r\n public readonly nft: NftClient;\r\n public readonly dex: DexClient;\r\n public readonly bridge: BridgeClient;\r\n public readonly mail: MailClient;\r\n public readonly messenger: MessengerClient;\r\n\r\n constructor(baseUrl: string, options: RougeChainOptions = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\r\n this.headers = { \"Content-Type\": \"application/json\" };\r\n if (options.apiKey) {\r\n this.headers[\"X-API-Key\"] = options.apiKey;\r\n }\r\n\r\n this.nft = new NftClient(this);\r\n this.dex = new DexClient(this);\r\n this.bridge = new BridgeClient(this);\r\n this.mail = new MailClient(this);\r\n this.messenger = new MessengerClient(this);\r\n }\r\n\r\n // ===== Internal helpers =====\r\n\r\n /** @internal */\r\n async get<T = unknown>(path: string): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n headers: this.headers,\r\n });\r\n if (!res.ok) {\r\n throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async post<T = unknown>(path: string, body: unknown): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(\r\n `POST ${path} failed: ${res.status} ${res.statusText} ${text}`\r\n );\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async submitTx(\r\n endpoint: string,\r\n signedTx: SignedTransaction\r\n ): Promise<ApiResponse> {\r\n try {\r\n const raw = await this.post<Record<string, unknown>>(endpoint, signedTx);\r\n const { success, error, ...rest } = raw;\r\n return {\r\n success: success as boolean,\r\n error: error as string | undefined,\r\n data: Object.keys(rest).length > 0 ? rest : undefined,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ===== Stats & Health =====\r\n\r\n async getStats(): Promise<NodeStats> {\r\n return this.get<NodeStats>(\"/stats\");\r\n }\r\n\r\n async getHealth(): Promise<{ status: string; chain_id: string; height: number }> {\r\n return this.get(\"/health\");\r\n }\r\n\r\n // ===== Blocks =====\r\n\r\n async getBlocks(opts: { limit?: number } = {}): Promise<Block[]> {\r\n const q = opts.limit ? `?limit=${opts.limit}` : \"\";\r\n const data = await this.get<{ blocks: Block[] }>(`/blocks${q}`);\r\n return data.blocks;\r\n }\r\n\r\n async getBlocksSummary(\r\n range: \"1h\" | \"24h\" | \"7d\" = \"24h\"\r\n ): Promise<unknown> {\r\n return this.get(`/blocks/summary?range=${range}`);\r\n }\r\n\r\n // ===== Balance =====\r\n\r\n async getBalance(publicKey: string): Promise<BalanceResponse> {\r\n return this.get<BalanceResponse>(`/balance/${publicKey}`);\r\n }\r\n\r\n async getTokenBalance(publicKey: string, token: string): Promise<number> {\r\n const data = await this.get<{ balance: number }>(\r\n `/balance/${publicKey}/${token}`\r\n );\r\n return data.balance;\r\n }\r\n\r\n // ===== Transactions =====\r\n\r\n async getTransactions(\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<unknown> {\r\n const params = new URLSearchParams();\r\n if (opts.limit) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.get(`/txs${q ? `?${q}` : \"\"}`);\r\n }\r\n\r\n // ===== Tokens =====\r\n\r\n async getTokens(): Promise<TokenMetadata[]> {\r\n const data = await this.get<{ tokens: TokenMetadata[]; success: boolean }>(\r\n \"/tokens\"\r\n );\r\n return data.tokens;\r\n }\r\n\r\n async getTokenMetadata(symbol: string): Promise<TokenMetadata> {\r\n return this.get<TokenMetadata>(`/token/${symbol}/metadata`);\r\n }\r\n\r\n async getTokenHolders(\r\n symbol: string\r\n ): Promise<TokenHolder[]> {\r\n const data = await this.get<{ holders: TokenHolder[] }>(\r\n `/token/${symbol}/holders`\r\n );\r\n return data.holders;\r\n }\r\n\r\n async getTokenTransactions(\r\n symbol: string\r\n ): Promise<unknown> {\r\n return this.get(`/token/${symbol}/transactions`);\r\n }\r\n\r\n // ===== Validators =====\r\n\r\n async getValidators(): Promise<Validator[]> {\r\n const data = await this.get<{ validators: Validator[] }>(\"/validators\");\r\n return data.validators;\r\n }\r\n\r\n async getValidatorStats(): Promise<unknown> {\r\n return this.get(\"/validators/stats\");\r\n }\r\n\r\n async getFinality(): Promise<{\r\n finalized_height: number;\r\n tip_height: number;\r\n total_stake: number;\r\n finalized_stake: number;\r\n }> {\r\n return this.get(\"/finality\");\r\n }\r\n\r\n // ===== Peers =====\r\n\r\n async getPeers(): Promise<string[]> {\r\n const data = await this.get<{ peers: string[] }>(\"/peers\");\r\n return data.peers;\r\n }\r\n\r\n // ===== Burned =====\r\n\r\n async getBurnedTokens(): Promise<{\r\n burned: Record<string, number>;\r\n total_xrge_burned: number;\r\n }> {\r\n return this.get(\"/burned\");\r\n }\r\n\r\n // ===== Write operations =====\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTransfer(\r\n wallet,\r\n params.to,\r\n params.amount,\r\n params.fee,\r\n params.token\r\n );\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async createToken(\r\n wallet: WalletKeys,\r\n params: CreateTokenParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenCreation(\r\n wallet,\r\n params.name,\r\n params.symbol,\r\n params.totalSupply,\r\n params.fee,\r\n params.image\r\n );\r\n return this.submitTx(\"/v2/token/create\", tx);\r\n }\r\n\r\n async stake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedStake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/stake\", tx);\r\n }\r\n\r\n async unstake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnstake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/unstake\", tx);\r\n }\r\n\r\n async faucet(wallet: WalletKeys): Promise<ApiResponse> {\r\n const tx = createSignedFaucetRequest(wallet);\r\n return this.submitTx(\"/v2/faucet\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedBurn(wallet, amount, fee, token);\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async updateTokenMetadata(\r\n wallet: WalletKeys,\r\n params: TokenMetadataUpdateParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataUpdate(wallet, params.symbol, {\r\n image: params.image,\r\n description: params.description,\r\n website: params.website,\r\n twitter: params.twitter,\r\n discord: params.discord,\r\n });\r\n return this.submitTx(\"/v2/token/metadata/update\", tx);\r\n }\r\n\r\n async claimTokenMetadata(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataClaim(wallet, tokenSymbol);\r\n return this.submitTx(\"/v2/token/metadata/claim\", tx);\r\n }\r\n}\r\n\r\n// ===== NFT Sub-client =====\r\n\r\nclass NftClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getCollections(): Promise<NftCollection[]> {\r\n const data = await this.rc.get<{ collections: NftCollection[] }>(\r\n \"/nft/collections\"\r\n );\r\n return data.collections;\r\n }\r\n\r\n async getCollection(collectionId: string): Promise<NftCollection> {\r\n return this.rc.get<NftCollection>(\r\n `/nft/collection/${encodeURIComponent(collectionId)}`\r\n );\r\n }\r\n\r\n /**\r\n * Poll until a collection exists on-chain (i.e. the create tx has been mined).\r\n * Useful after `createCollection` since the tx goes to the mempool first.\r\n * @returns the collection once found, or throws after the timeout.\r\n */\r\n async waitForCollection(\r\n collectionId: string,\r\n opts: { timeoutMs?: number; pollMs?: number } = {}\r\n ): Promise<NftCollection> {\r\n const timeout = opts.timeoutMs ?? 30_000;\r\n const poll = opts.pollMs ?? 1_000;\r\n const deadline = Date.now() + timeout;\r\n while (Date.now() < deadline) {\r\n try {\r\n return await this.getCollection(collectionId);\r\n } catch {\r\n await new Promise((r) => setTimeout(r, poll));\r\n }\r\n }\r\n throw new Error(\r\n `Collection \"${collectionId}\" not found after ${timeout}ms — the create transaction may not have been mined yet`\r\n );\r\n }\r\n\r\n async getTokens(\r\n collectionId: string,\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<{ tokens: NftToken[]; total: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset !== undefined) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.rc.get(\r\n `/nft/collection/${encodeURIComponent(collectionId)}/tokens${q ? `?${q}` : \"\"}`\r\n );\r\n }\r\n\r\n async getToken(\r\n collectionId: string,\r\n tokenId: number\r\n ): Promise<NftToken> {\r\n return this.rc.get<NftToken>(\r\n `/nft/token/${encodeURIComponent(collectionId)}/${tokenId}`\r\n );\r\n }\r\n\r\n async getByOwner(pubkey: string): Promise<NftToken[]> {\r\n const data = await this.rc.get<{ nfts: NftToken[] }>(\r\n `/nft/owner/${encodeURIComponent(pubkey)}`\r\n );\r\n return data.nfts;\r\n }\r\n\r\n // Write operations\r\n\r\n async createCollection(\r\n wallet: WalletKeys,\r\n params: CreateNftCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftCreateCollection(wallet, params.symbol, params.name, {\r\n maxSupply: params.maxSupply,\r\n royaltyBps: params.royaltyBps,\r\n image: params.image,\r\n description: params.description,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/collection/create\", tx);\r\n }\r\n\r\n async mint(\r\n wallet: WalletKeys,\r\n params: MintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftMint(wallet, params.collectionId, params.name, {\r\n metadataUri: params.metadataUri,\r\n attributes: params.attributes,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/mint\", tx);\r\n }\r\n\r\n async batchMint(\r\n wallet: WalletKeys,\r\n params: BatchMintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBatchMint(\r\n wallet,\r\n params.collectionId,\r\n params.names,\r\n { uris: params.uris, batchAttributes: params.batchAttributes }\r\n );\r\n return this.rc.submitTx(\"/v2/nft/batch-mint\", tx);\r\n }\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftTransfer(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.to,\r\n params.salePrice\r\n );\r\n return this.rc.submitTx(\"/v2/nft/transfer\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n params: BurnNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBurn(wallet, params.collectionId, params.tokenId);\r\n return this.rc.submitTx(\"/v2/nft/burn\", tx);\r\n }\r\n\r\n async lock(\r\n wallet: WalletKeys,\r\n params: LockNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftLock(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.locked\r\n );\r\n return this.rc.submitTx(\"/v2/nft/lock\", tx);\r\n }\r\n\r\n async freezeCollection(\r\n wallet: WalletKeys,\r\n params: FreezeCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftFreezeCollection(\r\n wallet,\r\n params.collectionId,\r\n params.frozen\r\n );\r\n return this.rc.submitTx(\"/v2/nft/freeze-collection\", tx);\r\n }\r\n}\r\n\r\n// ===== DEX Sub-client =====\r\n\r\nclass DexClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getPools(): Promise<LiquidityPool[]> {\r\n const data = await this.rc.get<{ pools: LiquidityPool[] }>(\"/pools\");\r\n return data.pools;\r\n }\r\n\r\n async getPool(poolId: string): Promise<LiquidityPool> {\r\n return this.rc.get<LiquidityPool>(`/pool/${poolId}`);\r\n }\r\n\r\n async getPoolEvents(poolId: string): Promise<PoolEvent[]> {\r\n const data = await this.rc.get<{ events: PoolEvent[] }>(\r\n `/pool/${poolId}/events`\r\n );\r\n return data.events;\r\n }\r\n\r\n async getPoolPrices(poolId: string): Promise<unknown> {\r\n return this.rc.get(`/pool/${poolId}/prices`);\r\n }\r\n\r\n async getPoolStats(poolId: string): Promise<PoolStats> {\r\n return this.rc.get<PoolStats>(`/pool/${poolId}/stats`);\r\n }\r\n\r\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\r\n return this.rc.post<SwapQuote>(\"/swap/quote\", {\r\n pool_id: params.poolId,\r\n token_in: params.tokenIn,\r\n token_out: params.tokenOut,\r\n amount_in: params.amountIn,\r\n });\r\n }\r\n\r\n // Write operations\r\n\r\n async swap(\r\n wallet: WalletKeys,\r\n params: SwapParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedSwap(\r\n wallet,\r\n params.tokenIn,\r\n params.tokenOut,\r\n params.amountIn,\r\n params.minAmountOut\r\n );\r\n return this.rc.submitTx(\"/v2/swap/execute\", tx);\r\n }\r\n\r\n async createPool(\r\n wallet: WalletKeys,\r\n params: CreatePoolParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedPoolCreation(\r\n wallet,\r\n params.tokenA,\r\n params.tokenB,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/create\", tx);\r\n }\r\n\r\n async addLiquidity(\r\n wallet: WalletKeys,\r\n params: AddLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedAddLiquidity(\r\n wallet,\r\n params.poolId,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/add-liquidity\", tx);\r\n }\r\n\r\n async removeLiquidity(\r\n wallet: WalletKeys,\r\n params: RemoveLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedRemoveLiquidity(wallet, params.poolId, params.lpAmount);\r\n return this.rc.submitTx(\"/v2/pool/remove-liquidity\", tx);\r\n }\r\n}\r\n\r\n// ===== Bridge Sub-client =====\r\n\r\nclass BridgeClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getConfig(): Promise<BridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n custodyAddress: data.custodyAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n supportedTokens: data.supportedTokens as string[] | undefined,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async getWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n }\r\n\r\n /** Withdraw qETH/qUSDC — signed client-side, private key never sent to server */\r\n async withdraw(\r\n wallet: WalletKeys,\r\n params: BridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const tokenSymbol = params.tokenSymbol ?? \"qETH\";\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n tokenSymbol,\r\n params.fee\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amountUnits: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n /** Claim qETH or qUSDC after depositing on Base Sepolia */\r\n async claim(params: BridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n evmSignature: params.evmSignature,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n token: params.token ?? \"ETH\",\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ── XRGE Bridge ──\r\n\r\n async getXrgeConfig(): Promise<XrgeBridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/xrge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n vaultAddress: data.vaultAddress as string | undefined,\r\n tokenAddress: data.tokenAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async claimXrge(params: XrgeBridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n amount: params.amount,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async withdrawXrge(\r\n wallet: WalletKeys,\r\n params: XrgeBridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n \"XRGE\",\r\n 0.1\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amount: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getXrgeWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n try {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/xrge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n// ===== Mail Sub-client =====\r\n\r\nclass MailClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async send(params: SendMailParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/send\", params);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getInbox(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/inbox?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getSent(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/sent?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getTrash(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/trash?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getMessage(id: string): Promise<MailMessage> {\r\n return this.rc.get<MailMessage>(`/mail/message/${encodeURIComponent(id)}`);\r\n }\r\n\r\n async move(messageId: string, folder: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/move\", {\r\n messageId,\r\n folder,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/read\", {\r\n messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async delete(id: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/mail/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Messenger Sub-client =====\r\n\r\nclass MessengerClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getWallets(): Promise<MessengerWallet[]> {\r\n const data = await this.rc.get<{ wallets: MessengerWallet[] }>(\"/messenger/wallets\");\r\n return data.wallets ?? [];\r\n }\r\n\r\n async registerWallet(opts: {\r\n id: string;\r\n displayName: string;\r\n signingPublicKey: string;\r\n encryptionPublicKey: string;\r\n }): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/wallets/register\", opts);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getConversations(\r\n walletId: string,\r\n opts: { signingPublicKey?: string; encryptionPublicKey?: string } = {}\r\n ): Promise<MessengerConversation[]> {\r\n const params = new URLSearchParams({ walletId });\r\n if (opts.signingPublicKey) params.set(\"signingPublicKey\", opts.signingPublicKey);\r\n if (opts.encryptionPublicKey) params.set(\"encryptionPublicKey\", opts.encryptionPublicKey);\r\n const data = await this.rc.get<{ conversations: MessengerConversation[] }>(\r\n `/messenger/conversations?${params.toString()}`\r\n );\r\n return data.conversations ?? [];\r\n }\r\n\r\n async createConversation(participants: string[]): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/conversations\", {\r\n participants,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getMessages(conversationId: string): Promise<MessengerMessage[]> {\r\n const data = await this.rc.get<{ messages: MessengerMessage[] }>(\r\n `/messenger/messages?conversationId=${encodeURIComponent(conversationId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async sendMessage(\r\n conversationId: string,\r\n sender: string,\r\n encryptedContent: string,\r\n opts: {\r\n mediaType?: string;\r\n mediaData?: string;\r\n selfDestruct?: boolean;\r\n destructAfterSeconds?: number;\r\n } = {}\r\n ): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages\", {\r\n conversation_id: conversationId,\r\n sender,\r\n encrypted_content: encryptedContent,\r\n media_type: opts.mediaType,\r\n media_data: opts.mediaData,\r\n self_destruct: opts.selfDestruct,\r\n destruct_after_seconds: opts.destructAfterSeconds,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/messenger/messages/${encodeURIComponent(messageId)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages/read\", {\r\n message_id: messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { bytesToHex, hexToBytes } from \"./utils.js\";\r\nimport type { WalletKeys } from \"./types.js\";\r\n\r\nexport class Wallet implements WalletKeys {\r\n public readonly publicKey: string;\r\n public readonly privateKey: string;\r\n\r\n private constructor(publicKey: string, privateKey: string) {\r\n this.publicKey = publicKey;\r\n this.privateKey = privateKey;\r\n }\r\n\r\n /**\r\n * Generate a new ML-DSA-65 keypair.\r\n * Uses crypto.getRandomValues for secure randomness.\r\n */\r\n static generate(): Wallet {\r\n const keypair = ml_dsa65.keygen();\r\n return new Wallet(\r\n bytesToHex(keypair.publicKey),\r\n bytesToHex(keypair.secretKey)\r\n );\r\n }\r\n\r\n /**\r\n * Restore a wallet from existing hex-encoded keys.\r\n */\r\n static fromKeys(publicKey: string, privateKey: string): Wallet {\r\n return new Wallet(publicKey, privateKey);\r\n }\r\n\r\n /**\r\n * Export keys as a plain object (for serialization/storage).\r\n */\r\n toJSON(): WalletKeys {\r\n return { publicKey: this.publicKey, privateKey: this.privateKey };\r\n }\r\n\r\n /**\r\n * Verify that the keypair is valid by signing and verifying a test message.\r\n */\r\n verify(): boolean {\r\n try {\r\n const msg = new TextEncoder().encode(\"rougechain-verify\");\r\n const sig = ml_dsa65.sign(msg, hexToBytes(this.privateKey));\r\n return ml_dsa65.verify(sig, msg, hexToBytes(this.publicKey));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/signer.ts","../src/client.ts","../src/wallet.ts"],"names":["ml_dsa65"],"mappings":"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","file":"index.js","sourcesContent":["export function hexToBytes(hex: string): Uint8Array {\r\n const bytes = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n}\r\n\r\nexport function generateNonce(): string {\r\n const bytes = crypto.getRandomValues(new Uint8Array(16));\r\n return bytesToHex(bytes);\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { hexToBytes, bytesToHex, generateNonce } from \"./utils.js\";\r\nimport type {\r\n TransactionPayload,\r\n SignedTransaction,\r\n WalletKeys,\r\n} from \"./types.js\";\r\n\r\nexport const BURN_ADDRESS =\r\n \"XRGE_BURN_0x000000000000000000000000000000000000000000000000000000000000DEAD\";\r\n\r\nfunction sortKeysDeep(obj: unknown): unknown {\r\n if (Array.isArray(obj)) return obj.map(sortKeysDeep);\r\n if (obj !== null && typeof obj === \"object\") {\r\n const sorted: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj).sort()) {\r\n sorted[key] = sortKeysDeep((obj as Record<string, unknown>)[key]);\r\n }\r\n return sorted;\r\n }\r\n return obj;\r\n}\r\n\r\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(sortKeysDeep(payload));\r\n return new TextEncoder().encode(json);\r\n}\r\n\r\nexport function signTransaction(\r\n payload: TransactionPayload,\r\n privateKey: string,\r\n publicKey: string\r\n): SignedTransaction {\r\n const payloadBytes = serializePayload(payload);\r\n const signature = ml_dsa65.sign(payloadBytes, hexToBytes(privateKey));\r\n return {\r\n payload,\r\n signature: bytesToHex(signature),\r\n public_key: publicKey,\r\n };\r\n}\r\n\r\nexport function verifyTransaction(signedTx: SignedTransaction): boolean {\r\n try {\r\n const payloadBytes = serializePayload(signedTx.payload);\r\n return ml_dsa65.verify(\r\n hexToBytes(signedTx.signature),\r\n payloadBytes,\r\n hexToBytes(signedTx.public_key)\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function isBurnAddress(address: string): boolean {\r\n return address === BURN_ADDRESS;\r\n}\r\n\r\n// ===== Transaction builders =====\r\n\r\nfunction buildAndSign(\r\n wallet: WalletKeys,\r\n payload: Omit<TransactionPayload, \"from\" | \"timestamp\" | \"nonce\">\r\n): SignedTransaction {\r\n const full: TransactionPayload = {\r\n ...payload,\r\n from: wallet.publicKey,\r\n timestamp: Date.now(),\r\n nonce: generateNonce(),\r\n } as TransactionPayload;\r\n return signTransaction(full, wallet.privateKey, wallet.publicKey);\r\n}\r\n\r\nexport function createSignedTransfer(\r\n wallet: WalletKeys,\r\n to: string,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"transfer\", to, amount, fee, token });\r\n}\r\n\r\nexport function createSignedTokenCreation(\r\n wallet: WalletKeys,\r\n tokenName: string,\r\n tokenSymbol: string,\r\n initialSupply: number,\r\n fee = 10,\r\n image?: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_token\",\r\n token_name: tokenName,\r\n token_symbol: tokenSymbol,\r\n initial_supply: initialSupply,\r\n fee,\r\n ...(image ? { image } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataUpdate(\r\n wallet: WalletKeys,\r\n tokenSymbol: string,\r\n metadata: {\r\n image?: string;\r\n description?: string;\r\n website?: string;\r\n twitter?: string;\r\n discord?: string;\r\n }\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"update_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n ...(metadata.image !== undefined ? { image: metadata.image } : {}),\r\n ...(metadata.description !== undefined ? { description: metadata.description } : {}),\r\n ...(metadata.website !== undefined ? { website: metadata.website } : {}),\r\n ...(metadata.twitter !== undefined ? { twitter: metadata.twitter } : {}),\r\n ...(metadata.discord !== undefined ? { discord: metadata.discord } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataClaim(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"claim_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n });\r\n}\r\n\r\nexport function createSignedSwap(\r\n wallet: WalletKeys,\r\n tokenIn: string,\r\n tokenOut: string,\r\n amountIn: number,\r\n minAmountOut: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"swap\",\r\n token_in: tokenIn,\r\n token_out: tokenOut,\r\n amount_in: amountIn,\r\n min_amount_out: minAmountOut,\r\n });\r\n}\r\n\r\nexport function createSignedPoolCreation(\r\n wallet: WalletKeys,\r\n tokenA: string,\r\n tokenB: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_pool\",\r\n token_a: tokenA,\r\n token_b: tokenB,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedAddLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"add_liquidity\",\r\n pool_id: poolId,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedRemoveLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n lpAmount: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"remove_liquidity\",\r\n pool_id: poolId,\r\n lp_amount: lpAmount,\r\n });\r\n}\r\n\r\nexport function createSignedStake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"stake\", amount, fee });\r\n}\r\n\r\nexport function createSignedUnstake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"unstake\", amount, fee });\r\n}\r\n\r\nexport function createSignedFaucetRequest(\r\n wallet: WalletKeys\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"faucet\" });\r\n}\r\n\r\nexport function createSignedBurn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"transfer\",\r\n to: BURN_ADDRESS,\r\n amount,\r\n fee,\r\n token,\r\n });\r\n}\r\n\r\n// ===== Bridge builders =====\r\n\r\nexport function createSignedBridgeWithdraw(\r\n wallet: WalletKeys,\r\n amount: number,\r\n evmAddress: string,\r\n tokenSymbol = \"qETH\",\r\n fee = 0.1\r\n): SignedTransaction {\r\n const evm = evmAddress.startsWith(\"0x\") ? evmAddress : `0x${evmAddress}`;\r\n return buildAndSign(wallet, {\r\n type: \"bridge_withdraw\",\r\n amount,\r\n fee,\r\n tokenSymbol,\r\n evmAddress: evm,\r\n });\r\n}\r\n\r\n// ===== NFT builders =====\r\n\r\nexport function createSignedNftCreateCollection(\r\n wallet: WalletKeys,\r\n symbol: string,\r\n name: string,\r\n opts: {\r\n maxSupply?: number;\r\n royaltyBps?: number;\r\n image?: string;\r\n description?: string;\r\n } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_create_collection\",\r\n symbol,\r\n name,\r\n fee: 50,\r\n maxSupply: opts.maxSupply,\r\n royaltyBps: opts.royaltyBps,\r\n image: opts.image,\r\n description: opts.description,\r\n });\r\n}\r\n\r\nexport function createSignedNftMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n name: string,\r\n opts: { metadataUri?: string; attributes?: unknown } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_mint\",\r\n collectionId,\r\n name,\r\n fee: 5,\r\n metadataUri: opts.metadataUri,\r\n attributes: opts.attributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftBatchMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n names: string[],\r\n opts: { uris?: string[]; batchAttributes?: unknown[] } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_batch_mint\",\r\n collectionId,\r\n names,\r\n fee: 5 * names.length,\r\n uris: opts.uris,\r\n batchAttributes: opts.batchAttributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftTransfer(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n to: string,\r\n salePrice?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_transfer\",\r\n collectionId,\r\n tokenId,\r\n to,\r\n fee: 1,\r\n salePrice,\r\n });\r\n}\r\n\r\nexport function createSignedNftBurn(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_burn\",\r\n collectionId,\r\n tokenId,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftLock(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n locked: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_lock\",\r\n collectionId,\r\n tokenId,\r\n locked,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftFreezeCollection(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n frozen: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_freeze_collection\",\r\n collectionId,\r\n frozen,\r\n fee: 0.1,\r\n });\r\n}\r\n","import {\r\n createSignedTransfer,\r\n createSignedTokenCreation,\r\n createSignedSwap,\r\n createSignedPoolCreation,\r\n createSignedAddLiquidity,\r\n createSignedRemoveLiquidity,\r\n createSignedStake,\r\n createSignedUnstake,\r\n createSignedFaucetRequest,\r\n createSignedBurn,\r\n createSignedBridgeWithdraw,\r\n createSignedNftCreateCollection,\r\n createSignedNftMint,\r\n createSignedNftBatchMint,\r\n createSignedNftTransfer,\r\n createSignedNftBurn,\r\n createSignedNftLock,\r\n createSignedNftFreezeCollection,\r\n createSignedTokenMetadataUpdate,\r\n createSignedTokenMetadataClaim,\r\n} from \"./signer.js\";\r\nimport type {\r\n WalletKeys,\r\n ApiResponse,\r\n SignedTransaction,\r\n NodeStats,\r\n Block,\r\n TokenMetadata,\r\n BalanceResponse,\r\n LiquidityPool,\r\n SwapQuote,\r\n PoolEvent,\r\n PoolStats,\r\n NftCollection,\r\n NftToken,\r\n Validator,\r\n BridgeConfig,\r\n BridgeWithdrawal,\r\n XrgeBridgeConfig,\r\n TransferParams,\r\n CreateTokenParams,\r\n SwapParams,\r\n CreatePoolParams,\r\n AddLiquidityParams,\r\n RemoveLiquidityParams,\r\n StakeParams,\r\n CreateNftCollectionParams,\r\n MintNftParams,\r\n BatchMintNftParams,\r\n TransferNftParams,\r\n BurnNftParams,\r\n LockNftParams,\r\n FreezeCollectionParams,\r\n BridgeWithdrawParams,\r\n BridgeClaimParams,\r\n XrgeBridgeClaimParams,\r\n XrgeBridgeWithdrawParams,\r\n SwapQuoteParams,\r\n TokenMetadataUpdateParams,\r\n TokenHolder,\r\n MailMessage,\r\n SendMailParams,\r\n MessengerWallet,\r\n MessengerConversation,\r\n MessengerMessage,\r\n PriceSnapshot,\r\n} from \"./types.js\";\r\n\r\ntype FetchFn = typeof globalThis.fetch;\r\n\r\nexport interface RougeChainOptions {\r\n /** Custom fetch implementation (defaults to globalThis.fetch) */\r\n fetch?: FetchFn;\r\n /** Optional API key for authenticated endpoints */\r\n apiKey?: string;\r\n}\r\n\r\nexport class RougeChain {\r\n /** @internal */ readonly baseUrl: string;\r\n /** @internal */ readonly fetchFn: FetchFn;\r\n /** @internal */ readonly headers: Record<string, string>;\r\n\r\n public readonly nft: NftClient;\r\n public readonly dex: DexClient;\r\n public readonly bridge: BridgeClient;\r\n public readonly mail: MailClient;\r\n public readonly messenger: MessengerClient;\r\n\r\n constructor(baseUrl: string, options: RougeChainOptions = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\r\n this.headers = { \"Content-Type\": \"application/json\" };\r\n if (options.apiKey) {\r\n this.headers[\"X-API-Key\"] = options.apiKey;\r\n }\r\n\r\n this.nft = new NftClient(this);\r\n this.dex = new DexClient(this);\r\n this.bridge = new BridgeClient(this);\r\n this.mail = new MailClient(this);\r\n this.messenger = new MessengerClient(this);\r\n }\r\n\r\n // ===== Internal helpers =====\r\n\r\n /** @internal */\r\n async get<T = unknown>(path: string): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n headers: this.headers,\r\n });\r\n if (!res.ok) {\r\n throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async post<T = unknown>(path: string, body: unknown): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(\r\n `POST ${path} failed: ${res.status} ${res.statusText} ${text}`\r\n );\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async submitTx(\r\n endpoint: string,\r\n signedTx: SignedTransaction\r\n ): Promise<ApiResponse> {\r\n try {\r\n const raw = await this.post<Record<string, unknown>>(endpoint, signedTx);\r\n const { success, error, ...rest } = raw;\r\n return {\r\n success: success as boolean,\r\n error: error as string | undefined,\r\n data: Object.keys(rest).length > 0 ? rest : undefined,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ===== Stats & Health =====\r\n\r\n async getStats(): Promise<NodeStats> {\r\n return this.get<NodeStats>(\"/stats\");\r\n }\r\n\r\n async getHealth(): Promise<{ status: string; chain_id: string; height: number }> {\r\n return this.get(\"/health\");\r\n }\r\n\r\n // ===== Blocks =====\r\n\r\n async getBlocks(opts: { limit?: number } = {}): Promise<Block[]> {\r\n const q = opts.limit ? `?limit=${opts.limit}` : \"\";\r\n const data = await this.get<{ blocks: Block[] }>(`/blocks${q}`);\r\n return data.blocks;\r\n }\r\n\r\n async getBlocksSummary(\r\n range: \"1h\" | \"24h\" | \"7d\" = \"24h\"\r\n ): Promise<unknown> {\r\n return this.get(`/blocks/summary?range=${range}`);\r\n }\r\n\r\n // ===== Balance =====\r\n\r\n async getBalance(publicKey: string): Promise<BalanceResponse> {\r\n return this.get<BalanceResponse>(`/balance/${publicKey}`);\r\n }\r\n\r\n async getTokenBalance(publicKey: string, token: string): Promise<number> {\r\n const data = await this.get<{ balance: number }>(\r\n `/balance/${publicKey}/${token}`\r\n );\r\n return data.balance;\r\n }\r\n\r\n // ===== Transactions =====\r\n\r\n async getTransactions(\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<unknown> {\r\n const params = new URLSearchParams();\r\n if (opts.limit) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.get(`/txs${q ? `?${q}` : \"\"}`);\r\n }\r\n\r\n // ===== Tokens =====\r\n\r\n async getTokens(): Promise<TokenMetadata[]> {\r\n const data = await this.get<{ tokens: TokenMetadata[]; success: boolean }>(\r\n \"/tokens\"\r\n );\r\n return data.tokens;\r\n }\r\n\r\n async getTokenMetadata(symbol: string): Promise<TokenMetadata> {\r\n return this.get<TokenMetadata>(`/token/${symbol}/metadata`);\r\n }\r\n\r\n async getTokenHolders(\r\n symbol: string\r\n ): Promise<TokenHolder[]> {\r\n const data = await this.get<{ holders: TokenHolder[] }>(\r\n `/token/${symbol}/holders`\r\n );\r\n return data.holders;\r\n }\r\n\r\n async getTokenTransactions(\r\n symbol: string\r\n ): Promise<unknown> {\r\n return this.get(`/token/${symbol}/transactions`);\r\n }\r\n\r\n // ===== Validators =====\r\n\r\n async getValidators(): Promise<Validator[]> {\r\n const data = await this.get<{ validators: Validator[] }>(\"/validators\");\r\n return data.validators;\r\n }\r\n\r\n async getValidatorStats(): Promise<unknown> {\r\n return this.get(\"/validators/stats\");\r\n }\r\n\r\n async getFinality(): Promise<{\r\n finalized_height: number;\r\n tip_height: number;\r\n total_stake: number;\r\n finalized_stake: number;\r\n }> {\r\n return this.get(\"/finality\");\r\n }\r\n\r\n // ===== Peers =====\r\n\r\n async getPeers(): Promise<string[]> {\r\n const data = await this.get<{ peers: string[] }>(\"/peers\");\r\n return data.peers;\r\n }\r\n\r\n // ===== Burned =====\r\n\r\n async getBurnedTokens(): Promise<{\r\n burned: Record<string, number>;\r\n total_xrge_burned: number;\r\n }> {\r\n return this.get(\"/burned\");\r\n }\r\n\r\n // ===== Write operations =====\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTransfer(\r\n wallet,\r\n params.to,\r\n params.amount,\r\n params.fee,\r\n params.token\r\n );\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async createToken(\r\n wallet: WalletKeys,\r\n params: CreateTokenParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenCreation(\r\n wallet,\r\n params.name,\r\n params.symbol,\r\n params.totalSupply,\r\n params.fee,\r\n params.image\r\n );\r\n return this.submitTx(\"/v2/token/create\", tx);\r\n }\r\n\r\n async stake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedStake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/stake\", tx);\r\n }\r\n\r\n async unstake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnstake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/unstake\", tx);\r\n }\r\n\r\n async faucet(wallet: WalletKeys): Promise<ApiResponse> {\r\n const tx = createSignedFaucetRequest(wallet);\r\n return this.submitTx(\"/v2/faucet\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedBurn(wallet, amount, fee, token);\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async updateTokenMetadata(\r\n wallet: WalletKeys,\r\n params: TokenMetadataUpdateParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataUpdate(wallet, params.symbol, {\r\n image: params.image,\r\n description: params.description,\r\n website: params.website,\r\n twitter: params.twitter,\r\n discord: params.discord,\r\n });\r\n return this.submitTx(\"/v2/token/metadata/update\", tx);\r\n }\r\n\r\n async claimTokenMetadata(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataClaim(wallet, tokenSymbol);\r\n return this.submitTx(\"/v2/token/metadata/claim\", tx);\r\n }\r\n}\r\n\r\n// ===== NFT Sub-client =====\r\n\r\nclass NftClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getCollections(): Promise<NftCollection[]> {\r\n const data = await this.rc.get<{ collections: NftCollection[] }>(\r\n \"/nft/collections\"\r\n );\r\n return data.collections;\r\n }\r\n\r\n async getCollection(collectionId: string): Promise<NftCollection> {\r\n return this.rc.get<NftCollection>(\r\n `/nft/collection/${encodeURIComponent(collectionId)}`\r\n );\r\n }\r\n\r\n /**\r\n * Poll until a collection exists on-chain (i.e. the create tx has been mined).\r\n * Useful after `createCollection` since the tx goes to the mempool first.\r\n * @returns the collection once found, or throws after the timeout.\r\n */\r\n async waitForCollection(\r\n collectionId: string,\r\n opts: { timeoutMs?: number; pollMs?: number } = {}\r\n ): Promise<NftCollection> {\r\n const timeout = opts.timeoutMs ?? 30_000;\r\n const poll = opts.pollMs ?? 1_000;\r\n const deadline = Date.now() + timeout;\r\n while (Date.now() < deadline) {\r\n try {\r\n return await this.getCollection(collectionId);\r\n } catch {\r\n await new Promise((r) => setTimeout(r, poll));\r\n }\r\n }\r\n throw new Error(\r\n `Collection \"${collectionId}\" not found after ${timeout}ms — the create transaction may not have been mined yet`\r\n );\r\n }\r\n\r\n async getTokens(\r\n collectionId: string,\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<{ tokens: NftToken[]; total: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset !== undefined) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.rc.get(\r\n `/nft/collection/${encodeURIComponent(collectionId)}/tokens${q ? `?${q}` : \"\"}`\r\n );\r\n }\r\n\r\n async getToken(\r\n collectionId: string,\r\n tokenId: number\r\n ): Promise<NftToken> {\r\n return this.rc.get<NftToken>(\r\n `/nft/token/${encodeURIComponent(collectionId)}/${tokenId}`\r\n );\r\n }\r\n\r\n async getByOwner(pubkey: string): Promise<NftToken[]> {\r\n const data = await this.rc.get<{ nfts: NftToken[] }>(\r\n `/nft/owner/${encodeURIComponent(pubkey)}`\r\n );\r\n return data.nfts;\r\n }\r\n\r\n // Write operations\r\n\r\n async createCollection(\r\n wallet: WalletKeys,\r\n params: CreateNftCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftCreateCollection(wallet, params.symbol, params.name, {\r\n maxSupply: params.maxSupply,\r\n royaltyBps: params.royaltyBps,\r\n image: params.image,\r\n description: params.description,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/collection/create\", tx);\r\n }\r\n\r\n async mint(\r\n wallet: WalletKeys,\r\n params: MintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftMint(wallet, params.collectionId, params.name, {\r\n metadataUri: params.metadataUri,\r\n attributes: params.attributes,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/mint\", tx);\r\n }\r\n\r\n async batchMint(\r\n wallet: WalletKeys,\r\n params: BatchMintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBatchMint(\r\n wallet,\r\n params.collectionId,\r\n params.names,\r\n { uris: params.uris, batchAttributes: params.batchAttributes }\r\n );\r\n return this.rc.submitTx(\"/v2/nft/batch-mint\", tx);\r\n }\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftTransfer(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.to,\r\n params.salePrice\r\n );\r\n return this.rc.submitTx(\"/v2/nft/transfer\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n params: BurnNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBurn(wallet, params.collectionId, params.tokenId);\r\n return this.rc.submitTx(\"/v2/nft/burn\", tx);\r\n }\r\n\r\n async lock(\r\n wallet: WalletKeys,\r\n params: LockNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftLock(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.locked\r\n );\r\n return this.rc.submitTx(\"/v2/nft/lock\", tx);\r\n }\r\n\r\n async freezeCollection(\r\n wallet: WalletKeys,\r\n params: FreezeCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftFreezeCollection(\r\n wallet,\r\n params.collectionId,\r\n params.frozen\r\n );\r\n return this.rc.submitTx(\"/v2/nft/freeze-collection\", tx);\r\n }\r\n}\r\n\r\n// ===== DEX Sub-client =====\r\n\r\nclass DexClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getPools(): Promise<LiquidityPool[]> {\r\n const data = await this.rc.get<{ pools: LiquidityPool[] }>(\"/pools\");\r\n return data.pools;\r\n }\r\n\r\n async getPool(poolId: string): Promise<LiquidityPool> {\r\n return this.rc.get<LiquidityPool>(`/pool/${poolId}`);\r\n }\r\n\r\n async getPoolEvents(poolId: string): Promise<PoolEvent[]> {\r\n const data = await this.rc.get<{ events: PoolEvent[] }>(\r\n `/pool/${poolId}/events`\r\n );\r\n return data.events;\r\n }\r\n\r\n async getPriceHistory(poolId: string): Promise<PriceSnapshot[]> {\r\n const data = await this.rc.get<{ prices: PriceSnapshot[] }>(\r\n `/pool/${poolId}/prices`\r\n );\r\n return data.prices;\r\n }\r\n\r\n async getPoolStats(poolId: string): Promise<PoolStats> {\r\n return this.rc.get<PoolStats>(`/pool/${poolId}/stats`);\r\n }\r\n\r\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\r\n return this.rc.post<SwapQuote>(\"/swap/quote\", {\r\n pool_id: params.poolId,\r\n token_in: params.tokenIn,\r\n token_out: params.tokenOut,\r\n amount_in: params.amountIn,\r\n });\r\n }\r\n\r\n // Write operations\r\n\r\n async swap(\r\n wallet: WalletKeys,\r\n params: SwapParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedSwap(\r\n wallet,\r\n params.tokenIn,\r\n params.tokenOut,\r\n params.amountIn,\r\n params.minAmountOut\r\n );\r\n return this.rc.submitTx(\"/v2/swap/execute\", tx);\r\n }\r\n\r\n async createPool(\r\n wallet: WalletKeys,\r\n params: CreatePoolParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedPoolCreation(\r\n wallet,\r\n params.tokenA,\r\n params.tokenB,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/create\", tx);\r\n }\r\n\r\n async addLiquidity(\r\n wallet: WalletKeys,\r\n params: AddLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedAddLiquidity(\r\n wallet,\r\n params.poolId,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/add-liquidity\", tx);\r\n }\r\n\r\n async removeLiquidity(\r\n wallet: WalletKeys,\r\n params: RemoveLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedRemoveLiquidity(wallet, params.poolId, params.lpAmount);\r\n return this.rc.submitTx(\"/v2/pool/remove-liquidity\", tx);\r\n }\r\n}\r\n\r\n// ===== Bridge Sub-client =====\r\n\r\nclass BridgeClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getConfig(): Promise<BridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n custodyAddress: data.custodyAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n supportedTokens: data.supportedTokens as string[] | undefined,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async getWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n }\r\n\r\n /** Withdraw qETH/qUSDC — signed client-side, private key never sent to server */\r\n async withdraw(\r\n wallet: WalletKeys,\r\n params: BridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const tokenSymbol = params.tokenSymbol ?? \"qETH\";\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n tokenSymbol,\r\n params.fee\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amountUnits: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n /** Claim qETH or qUSDC after depositing on Base Sepolia */\r\n async claim(params: BridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n evmSignature: params.evmSignature,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n token: params.token ?? \"ETH\",\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ── XRGE Bridge ──\r\n\r\n async getXrgeConfig(): Promise<XrgeBridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/xrge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n vaultAddress: data.vaultAddress as string | undefined,\r\n tokenAddress: data.tokenAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async claimXrge(params: XrgeBridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n amount: params.amount,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async withdrawXrge(\r\n wallet: WalletKeys,\r\n params: XrgeBridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n \"XRGE\",\r\n 0.1\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amount: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getXrgeWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n try {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/xrge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n// ===== Mail Sub-client =====\r\n\r\nclass MailClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async send(params: SendMailParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/send\", params);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getInbox(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/inbox?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getSent(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/sent?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getTrash(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/trash?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getMessage(id: string): Promise<MailMessage> {\r\n return this.rc.get<MailMessage>(`/mail/message/${encodeURIComponent(id)}`);\r\n }\r\n\r\n async move(messageId: string, folder: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/move\", {\r\n messageId,\r\n folder,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/read\", {\r\n messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async delete(id: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/mail/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Messenger Sub-client =====\r\n\r\nclass MessengerClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getWallets(): Promise<MessengerWallet[]> {\r\n const data = await this.rc.get<{ wallets: MessengerWallet[] }>(\"/messenger/wallets\");\r\n return data.wallets ?? [];\r\n }\r\n\r\n async registerWallet(opts: {\r\n id: string;\r\n displayName: string;\r\n signingPublicKey: string;\r\n encryptionPublicKey: string;\r\n }): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/wallets/register\", opts);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getConversations(\r\n walletId: string,\r\n opts: { signingPublicKey?: string; encryptionPublicKey?: string } = {}\r\n ): Promise<MessengerConversation[]> {\r\n const params = new URLSearchParams({ walletId });\r\n if (opts.signingPublicKey) params.set(\"signingPublicKey\", opts.signingPublicKey);\r\n if (opts.encryptionPublicKey) params.set(\"encryptionPublicKey\", opts.encryptionPublicKey);\r\n const data = await this.rc.get<{ conversations: MessengerConversation[] }>(\r\n `/messenger/conversations?${params.toString()}`\r\n );\r\n return data.conversations ?? [];\r\n }\r\n\r\n async createConversation(participants: string[]): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/conversations\", {\r\n participants,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getMessages(conversationId: string): Promise<MessengerMessage[]> {\r\n const data = await this.rc.get<{ messages: MessengerMessage[] }>(\r\n `/messenger/messages?conversationId=${encodeURIComponent(conversationId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async sendMessage(\r\n conversationId: string,\r\n sender: string,\r\n encryptedContent: string,\r\n opts: {\r\n mediaType?: string;\r\n mediaData?: string;\r\n selfDestruct?: boolean;\r\n destructAfterSeconds?: number;\r\n } = {}\r\n ): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages\", {\r\n conversation_id: conversationId,\r\n sender,\r\n encrypted_content: encryptedContent,\r\n media_type: opts.mediaType,\r\n media_data: opts.mediaData,\r\n self_destruct: opts.selfDestruct,\r\n destruct_after_seconds: opts.destructAfterSeconds,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/messenger/messages/${encodeURIComponent(messageId)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages/read\", {\r\n message_id: messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { bytesToHex, hexToBytes } from \"./utils.js\";\r\nimport type { WalletKeys } from \"./types.js\";\r\n\r\nexport class Wallet implements WalletKeys {\r\n public readonly publicKey: string;\r\n public readonly privateKey: string;\r\n\r\n private constructor(publicKey: string, privateKey: string) {\r\n this.publicKey = publicKey;\r\n this.privateKey = privateKey;\r\n }\r\n\r\n /**\r\n * Generate a new ML-DSA-65 keypair.\r\n * Uses crypto.getRandomValues for secure randomness.\r\n */\r\n static generate(): Wallet {\r\n const keypair = ml_dsa65.keygen();\r\n return new Wallet(\r\n bytesToHex(keypair.publicKey),\r\n bytesToHex(keypair.secretKey)\r\n );\r\n }\r\n\r\n /**\r\n * Restore a wallet from existing hex-encoded keys.\r\n */\r\n static fromKeys(publicKey: string, privateKey: string): Wallet {\r\n return new Wallet(publicKey, privateKey);\r\n }\r\n\r\n /**\r\n * Export keys as a plain object (for serialization/storage).\r\n */\r\n toJSON(): WalletKeys {\r\n return { publicKey: this.publicKey, privateKey: this.privateKey };\r\n }\r\n\r\n /**\r\n * Verify that the keypair is valid by signing and verifying a test message.\r\n */\r\n verify(): boolean {\r\n try {\r\n const msg = new TextEncoder().encode(\"rougechain-verify\");\r\n const sig = ml_dsa65.sign(msg, hexToBytes(this.privateKey));\r\n return ml_dsa65.verify(sig, msg, hexToBytes(this.publicKey));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rougechain/sdk",
3
- "version": "0.3.6",
3
+ "version": "0.3.7",
4
4
  "description": "Official SDK for RougeChain — post-quantum Layer 1 blockchain secured by ML-DSA-65",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",