@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.cjs +242 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +112 -10
- package/dist/index.d.ts +112 -10
- package/dist/index.js +242 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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)
|
|
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.
|
|
40
|
+
hexToBytes(signedTx.signature),
|
|
41
41
|
payloadBytes,
|
|
42
|
-
hexToBytes(signedTx.
|
|
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
|
|
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:
|
|
570
|
-
|
|
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)
|
|
644
|
-
return ml_dsa65.verify(hexToBytes(this.publicKey)
|
|
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":";;;;;AAAO,SAAS,WAAW,GAAA,EAAyB;AAClD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA;AAC3C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,IAAA,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA,CAAS,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAA2B;AACpD,EAAA,OAAO,MAAM,IAAA,CAAK,KAAK,CAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AACZ;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,MAAM,QAAQ,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AACvD,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;;;ACTO,IAAM,YAAA,GACX;AAEK,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,OAAA,EAAS,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,EAAM,CAAA;AAChE,EAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA;AACtC;AAEO,SAAS,eAAA,CACd,OAAA,EACA,UAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,YAAA,GAAe,iBAAiB,OAAO,CAAA;AAC7C,EAAA,MAAM,YAAY,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,UAAU,GAAG,YAAY,CAAA;AACpE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA,EAAW,WAAW,SAAS,CAAA;AAAA,IAC/B,UAAA,EAAY;AAAA,GACd;AACF;AAEO,SAAS,kBAAkB,QAAA,EAAsC;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA;AACtD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,MACd,UAAA,CAAW,SAAS,UAAU,CAAA;AAAA,MAC9B,YAAA;AAAA,MACA,UAAA,CAAW,SAAS,SAAS;AAAA,KAC/B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,cAAc,OAAA,EAA0B;AACtD,EAAA,OAAO,OAAA,KAAY,YAAA;AACrB;AAIA,SAAS,YAAA,CACP,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAA2B;AAAA,IAC/B,GAAG,OAAA;AAAA,IACH,MAAM,MAAA,CAAO,SAAA;AAAA,IACb,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,OAAO,aAAA;AAAc,GACvB;AACA,EAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,OAAO,SAAS,CAAA;AAClE;AAEO,SAAS,qBACd,MAAA,EACA,EAAA,EACA,QACA,GAAA,GAAM,CAAA,EACN,QAAQ,MAAA,EACW;AACnB,EAAA,OAAO,YAAA,CAAa,QAAQ,EAAE,IAAA,EAAM,YAAY,EAAA,EAAI,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,CAAA;AAC1E;AAEO,SAAS,0BACd,MAAA,EACA,SAAA,EACA,WAAA,EACA,aAAA,EACA,MAAM,EAAA,EACa;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,cAAA;AAAA,IACN,UAAA,EAAY,SAAA;AAAA,IACZ,YAAA,EAAc,WAAA;AAAA,IACd,cAAA,EAAgB,aAAA;AAAA,IAChB;AAAA,GACD,CAAA;AACH;AAEO,SAAS,gBAAA,CACd,MAAA,EACA,OAAA,EACA,QAAA,EACA,UACA,YAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,QAAA;AAAA,IACX,cAAA,EAAgB;AAAA,GACjB,CAAA;AACH;AAEO,SAAS,wBAAA,CACd,MAAA,EACA,MAAA,EACA,MAAA,EACA,SACA,OAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEO,SAAS,wBAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEO,SAAS,2BAAA,CACd,MAAA,EACA,MAAA,EACA,QAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AAEO,SAAS,iBAAA,CACd,MAAA,EACA,MAAA,EACA,GAAA,GAAM,CAAA,EACa;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA;AAC5D;AAEO,SAAS,mBAAA,CACd,MAAA,EACA,MAAA,EACA,GAAA,GAAM,CAAA,EACa;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,KAAK,CAAA;AAC9D;AAEO,SAAS,0BACd,MAAA,EACmB;AACnB,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAU,CAAA;AAChD;AAEO,SAAS,iBACd,MAAA,EACA,MAAA,EACA,GAAA,GAAM,CAAA,EACN,QAAQ,MAAA,EACW;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,UAAA;AAAA,IACN,EAAA,EAAI,YAAA;AAAA,IACJ,MAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAIO,SAAS,gCACd,MAAA,EACA,MAAA,EACA,IAAA,EACA,IAAA,GAKI,EAAC,EACc;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAA,EAAK,EAAA;AAAA,IACL,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,aAAa,IAAA,CAAK;AAAA,GACnB,CAAA;AACH;AAEO,SAAS,oBACd,MAAA,EACA,YAAA,EACA,IAAA,EACA,IAAA,GAAuD,EAAC,EACrC;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,UAAA;AAAA,IACN,YAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAA,EAAK,CAAA;AAAA,IACL,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,YAAY,IAAA,CAAK;AAAA,GAClB,CAAA;AACH;AAEO,SAAS,yBACd,MAAA,EACA,YAAA,EACA,KAAA,EACA,IAAA,GAAyD,EAAC,EACvC;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,gBAAA;AAAA,IACN,YAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA,EAAK,IAAI,KAAA,CAAM,MAAA;AAAA,IACf,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,iBAAiB,IAAA,CAAK;AAAA,GACvB,CAAA;AACH;AAEO,SAAS,uBAAA,CACd,MAAA,EACA,YAAA,EACA,OAAA,EACA,IACA,SAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,cAAA;AAAA,IACN,YAAA;AAAA,IACA,OAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAA,EAAK,CAAA;AAAA,IACL;AAAA,GACD,CAAA;AACH;AAEO,SAAS,mBAAA,CACd,MAAA,EACA,YAAA,EACA,OAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,UAAA;AAAA,IACN,YAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAA,EAAK;AAAA,GACN,CAAA;AACH;AAEO,SAAS,mBAAA,CACd,MAAA,EACA,YAAA,EACA,OAAA,EACA,MAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,UAAA;AAAA,IACN,YAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAK;AAAA,GACN,CAAA;AACH;AAEO,SAAS,+BAAA,CACd,MAAA,EACA,YAAA,EACA,MAAA,EACmB;AACnB,EAAA,OAAO,aAAa,MAAA,EAAQ;AAAA,IAC1B,IAAA,EAAM,uBAAA;AAAA,IACN,YAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAK;AAAA,GACN,CAAA;AACH;;;ACvOO,IAAM,aAAN,MAAiB;AAAA,EAStB,WAAA,CAAY,OAAA,EAAiB,OAAA,GAA6B,EAAC,EAAG;AAC5D,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AAChE,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,CAAQ,MAAA;AAAA,IACtC;AAEA,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,SAAA,CAAU,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,SAAA,CAAU,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAI,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA,EAKA,MAAM,IAAiB,IAAA,EAA0B;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACvD,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,IAAI,CAAA,SAAA,EAAY,IAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,IAAA,CAAkB,IAAA,EAAc,IAAA,EAA2B;AAC/D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACvD,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,OAC9D;AAAA,IACF;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,QAAA,EACA,QAAA,EACsB;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAA8B,UAAU,QAAQ,CAAA;AACvE,MAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,GAAG,MAAK,GAAI,GAAA;AACpC,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO,KAAA;AAAA,OAC9C;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,QAAA,GAA+B;AACnC,IAAA,OAAO,IAAA,CAAK,IAAe,QAAQ,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,SAAA,GAA2E;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA,EAIA,MAAM,SAAA,CAAU,IAAA,GAA2B,EAAC,EAAqB;AAC/D,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,EAAA;AAChD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,GAAA,CAAyB,CAAA,OAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAC9D,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,gBAAA,CACJ,KAAA,GAA6B,KAAA,EACX;AAClB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AAAA,EAClD;AAAA;AAAA,EAIA,MAAM,WAAW,SAAA,EAA6C;AAC5D,IAAA,OAAO,IAAA,CAAK,GAAA,CAAqB,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,KAAA,EAAgC;AACvE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA;AAAA,MACtB,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,KAChC;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,eAAA,CACJ,IAAA,GAA4C,EAAC,EAC3B;AAClB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACtD,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACzD,IAAA,MAAM,CAAA,GAAI,OAAO,QAAA,EAAS;AAC1B,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EAC3C;AAAA;AAAA,EAIA,MAAM,SAAA,GAAsC;AAC1C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,iBAAiB,MAAA,EAAwC;AAC7D,IAAA,OAAO,IAAA,CAAK,GAAA,CAAmB,CAAA,OAAA,EAAU,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,gBACJ,MAAA,EACwB;AACxB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA;AAAA,MACtB,UAAU,MAAM,CAAA,QAAA;AAAA,KAClB;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAM,qBACJ,MAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,OAAA,EAAU,MAAM,CAAA,aAAA,CAAe,CAAA;AAAA,EACjD;AAAA;AAAA,EAIA,MAAM,aAAA,GAAsC;AAC1C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAiC,aAAa,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,MAAM,iBAAA,GAAsC;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAI,mBAAmB,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,WAAA,GAKH;AACD,IAAA,OAAO,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EAC7B;AAAA;AAAA,EAIA,MAAM,QAAA,GAA8B;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAyB,QAAQ,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,eAAA,GAGH;AACD,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA,EAIA,MAAM,QAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,oBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,EAAA;AAAA,MACP,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,GAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,cAAA,EAAgB,EAAE,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,WAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,yBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,WAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,kBAAA,EAAoB,EAAE,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,KAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,KAAK,iBAAA,CAAkB,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,OAAO,GAAG,CAAA;AAC9D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,EAAE,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,KAAK,mBAAA,CAAoB,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,OAAO,GAAG,CAAA;AAChE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,aAAA,EAAe,EAAE,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,MAAA,EAA0C;AACrD,IAAA,MAAM,EAAA,GAAK,0BAA0B,MAAM,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,YAAA,EAAc,EAAE,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,EACA,QACA,GAAA,GAAM,CAAA,EACN,QAAQ,MAAA,EACc;AACtB,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,KAAK,KAAK,CAAA;AACtD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,cAAA,EAAgB,EAAE,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,mBAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAkB,wBAAA,EAA0B;AAAA,QAClE,cAAc,MAAA,CAAO,MAAA;AAAA,QACrB,iBAAiB,MAAA,CAAO,SAAA;AAAA,QACxB,kBAAkB,MAAA,CAAO,UAAA;AAAA,QACzB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AACF;AAIA,IAAM,YAAN,MAAgB;AAAA,EACd,YAA6B,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA,EAI9C,MAAM,cAAA,GAA2C;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA;AAAA,MACzB;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,YAAA,EAA8C;AAChE,IAAA,OAAO,KAAK,EAAA,CAAG,GAAA;AAAA,MACb,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,YAAY,CAAC,CAAA;AAAA,KACrD;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CACJ,YAAA,EACA,IAAA,GAA4C,EAAC,EACG;AAChD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW,MAAA,CAAO,IAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACpE,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW,MAAA,CAAO,IAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACvE,IAAA,MAAM,CAAA,GAAI,OAAO,QAAA,EAAS;AAC1B,IAAA,OAAO,KAAK,EAAA,CAAG,GAAA;AAAA,MACb,CAAA,gBAAA,EAAmB,mBAAmB,YAAY,CAAC,UAAU,CAAA,GAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA,KAC/E;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CACJ,YAAA,EACA,OAAA,EACmB;AACnB,IAAA,OAAO,KAAK,EAAA,CAAG,GAAA;AAAA,MACb,CAAA,WAAA,EAAc,kBAAA,CAAmB,YAAY,CAAC,IAAI,OAAO,CAAA;AAAA,KAC3D;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAAqC;AACpD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA;AAAA,MACzB,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,KAC1C;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,gBAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,KAAK,+BAAA,CAAgC,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAA,EAAM;AAAA,MAC7E,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,2BAAA,EAA6B,EAAE,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,KAAK,mBAAA,CAAoB,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAc,OAAO,IAAA,EAAM;AAAA,MACvE,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,YAAY,MAAA,CAAO;AAAA,KACpB,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,cAAA,EAAgB,EAAE,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,SAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,wBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,YAAA;AAAA,MACP,MAAA,CAAO,KAAA;AAAA,MACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,eAAA,EAAiB,OAAO,eAAA;AAAgB,KAC/D;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,oBAAA,EAAsB,EAAE,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,QAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,uBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,YAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,EAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,kBAAA,EAAoB,EAAE,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,KAAK,mBAAA,CAAoB,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAc,OAAO,OAAO,CAAA;AAC1E,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,cAAA,EAAgB,EAAE,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,mBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,YAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,cAAA,EAAgB,EAAE,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,gBAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,+BAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,YAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,2BAAA,EAA6B,EAAE,CAAA;AAAA,EACzD;AACF,CAAA;AAIA,IAAM,YAAN,MAAgB;AAAA,EACd,YAA6B,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA,EAI9C,MAAM,QAAA,GAAqC;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,IAAgC,QAAQ,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAwC;AACpD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,CAAmB,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,cAAc,MAAA,EAAsC;AACxD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA;AAAA,MACzB,SAAS,MAAM,CAAA,OAAA;AAAA,KACjB;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,MAAA,EAAkC;AACpD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,CAAA,MAAA,EAAS,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,aAAa,MAAA,EAAoC;AACrD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,CAAe,CAAA,MAAA,EAAS,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAgB,aAAA,EAAe;AAAA,MAC5C,SAAS,MAAA,CAAO,MAAA;AAAA,MAChB,UAAU,MAAA,CAAO,OAAA;AAAA,MACjB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,IAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,gBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,kBAAA,EAAoB,EAAE,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,wBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,iBAAA,EAAmB,EAAE,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,YAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,EAAA,GAAK,wBAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,wBAAA,EAA0B,EAAE,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,eAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,MAAM,KAAK,2BAAA,CAA4B,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAC7E,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,2BAAA,EAA6B,EAAE,CAAA;AAAA,EACzD;AACF,CAAA;AAIA,IAAM,eAAN,MAAmB;AAAA,EACjB,YAA6B,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA,EAE9C,MAAM,SAAA,GAAmC;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,IAA6B,gBAAgB,CAAA;AACxE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAK,OAAA,KAAY,IAAA;AAAA,QAC1B,gBAAgB,IAAA,CAAK,cAAA;AAAA,QACrB,OAAA,EAAU,KAAK,OAAA,IAAsB;AAAA,OACvC;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,GAA8C;AAClD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA;AAAA,MACzB;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAA,CACJ,MAAA,EACA,MAAA,EACsB;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,IAAI,IACzC,MAAA,CAAO,UAAA,GACP,CAAA,EAAA,EAAK,MAAA,CAAO,UAAU,CAAA,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,QACzB,kBAAA;AAAA,QACA;AAAA,UACE,gBAAgB,MAAA,CAAO,UAAA;AAAA,UACvB,eAAe,MAAA,CAAO,SAAA;AAAA,UACtB,aAAa,MAAA,CAAO,MAAA;AAAA,UACpB,UAAA,EAAY,GAAA;AAAA,UACZ,KAAK,MAAA,CAAO;AAAA;AACd,OACF;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAK,OAAA,KAAY,IAAA;AAAA,QAC1B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ;AAAA,OACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAA,EAKa;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,QACzB,eAAA;AAAA,QACA;AAAA,UACE,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,IAAI,IACvC,MAAA,CAAO,SAAA,GACP,CAAA,EAAA,EAAK,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,UACzB,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,IAAI,IACzC,MAAA,CAAO,UAAA,GACP,CAAA,EAAA,EAAK,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,UAC1B,cAAc,MAAA,CAAO,YAAA;AAAA,UACrB,2BAA2B,MAAA,CAAO;AAAA;AACpC,OACF;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAK,OAAA,KAAY,IAAA;AAAA,QAC1B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ;AAAA,OACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AACF,CAAA;ACvoBO,IAAM,MAAA,GAAN,MAAM,OAAA,CAA6B;AAAA,EAIhC,WAAA,CAAY,WAAmB,UAAA,EAAoB;AACzD,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAAA,GAAmB;AACxB,IAAA,MAAM,OAAA,GAAUA,SAAS,MAAA,EAAO;AAChC,IAAA,OAAO,IAAI,OAAA;AAAA,MACT,UAAA,CAAW,QAAQ,SAAS,CAAA;AAAA,MAC5B,UAAA,CAAW,QAAQ,SAAS;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAA,CAAS,SAAA,EAAmB,UAAA,EAA4B;AAC7D,IAAA,OAAO,IAAI,OAAA,CAAO,SAAA,EAAW,UAAU,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAqB;AACnB,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkB;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY,CAAE,OAAO,mBAAmB,CAAA;AACxD,MAAA,MAAM,MAAMA,QAAAA,CAAS,IAAA,CAAK,WAAW,IAAA,CAAK,UAAU,GAAG,GAAG,CAAA;AAC1D,MAAA,OAAOA,SAAS,MAAA,CAAO,UAAA,CAAW,KAAK,SAAS,CAAA,EAAG,KAAK,GAAG,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF","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"]}
|