@rougechain/sdk 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ function serializePayload(payload) {
26
26
  }
27
27
  function signTransaction(payload, privateKey, publicKey) {
28
28
  const payloadBytes = serializePayload(payload);
29
- const signature = ml_dsa65.sign(hexToBytes(privateKey), payloadBytes);
29
+ const signature = ml_dsa65.sign(payloadBytes, hexToBytes(privateKey));
30
30
  return {
31
31
  payload,
32
32
  signature: bytesToHex(signature),
@@ -37,9 +37,9 @@ function verifyTransaction(signedTx) {
37
37
  try {
38
38
  const payloadBytes = serializePayload(signedTx.payload);
39
39
  return ml_dsa65.verify(
40
- hexToBytes(signedTx.public_key),
40
+ hexToBytes(signedTx.signature),
41
41
  payloadBytes,
42
- hexToBytes(signedTx.signature)
42
+ hexToBytes(signedTx.public_key)
43
43
  );
44
44
  } catch {
45
45
  return false;
@@ -120,6 +120,16 @@ function createSignedBurn(wallet, amount, fee = 1, token = "XRGE") {
120
120
  token
121
121
  });
122
122
  }
123
+ function createSignedBridgeWithdraw(wallet, amount, evmAddress, tokenSymbol = "qETH", fee = 0.1) {
124
+ const evm = evmAddress.startsWith("0x") ? evmAddress : `0x${evmAddress}`;
125
+ return buildAndSign(wallet, {
126
+ type: "bridge_withdraw",
127
+ amount,
128
+ fee,
129
+ tokenSymbol,
130
+ evmAddress: evm
131
+ });
132
+ }
123
133
  function createSignedNftCreateCollection(wallet, symbol, name, opts = {}) {
124
134
  return buildAndSign(wallet, {
125
135
  type: "nft_create_collection",
@@ -200,6 +210,8 @@ var RougeChain = class {
200
210
  this.nft = new NftClient(this);
201
211
  this.dex = new DexClient(this);
202
212
  this.bridge = new BridgeClient(this);
213
+ this.mail = new MailClient(this);
214
+ this.messenger = new MessengerClient(this);
203
215
  }
204
216
  // ===== Internal helpers =====
205
217
  /** @internal */
@@ -545,7 +557,8 @@ var BridgeClient = class {
545
557
  return {
546
558
  enabled: data.enabled === true,
547
559
  custodyAddress: data.custodyAddress,
548
- chainId: data.chainId ?? 84532
560
+ chainId: data.chainId ?? 84532,
561
+ supportedTokens: data.supportedTokens
549
562
  };
550
563
  } catch {
551
564
  return { enabled: false, chainId: 84532 };
@@ -557,17 +570,25 @@ var BridgeClient = class {
557
570
  );
558
571
  return data.withdrawals;
559
572
  }
573
+ /** Withdraw qETH/qUSDC — signed client-side, private key never sent to server */
560
574
  async withdraw(wallet, params) {
561
575
  try {
562
- const evm = params.evmAddress.startsWith("0x") ? params.evmAddress : `0x${params.evmAddress}`;
576
+ const tokenSymbol = params.tokenSymbol ?? "qETH";
577
+ const signed = createSignedBridgeWithdraw(
578
+ wallet,
579
+ params.amount,
580
+ params.evmAddress,
581
+ tokenSymbol,
582
+ params.fee
583
+ );
563
584
  const data = await this.rc.post(
564
585
  "/bridge/withdraw",
565
586
  {
566
- fromPrivateKey: wallet.privateKey,
567
587
  fromPublicKey: wallet.publicKey,
568
588
  amountUnits: params.amount,
569
- evmAddress: evm,
570
- fee: params.fee
589
+ evmAddress: signed.payload.evmAddress,
590
+ signature: signed.signature,
591
+ payload: signed.payload
571
592
  }
572
593
  );
573
594
  return {
@@ -582,6 +603,7 @@ var BridgeClient = class {
582
603
  };
583
604
  }
584
605
  }
606
+ /** Claim qETH or qUSDC after depositing on Base Sepolia */
585
607
  async claim(params) {
586
608
  try {
587
609
  const data = await this.rc.post(
@@ -590,7 +612,8 @@ var BridgeClient = class {
590
612
  evmTxHash: params.evmTxHash.startsWith("0x") ? params.evmTxHash : `0x${params.evmTxHash}`,
591
613
  evmAddress: params.evmAddress.startsWith("0x") ? params.evmAddress : `0x${params.evmAddress}`,
592
614
  evmSignature: params.evmSignature,
593
- recipientRougechainPubkey: params.recipientPubkey
615
+ recipientRougechainPubkey: params.recipientPubkey,
616
+ token: params.token ?? "ETH"
594
617
  }
595
618
  );
596
619
  return {
@@ -605,6 +628,213 @@ var BridgeClient = class {
605
628
  };
606
629
  }
607
630
  }
631
+ // ── XRGE Bridge ──
632
+ async getXrgeConfig() {
633
+ try {
634
+ const data = await this.rc.get("/bridge/xrge/config");
635
+ return {
636
+ enabled: data.enabled === true,
637
+ vaultAddress: data.vaultAddress,
638
+ tokenAddress: data.tokenAddress,
639
+ chainId: data.chainId ?? 84532
640
+ };
641
+ } catch {
642
+ return { enabled: false, chainId: 84532 };
643
+ }
644
+ }
645
+ async claimXrge(params) {
646
+ try {
647
+ const data = await this.rc.post(
648
+ "/bridge/xrge/claim",
649
+ {
650
+ evmTxHash: params.evmTxHash.startsWith("0x") ? params.evmTxHash : `0x${params.evmTxHash}`,
651
+ evmAddress: params.evmAddress.startsWith("0x") ? params.evmAddress : `0x${params.evmAddress}`,
652
+ amount: params.amount,
653
+ recipientRougechainPubkey: params.recipientPubkey
654
+ }
655
+ );
656
+ return {
657
+ success: data.success === true,
658
+ error: data.error,
659
+ data
660
+ };
661
+ } catch (e) {
662
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
663
+ }
664
+ }
665
+ async withdrawXrge(wallet, params) {
666
+ try {
667
+ const signed = createSignedBridgeWithdraw(
668
+ wallet,
669
+ params.amount,
670
+ params.evmAddress,
671
+ "XRGE",
672
+ 0.1
673
+ );
674
+ const data = await this.rc.post(
675
+ "/bridge/xrge/withdraw",
676
+ {
677
+ fromPublicKey: wallet.publicKey,
678
+ amount: params.amount,
679
+ evmAddress: signed.payload.evmAddress,
680
+ signature: signed.signature,
681
+ payload: signed.payload
682
+ }
683
+ );
684
+ return {
685
+ success: data.success === true,
686
+ error: data.error,
687
+ data
688
+ };
689
+ } catch (e) {
690
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
691
+ }
692
+ }
693
+ async getXrgeWithdrawals() {
694
+ try {
695
+ const data = await this.rc.get(
696
+ "/bridge/xrge/withdrawals"
697
+ );
698
+ return data.withdrawals;
699
+ } catch {
700
+ return [];
701
+ }
702
+ }
703
+ };
704
+ var MailClient = class {
705
+ constructor(rc) {
706
+ this.rc = rc;
707
+ }
708
+ async send(params) {
709
+ try {
710
+ const data = await this.rc.post("/mail/send", params);
711
+ return { success: data.success === true, error: data.error, data };
712
+ } catch (e) {
713
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
714
+ }
715
+ }
716
+ async getInbox(walletId) {
717
+ const data = await this.rc.get(
718
+ `/mail/inbox?walletId=${encodeURIComponent(walletId)}`
719
+ );
720
+ return data.messages ?? [];
721
+ }
722
+ async getSent(walletId) {
723
+ const data = await this.rc.get(
724
+ `/mail/sent?walletId=${encodeURIComponent(walletId)}`
725
+ );
726
+ return data.messages ?? [];
727
+ }
728
+ async getTrash(walletId) {
729
+ const data = await this.rc.get(
730
+ `/mail/trash?walletId=${encodeURIComponent(walletId)}`
731
+ );
732
+ return data.messages ?? [];
733
+ }
734
+ async getMessage(id) {
735
+ return this.rc.get(`/mail/message/${encodeURIComponent(id)}`);
736
+ }
737
+ async move(messageId, folder) {
738
+ try {
739
+ const data = await this.rc.post("/mail/move", {
740
+ messageId,
741
+ folder
742
+ });
743
+ return { success: data.success === true, error: data.error };
744
+ } catch (e) {
745
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
746
+ }
747
+ }
748
+ async markRead(messageId) {
749
+ try {
750
+ const data = await this.rc.post("/mail/read", {
751
+ messageId
752
+ });
753
+ return { success: data.success === true, error: data.error };
754
+ } catch (e) {
755
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
756
+ }
757
+ }
758
+ async delete(id) {
759
+ try {
760
+ const res = await this.rc.fetchFn(
761
+ `${this.rc.baseUrl}/mail/${encodeURIComponent(id)}`,
762
+ { method: "DELETE", headers: this.rc.headers }
763
+ );
764
+ const data = await res.json();
765
+ return { success: data.success === true, error: data.error };
766
+ } catch (e) {
767
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
768
+ }
769
+ }
770
+ };
771
+ var MessengerClient = class {
772
+ constructor(rc) {
773
+ this.rc = rc;
774
+ }
775
+ async getWallets() {
776
+ const data = await this.rc.get("/messenger/wallets");
777
+ return data.wallets ?? [];
778
+ }
779
+ async registerWallet(walletId, displayName, encryptionPublicKey) {
780
+ try {
781
+ const data = await this.rc.post("/messenger/wallets/register", {
782
+ wallet_id: walletId,
783
+ display_name: displayName,
784
+ encryption_public_key: encryptionPublicKey
785
+ });
786
+ return { success: data.success === true, error: data.error };
787
+ } catch (e) {
788
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
789
+ }
790
+ }
791
+ async getConversations(walletId) {
792
+ const data = await this.rc.get(
793
+ `/messenger/conversations?walletId=${encodeURIComponent(walletId)}`
794
+ );
795
+ return data.conversations ?? [];
796
+ }
797
+ async createConversation(participants) {
798
+ try {
799
+ const data = await this.rc.post("/messenger/conversations", {
800
+ participants
801
+ });
802
+ return { success: data.success === true, error: data.error, data };
803
+ } catch (e) {
804
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
805
+ }
806
+ }
807
+ async getMessages(conversationId) {
808
+ const data = await this.rc.get(
809
+ `/messenger/messages?conversationId=${encodeURIComponent(conversationId)}`
810
+ );
811
+ return data.messages ?? [];
812
+ }
813
+ async sendMessage(conversationId, sender, encryptedContent, opts = {}) {
814
+ try {
815
+ const data = await this.rc.post("/messenger/messages", {
816
+ conversation_id: conversationId,
817
+ sender,
818
+ encrypted_content: encryptedContent,
819
+ media_type: opts.mediaType,
820
+ media_data: opts.mediaData,
821
+ self_destruct: opts.selfDestruct
822
+ });
823
+ return { success: data.success === true, error: data.error, data };
824
+ } catch (e) {
825
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
826
+ }
827
+ }
828
+ async markRead(messageId) {
829
+ try {
830
+ const data = await this.rc.post("/messenger/messages/read", {
831
+ message_id: messageId
832
+ });
833
+ return { success: data.success === true, error: data.error };
834
+ } catch (e) {
835
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
836
+ }
837
+ }
608
838
  };
609
839
  var Wallet = class _Wallet {
610
840
  constructor(publicKey, privateKey) {
@@ -640,14 +870,14 @@ var Wallet = class _Wallet {
640
870
  verify() {
641
871
  try {
642
872
  const msg = new TextEncoder().encode("rougechain-verify");
643
- const sig = ml_dsa65.sign(hexToBytes(this.privateKey), msg);
644
- return ml_dsa65.verify(hexToBytes(this.publicKey), msg, sig);
873
+ const sig = ml_dsa65.sign(msg, hexToBytes(this.privateKey));
874
+ return ml_dsa65.verify(sig, msg, hexToBytes(this.publicKey));
645
875
  } catch {
646
876
  return false;
647
877
  }
648
878
  }
649
879
  };
650
880
 
651
- export { BURN_ADDRESS, RougeChain, Wallet, bytesToHex, generateNonce, hexToBytes, isBurnAddress, serializePayload, signTransaction, verifyTransaction };
881
+ export { BURN_ADDRESS, RougeChain, Wallet, bytesToHex, createSignedBridgeWithdraw, generateNonce, hexToBytes, isBurnAddress, serializePayload, signTransaction, verifyTransaction };
652
882
  //# sourceMappingURL=index.js.map
653
883
  //# sourceMappingURL=index.js.map
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\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(payload, Object.keys(payload).sort());\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(hexToBytes(privateKey), payloadBytes);\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.public_key),\r\n payloadBytes,\r\n hexToBytes(signedTx.signature)\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): 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 });\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// ===== 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 createSignedNftCreateCollection,\r\n createSignedNftMint,\r\n createSignedNftBatchMint,\r\n createSignedNftTransfer,\r\n createSignedNftBurn,\r\n createSignedNftLock,\r\n createSignedNftFreezeCollection,\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 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 SwapQuoteParams,\r\n TokenMetadataUpdateParams,\r\n TokenHolder,\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 private readonly baseUrl: string;\r\n private readonly fetchFn: FetchFn;\r\n private 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\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 }\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 );\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 try {\r\n const data = await this.post<ApiResponse>(\"/token/metadata/update\", {\r\n token_symbol: params.symbol,\r\n from_public_key: wallet.publicKey,\r\n from_private_key: wallet.privateKey,\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 data;\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\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 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 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 };\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 async withdraw(\r\n wallet: WalletKeys,\r\n params: BridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const evm = params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`;\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/withdraw\",\r\n {\r\n fromPrivateKey: wallet.privateKey,\r\n fromPublicKey: wallet.publicKey,\r\n amountUnits: params.amount,\r\n evmAddress: evm,\r\n fee: params.fee,\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 async claim(params: {\r\n evmTxHash: string;\r\n evmAddress: string;\r\n evmSignature: string;\r\n recipientPubkey: string;\r\n }): 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 }\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","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(hexToBytes(this.privateKey), msg);\r\n return ml_dsa65.verify(hexToBytes(this.publicKey), msg, sig);\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\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(payload, Object.keys(payload).sort());\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): 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 });\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} 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 );\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 try {\r\n const data = await this.post<ApiResponse>(\"/token/metadata/update\", {\r\n token_symbol: params.symbol,\r\n from_public_key: wallet.publicKey,\r\n from_private_key: wallet.privateKey,\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 data;\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\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 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 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(walletId: string, displayName?: string, encryptionPublicKey?: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/wallets/register\", {\r\n wallet_id: walletId,\r\n display_name: displayName,\r\n encryption_public_key: encryptionPublicKey,\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 getConversations(walletId: string): Promise<MessengerConversation[]> {\r\n const data = await this.rc.get<{ conversations: MessengerConversation[] }>(\r\n `/messenger/conversations?walletId=${encodeURIComponent(walletId)}`\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: { mediaType?: string; mediaData?: string; selfDestruct?: boolean } = {}\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 });\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 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.1.1",
3
+ "version": "0.2.0",
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",