@rougechain/sdk 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -4
- package/dist/index.cjs +135 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +765 -0
- package/dist/index.d.ts +765 -9
- package/dist/index.js +132 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/client.d.ts +0 -199
- package/dist/client.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/shielded.d.ts +0 -43
- package/dist/shielded.d.ts.map +0 -1
- package/dist/signer.d.ts +0 -47
- package/dist/signer.d.ts.map +0 -1
- package/dist/types.d.ts +0 -448
- package/dist/types.d.ts.map +0 -1
- package/dist/utils.d.ts +0 -4
- package/dist/utils.d.ts.map +0 -1
- package/dist/wallet.d.ts +0 -24
- package/dist/wallet.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1054,6 +1054,130 @@ var ShieldedClient = class {
|
|
|
1054
1054
|
return this.rc.submitTx("/v2/shielded/unshield", tx);
|
|
1055
1055
|
}
|
|
1056
1056
|
};
|
|
1057
|
+
|
|
1058
|
+
// src/address.ts
|
|
1059
|
+
var CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
1060
|
+
var BECH32M_CONST = 734539939;
|
|
1061
|
+
var HRP = "rouge";
|
|
1062
|
+
function hrpExpand(hrp) {
|
|
1063
|
+
const ret = [];
|
|
1064
|
+
for (let i = 0; i < hrp.length; i++) ret.push(hrp.charCodeAt(i) >> 5);
|
|
1065
|
+
ret.push(0);
|
|
1066
|
+
for (let i = 0; i < hrp.length; i++) ret.push(hrp.charCodeAt(i) & 31);
|
|
1067
|
+
return ret;
|
|
1068
|
+
}
|
|
1069
|
+
function polymod(values) {
|
|
1070
|
+
const GEN = [996825010, 642813549, 513874426, 1027748829, 705979059];
|
|
1071
|
+
let chk = 1;
|
|
1072
|
+
for (const v of values) {
|
|
1073
|
+
const b = chk >> 25;
|
|
1074
|
+
chk = (chk & 33554431) << 5 ^ v;
|
|
1075
|
+
for (let i = 0; i < 5; i++) {
|
|
1076
|
+
if (b >> i & 1) chk ^= GEN[i];
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
return chk;
|
|
1080
|
+
}
|
|
1081
|
+
function createChecksum(hrp, data) {
|
|
1082
|
+
const values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]);
|
|
1083
|
+
const pm = polymod(values) ^ BECH32M_CONST;
|
|
1084
|
+
const ret = [];
|
|
1085
|
+
for (let i = 0; i < 6; i++) ret.push(pm >> 5 * (5 - i) & 31);
|
|
1086
|
+
return ret;
|
|
1087
|
+
}
|
|
1088
|
+
function verifyChecksum(hrp, data) {
|
|
1089
|
+
return polymod(hrpExpand(hrp).concat(data)) === BECH32M_CONST;
|
|
1090
|
+
}
|
|
1091
|
+
function convertBits(data, fromBits, toBits, pad) {
|
|
1092
|
+
let acc = 0;
|
|
1093
|
+
let bits = 0;
|
|
1094
|
+
const ret = [];
|
|
1095
|
+
const maxv = (1 << toBits) - 1;
|
|
1096
|
+
for (const value of data) {
|
|
1097
|
+
acc = acc << fromBits | value;
|
|
1098
|
+
bits += fromBits;
|
|
1099
|
+
while (bits >= toBits) {
|
|
1100
|
+
bits -= toBits;
|
|
1101
|
+
ret.push(acc >> bits & maxv);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
{
|
|
1105
|
+
if (bits > 0) ret.push(acc << toBits - bits & maxv);
|
|
1106
|
+
}
|
|
1107
|
+
return ret;
|
|
1108
|
+
}
|
|
1109
|
+
function bech32mEncode(hrp, data) {
|
|
1110
|
+
const data5bit = convertBits(data, 8, 5);
|
|
1111
|
+
const checksum = createChecksum(hrp, data5bit);
|
|
1112
|
+
const combined = data5bit.concat(checksum);
|
|
1113
|
+
let result = hrp + "1";
|
|
1114
|
+
for (const d of combined) result += CHARSET[d];
|
|
1115
|
+
return result;
|
|
1116
|
+
}
|
|
1117
|
+
function bech32mDecode(str) {
|
|
1118
|
+
const lower = str.toLowerCase();
|
|
1119
|
+
const pos = lower.lastIndexOf("1");
|
|
1120
|
+
if (pos < 1 || pos + 7 > lower.length) throw new Error("Invalid bech32m string");
|
|
1121
|
+
const hrp = lower.slice(0, pos);
|
|
1122
|
+
const data5bit = [];
|
|
1123
|
+
for (let i = pos + 1; i < lower.length; i++) {
|
|
1124
|
+
const d = CHARSET.indexOf(lower[i]);
|
|
1125
|
+
if (d === -1) throw new Error(`Invalid character: ${lower[i]}`);
|
|
1126
|
+
data5bit.push(d);
|
|
1127
|
+
}
|
|
1128
|
+
if (!verifyChecksum(hrp, data5bit)) throw new Error("Invalid bech32m checksum");
|
|
1129
|
+
const payload = data5bit.slice(0, data5bit.length - 6);
|
|
1130
|
+
const ret = [];
|
|
1131
|
+
let acc = 0, bits = 0;
|
|
1132
|
+
for (const value of payload) {
|
|
1133
|
+
acc = acc << 5 | value;
|
|
1134
|
+
bits += 5;
|
|
1135
|
+
while (bits >= 8) {
|
|
1136
|
+
bits -= 8;
|
|
1137
|
+
ret.push(acc >> bits & 255);
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
return { hrp, data: new Uint8Array(ret) };
|
|
1141
|
+
}
|
|
1142
|
+
function hexToBytes2(hex) {
|
|
1143
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
1144
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
1145
|
+
bytes[i / 2] = parseInt(hex.substr(i, 2), 16);
|
|
1146
|
+
}
|
|
1147
|
+
return bytes;
|
|
1148
|
+
}
|
|
1149
|
+
function bytesToHex2(bytes) {
|
|
1150
|
+
return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
1151
|
+
}
|
|
1152
|
+
async function sha2562(data) {
|
|
1153
|
+
const buf = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
1154
|
+
const hash = await crypto.subtle.digest("SHA-256", buf);
|
|
1155
|
+
return new Uint8Array(hash);
|
|
1156
|
+
}
|
|
1157
|
+
async function pubkeyToAddress(publicKeyHex) {
|
|
1158
|
+
const pkBytes = hexToBytes2(publicKeyHex);
|
|
1159
|
+
const hash = await sha2562(pkBytes);
|
|
1160
|
+
return bech32mEncode(HRP, hash);
|
|
1161
|
+
}
|
|
1162
|
+
function addressToHash(address) {
|
|
1163
|
+
const { data } = bech32mDecode(address);
|
|
1164
|
+
return bytesToHex2(data);
|
|
1165
|
+
}
|
|
1166
|
+
function isRougeAddress(input) {
|
|
1167
|
+
if (!input.toLowerCase().startsWith("rouge1") || input.length < 10) return false;
|
|
1168
|
+
try {
|
|
1169
|
+
bech32mDecode(input);
|
|
1170
|
+
return true;
|
|
1171
|
+
} catch {
|
|
1172
|
+
return false;
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
function formatAddress(address, prefixLen = 12, suffixLen = 4) {
|
|
1176
|
+
if (address.length <= prefixLen + suffixLen + 3) return address;
|
|
1177
|
+
return `${address.slice(0, prefixLen)}...${address.slice(-suffixLen)}`;
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
// src/wallet.ts
|
|
1057
1181
|
var Wallet = class _Wallet {
|
|
1058
1182
|
constructor(publicKey, privateKey) {
|
|
1059
1183
|
this.publicKey = publicKey;
|
|
@@ -1082,6 +1206,13 @@ var Wallet = class _Wallet {
|
|
|
1082
1206
|
toJSON() {
|
|
1083
1207
|
return { publicKey: this.publicKey, privateKey: this.privateKey };
|
|
1084
1208
|
}
|
|
1209
|
+
/**
|
|
1210
|
+
* Derive the compact Bech32m address from the public key.
|
|
1211
|
+
* Returns a ~63-character `rouge1...` string.
|
|
1212
|
+
*/
|
|
1213
|
+
async address() {
|
|
1214
|
+
return pubkeyToAddress(this.publicKey);
|
|
1215
|
+
}
|
|
1085
1216
|
/**
|
|
1086
1217
|
* Verify that the keypair is valid by signing and verifying a test message.
|
|
1087
1218
|
*/
|
|
@@ -1096,6 +1227,6 @@ var Wallet = class _Wallet {
|
|
|
1096
1227
|
}
|
|
1097
1228
|
};
|
|
1098
1229
|
|
|
1099
|
-
export { BURN_ADDRESS, RougeChain, Wallet, bytesToHex, computeCommitment, computeNullifier, createShieldedNote, createSignedBridgeWithdraw, createSignedShield, createSignedShieldedTransfer, createSignedTokenMetadataClaim, createSignedTokenMetadataUpdate, createSignedUnshield, generateNonce, generateRandomness, hexToBytes, isBurnAddress, serializePayload, signTransaction, verifyTransaction };
|
|
1230
|
+
export { BURN_ADDRESS, RougeChain, Wallet, addressToHash, bytesToHex, computeCommitment, computeNullifier, createShieldedNote, createSignedBridgeWithdraw, createSignedShield, createSignedShieldedTransfer, createSignedTokenMetadataClaim, createSignedTokenMetadataUpdate, createSignedUnshield, formatAddress, generateNonce, generateRandomness, hexToBytes, isBurnAddress, isRougeAddress, pubkeyToAddress, serializePayload, signTransaction, verifyTransaction };
|
|
1100
1231
|
//# sourceMappingURL=index.js.map
|
|
1101
1232
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/signer.ts","../src/shielded.ts","../src/client.ts","../src/wallet.ts"],"names":["ml_dsa65"],"mappings":"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","file":"index.js","sourcesContent":["export function hexToBytes(hex: string): Uint8Array {\r\n const bytes = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n}\r\n\r\nexport function generateNonce(): string {\r\n const bytes = crypto.getRandomValues(new Uint8Array(16));\r\n return bytesToHex(bytes);\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { hexToBytes, bytesToHex, generateNonce } from \"./utils.js\";\r\nimport type {\r\n TransactionPayload,\r\n SignedTransaction,\r\n WalletKeys,\r\n} from \"./types.js\";\r\n\r\nexport const BURN_ADDRESS =\r\n \"XRGE_BURN_0x000000000000000000000000000000000000000000000000000000000000DEAD\";\r\n\r\nfunction sortKeysDeep(obj: unknown): unknown {\r\n if (Array.isArray(obj)) return obj.map(sortKeysDeep);\r\n if (obj !== null && typeof obj === \"object\") {\r\n const sorted: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj).sort()) {\r\n sorted[key] = sortKeysDeep((obj as Record<string, unknown>)[key]);\r\n }\r\n return sorted;\r\n }\r\n return obj;\r\n}\r\n\r\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(sortKeysDeep(payload));\r\n return new TextEncoder().encode(json);\r\n}\r\n\r\nexport function signTransaction(\r\n payload: TransactionPayload,\r\n privateKey: string,\r\n publicKey: string\r\n): SignedTransaction {\r\n const payloadBytes = serializePayload(payload);\r\n const signature = ml_dsa65.sign(payloadBytes, hexToBytes(privateKey));\r\n return {\r\n payload,\r\n signature: bytesToHex(signature),\r\n public_key: publicKey,\r\n };\r\n}\r\n\r\nexport function verifyTransaction(signedTx: SignedTransaction): boolean {\r\n try {\r\n const payloadBytes = serializePayload(signedTx.payload);\r\n return ml_dsa65.verify(\r\n hexToBytes(signedTx.signature),\r\n payloadBytes,\r\n hexToBytes(signedTx.public_key)\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function isBurnAddress(address: string): boolean {\r\n return address === BURN_ADDRESS;\r\n}\r\n\r\n// ===== Transaction builders =====\r\n\r\nfunction buildAndSign(\r\n wallet: WalletKeys,\r\n payload: Omit<TransactionPayload, \"from\" | \"timestamp\" | \"nonce\">\r\n): SignedTransaction {\r\n const full: TransactionPayload = {\r\n ...payload,\r\n from: wallet.publicKey,\r\n timestamp: Date.now(),\r\n nonce: generateNonce(),\r\n } as TransactionPayload;\r\n return signTransaction(full, wallet.privateKey, wallet.publicKey);\r\n}\r\n\r\nexport function createSignedTransfer(\r\n wallet: WalletKeys,\r\n to: string,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"transfer\", to, amount, fee, token });\r\n}\r\n\r\nexport function createSignedTokenCreation(\r\n wallet: WalletKeys,\r\n tokenName: string,\r\n tokenSymbol: string,\r\n initialSupply: number,\r\n fee = 10,\r\n image?: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_token\",\r\n token_name: tokenName,\r\n token_symbol: tokenSymbol,\r\n initial_supply: initialSupply,\r\n fee,\r\n ...(image ? { image } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataUpdate(\r\n wallet: WalletKeys,\r\n tokenSymbol: string,\r\n metadata: {\r\n image?: string;\r\n description?: string;\r\n website?: string;\r\n twitter?: string;\r\n discord?: string;\r\n }\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"update_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n ...(metadata.image !== undefined ? { image: metadata.image } : {}),\r\n ...(metadata.description !== undefined ? { description: metadata.description } : {}),\r\n ...(metadata.website !== undefined ? { website: metadata.website } : {}),\r\n ...(metadata.twitter !== undefined ? { twitter: metadata.twitter } : {}),\r\n ...(metadata.discord !== undefined ? { discord: metadata.discord } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataClaim(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"claim_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n });\r\n}\r\n\r\nexport function createSignedSwap(\r\n wallet: WalletKeys,\r\n tokenIn: string,\r\n tokenOut: string,\r\n amountIn: number,\r\n minAmountOut: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"swap\",\r\n token_in: tokenIn,\r\n token_out: tokenOut,\r\n amount_in: amountIn,\r\n min_amount_out: minAmountOut,\r\n });\r\n}\r\n\r\nexport function createSignedPoolCreation(\r\n wallet: WalletKeys,\r\n tokenA: string,\r\n tokenB: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_pool\",\r\n token_a: tokenA,\r\n token_b: tokenB,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedAddLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"add_liquidity\",\r\n pool_id: poolId,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedRemoveLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n lpAmount: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"remove_liquidity\",\r\n pool_id: poolId,\r\n lp_amount: lpAmount,\r\n });\r\n}\r\n\r\nexport function createSignedStake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"stake\", amount, fee });\r\n}\r\n\r\nexport function createSignedUnstake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"unstake\", amount, fee });\r\n}\r\n\r\nexport function createSignedFaucetRequest(\r\n wallet: WalletKeys\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"faucet\" });\r\n}\r\n\r\nexport function createSignedBurn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"transfer\",\r\n to: BURN_ADDRESS,\r\n amount,\r\n fee,\r\n token,\r\n });\r\n}\r\n\r\n// ===== Bridge builders =====\r\n\r\nexport function createSignedBridgeWithdraw(\r\n wallet: WalletKeys,\r\n amount: number,\r\n evmAddress: string,\r\n tokenSymbol = \"qETH\",\r\n fee = 0.1\r\n): SignedTransaction {\r\n const evm = evmAddress.startsWith(\"0x\") ? evmAddress : `0x${evmAddress}`;\r\n return buildAndSign(wallet, {\r\n type: \"bridge_withdraw\",\r\n amount,\r\n fee,\r\n tokenSymbol,\r\n evmAddress: evm,\r\n });\r\n}\r\n\r\n// ===== NFT builders =====\r\n\r\nexport function createSignedNftCreateCollection(\r\n wallet: WalletKeys,\r\n symbol: string,\r\n name: string,\r\n opts: {\r\n maxSupply?: number;\r\n royaltyBps?: number;\r\n image?: string;\r\n description?: string;\r\n } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_create_collection\",\r\n symbol,\r\n name,\r\n fee: 50,\r\n maxSupply: opts.maxSupply,\r\n royaltyBps: opts.royaltyBps,\r\n image: opts.image,\r\n description: opts.description,\r\n });\r\n}\r\n\r\nexport function createSignedNftMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n name: string,\r\n opts: { metadataUri?: string; attributes?: unknown } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_mint\",\r\n collectionId,\r\n name,\r\n fee: 5,\r\n metadataUri: opts.metadataUri,\r\n attributes: opts.attributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftBatchMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n names: string[],\r\n opts: { uris?: string[]; batchAttributes?: unknown[] } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_batch_mint\",\r\n collectionId,\r\n names,\r\n fee: 5 * names.length,\r\n uris: opts.uris,\r\n batchAttributes: opts.batchAttributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftTransfer(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n to: string,\r\n salePrice?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_transfer\",\r\n collectionId,\r\n tokenId,\r\n to,\r\n fee: 1,\r\n salePrice,\r\n });\r\n}\r\n\r\nexport function createSignedNftBurn(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_burn\",\r\n collectionId,\r\n tokenId,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftLock(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n locked: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_lock\",\r\n collectionId,\r\n tokenId,\r\n locked,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftFreezeCollection(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n frozen: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_freeze_collection\",\r\n collectionId,\r\n frozen,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\n// ===== Shielded transaction builders =====\r\n\r\nexport function createSignedShield(\r\n wallet: WalletKeys,\r\n amount: number,\r\n commitment: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"shield\",\r\n amount,\r\n commitment,\r\n } as any);\r\n}\r\n\r\nexport function createSignedShieldedTransfer(\r\n wallet: WalletKeys,\r\n nullifiers: string[],\r\n outputCommitments: string[],\r\n proof: string,\r\n shieldedFee?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"shielded_transfer\",\r\n nullifiers,\r\n output_commitments: outputCommitments,\r\n proof,\r\n fee: shieldedFee ?? 0,\r\n } as any);\r\n}\r\n\r\nexport function createSignedUnshield(\r\n wallet: WalletKeys,\r\n nullifiers: string[],\r\n amount: number,\r\n proof: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"unshield\",\r\n nullifiers,\r\n amount,\r\n proof,\r\n } as any);\r\n}\r\n\r\n","/**\n * Client-side shielded transaction crypto primitives.\n *\n * Mirrors the Rust commitment.rs exactly:\n * commitment = SHA-256(\"ROUGECHAIN_COMMITMENT_V1\" || value || pubkey || randomness)\n * nullifier = SHA-256(\"ROUGECHAIN_NULLIFIER_V1\" || randomness || commitment)\n */\n\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { bytesToHex } from \"./utils.js\";\n\nconst COMMITMENT_DOMAIN = new TextEncoder().encode(\"ROUGECHAIN_COMMITMENT_V1\");\nconst NULLIFIER_DOMAIN = new TextEncoder().encode(\"ROUGECHAIN_NULLIFIER_V1\");\n\n/** Generate 32 bytes of cryptographically secure randomness (hex-encoded). */\nexport function generateRandomness(): string {\n const buf = new Uint8Array(32);\n crypto.getRandomValues(buf);\n return bytesToHex(buf);\n}\n\n/** Encode a u64 value as 8 big-endian bytes. */\nfunction u64ToBytes(value: number): Uint8Array {\n const buf = new Uint8Array(8);\n const view = new DataView(buf.buffer);\n // JS numbers are safe up to 2^53, sufficient for XRGE amounts\n view.setBigUint64(0, BigInt(value), false); // big-endian\n return buf;\n}\n\n/** Decode a hex string to Uint8Array. */\nfunction hexToU8(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const bytes = new Uint8Array(clean.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Compute a shielded note commitment.\n *\n * @param value - Note value in XRGE (integer)\n * @param ownerPubKey - Owner's ML-DSA-65 public key (hex)\n * @param randomness - 32-byte blinding factor (hex)\n * @returns 32-byte commitment hash (hex)\n */\nexport function computeCommitment(\n value: number,\n ownerPubKey: string,\n randomness: string\n): string {\n const valueBytes = u64ToBytes(value);\n const pubkeyBytes = hexToU8(ownerPubKey);\n const randBytes = hexToU8(randomness);\n\n // Concatenate: domain || value || pubkey || randomness\n const input = new Uint8Array(\n COMMITMENT_DOMAIN.length + valueBytes.length + pubkeyBytes.length + randBytes.length\n );\n let offset = 0;\n input.set(COMMITMENT_DOMAIN, offset); offset += COMMITMENT_DOMAIN.length;\n input.set(valueBytes, offset); offset += valueBytes.length;\n input.set(pubkeyBytes, offset); offset += pubkeyBytes.length;\n input.set(randBytes, offset);\n\n return bytesToHex(sha256(input));\n}\n\n/**\n * Compute a nullifier for a shielded note.\n *\n * @param randomness - The note's blinding factor (hex)\n * @param commitment - The note's commitment hash (hex)\n * @returns 32-byte nullifier hash (hex)\n */\nexport function computeNullifier(\n randomness: string,\n commitment: string\n): string {\n const randBytes = hexToU8(randomness);\n const commitBytes = hexToU8(commitment);\n\n const input = new Uint8Array(\n NULLIFIER_DOMAIN.length + randBytes.length + commitBytes.length\n );\n let offset = 0;\n input.set(NULLIFIER_DOMAIN, offset); offset += NULLIFIER_DOMAIN.length;\n input.set(randBytes, offset); offset += randBytes.length;\n input.set(commitBytes, offset);\n\n return bytesToHex(sha256(input));\n}\n\n/** A shielded note — kept locally by the owner (never sent to chain). */\nexport interface ShieldedNote {\n commitment: string;\n nullifier: string;\n value: number;\n randomness: string;\n ownerPubKey: string;\n}\n\n/**\n * Create a new shielded note for a given value.\n *\n * @param value - XRGE amount (integer)\n * @param ownerPubKey - Owner's public key (hex)\n * @returns A ShieldedNote with all derived fields\n */\nexport function createShieldedNote(\n value: number,\n ownerPubKey: string\n): ShieldedNote {\n const randomness = generateRandomness();\n const commitment = computeCommitment(value, ownerPubKey, randomness);\n const nullifier = computeNullifier(randomness, commitment);\n return { commitment, nullifier, value, randomness, ownerPubKey };\n}\n","import {\r\n createSignedTransfer,\r\n createSignedTokenCreation,\r\n createSignedSwap,\r\n createSignedPoolCreation,\r\n createSignedAddLiquidity,\r\n createSignedRemoveLiquidity,\r\n createSignedStake,\r\n createSignedUnstake,\r\n createSignedFaucetRequest,\r\n createSignedBurn,\r\n createSignedBridgeWithdraw,\r\n createSignedNftCreateCollection,\r\n createSignedNftMint,\r\n createSignedNftBatchMint,\r\n createSignedNftTransfer,\r\n createSignedNftBurn,\r\n createSignedNftLock,\r\n createSignedNftFreezeCollection,\r\n createSignedTokenMetadataUpdate,\r\n createSignedTokenMetadataClaim,\r\n createSignedShield,\r\n createSignedShieldedTransfer,\r\n createSignedUnshield,\r\n} from \"./signer.js\";\r\nimport type {\r\n WalletKeys,\r\n ApiResponse,\r\n SignedTransaction,\r\n NodeStats,\r\n Block,\r\n TokenMetadata,\r\n BalanceResponse,\r\n LiquidityPool,\r\n SwapQuote,\r\n PoolEvent,\r\n PoolStats,\r\n NftCollection,\r\n NftToken,\r\n Validator,\r\n BridgeConfig,\r\n BridgeWithdrawal,\r\n XrgeBridgeConfig,\r\n TransferParams,\r\n CreateTokenParams,\r\n SwapParams,\r\n CreatePoolParams,\r\n AddLiquidityParams,\r\n RemoveLiquidityParams,\r\n StakeParams,\r\n CreateNftCollectionParams,\r\n MintNftParams,\r\n BatchMintNftParams,\r\n TransferNftParams,\r\n BurnNftParams,\r\n LockNftParams,\r\n FreezeCollectionParams,\r\n BridgeWithdrawParams,\r\n BridgeClaimParams,\r\n XrgeBridgeClaimParams,\r\n XrgeBridgeWithdrawParams,\r\n SwapQuoteParams,\r\n TokenMetadataUpdateParams,\r\n TokenHolder,\r\n MailMessage,\r\n SendMailParams,\r\n MessengerWallet,\r\n MessengerConversation,\r\n MessengerMessage,\r\n PriceSnapshot,\r\n ShieldParams,\r\n ShieldedTransferParams,\r\n UnshieldParams,\r\n ShieldedStats,\r\n RollupStatus,\r\n RollupBatchResult,\r\n RollupSubmitParams,\r\n RollupSubmitResult,\r\n} from \"./types.js\";\r\nimport { createShieldedNote, type ShieldedNote } from \"./shielded.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 public readonly shielded: ShieldedClient;\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 this.shielded = new ShieldedClient(this);\r\n }\r\n\r\n // ===== Internal helpers =====\r\n\r\n /** @internal */\r\n async get<T = unknown>(path: string): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n headers: this.headers,\r\n });\r\n if (!res.ok) {\r\n throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async post<T = unknown>(path: string, body: unknown): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(\r\n `POST ${path} failed: ${res.status} ${res.statusText} ${text}`\r\n );\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async submitTx(\r\n endpoint: string,\r\n signedTx: SignedTransaction\r\n ): Promise<ApiResponse> {\r\n try {\r\n const raw = await this.post<Record<string, unknown>>(endpoint, signedTx);\r\n const { success, error, ...rest } = raw;\r\n return {\r\n success: success as boolean,\r\n error: error as string | undefined,\r\n data: Object.keys(rest).length > 0 ? rest : undefined,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ===== Stats & Health =====\r\n\r\n async getStats(): Promise<NodeStats> {\r\n return this.get<NodeStats>(\"/stats\");\r\n }\r\n\r\n async getHealth(): Promise<{ status: string; chain_id: string; height: number }> {\r\n return this.get(\"/health\");\r\n }\r\n\r\n // ===== Blocks =====\r\n\r\n async getBlocks(opts: { limit?: number } = {}): Promise<Block[]> {\r\n const q = opts.limit ? `?limit=${opts.limit}` : \"\";\r\n const data = await this.get<{ blocks: Block[] }>(`/blocks${q}`);\r\n return data.blocks;\r\n }\r\n\r\n async getBlocksSummary(\r\n range: \"1h\" | \"24h\" | \"7d\" = \"24h\"\r\n ): Promise<unknown> {\r\n return this.get(`/blocks/summary?range=${range}`);\r\n }\r\n\r\n // ===== Balance =====\r\n\r\n async getBalance(publicKey: string): Promise<BalanceResponse> {\r\n return this.get<BalanceResponse>(`/balance/${publicKey}`);\r\n }\r\n\r\n async getTokenBalance(publicKey: string, token: string): Promise<number> {\r\n const data = await this.get<{ balance: number }>(\r\n `/balance/${publicKey}/${token}`\r\n );\r\n return data.balance;\r\n }\r\n\r\n // ===== Transactions =====\r\n\r\n async getTransactions(\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<unknown> {\r\n const params = new URLSearchParams();\r\n if (opts.limit) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.get(`/txs${q ? `?${q}` : \"\"}`);\r\n }\r\n\r\n // ===== Tokens =====\r\n\r\n async getTokens(): Promise<TokenMetadata[]> {\r\n const data = await this.get<{ tokens: TokenMetadata[]; success: boolean }>(\r\n \"/tokens\"\r\n );\r\n return data.tokens;\r\n }\r\n\r\n async getTokenMetadata(symbol: string): Promise<TokenMetadata> {\r\n return this.get<TokenMetadata>(`/token/${symbol}/metadata`);\r\n }\r\n\r\n async getTokenHolders(\r\n symbol: string\r\n ): Promise<TokenHolder[]> {\r\n const data = await this.get<{ holders: TokenHolder[] }>(\r\n `/token/${symbol}/holders`\r\n );\r\n return data.holders;\r\n }\r\n\r\n async getTokenTransactions(\r\n symbol: string\r\n ): Promise<unknown> {\r\n return this.get(`/token/${symbol}/transactions`);\r\n }\r\n\r\n // ===== Validators =====\r\n\r\n async getValidators(): Promise<Validator[]> {\r\n const data = await this.get<{ validators: Validator[] }>(\"/validators\");\r\n return data.validators;\r\n }\r\n\r\n async getValidatorStats(): Promise<unknown> {\r\n return this.get(\"/validators/stats\");\r\n }\r\n\r\n async getFinality(): Promise<{\r\n finalized_height: number;\r\n tip_height: number;\r\n total_stake: number;\r\n finalized_stake: number;\r\n }> {\r\n return this.get(\"/finality\");\r\n }\r\n\r\n // ===== Peers =====\r\n\r\n async getPeers(): Promise<string[]> {\r\n const data = await this.get<{ peers: string[] }>(\"/peers\");\r\n return data.peers;\r\n }\r\n\r\n // ===== Burned =====\r\n\r\n async getBurnedTokens(): Promise<{\r\n burned: Record<string, number>;\r\n total_xrge_burned: number;\r\n }> {\r\n return this.get(\"/burned\");\r\n }\r\n\r\n // ===== Write operations =====\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTransfer(\r\n wallet,\r\n params.to,\r\n params.amount,\r\n params.fee,\r\n params.token\r\n );\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async createToken(\r\n wallet: WalletKeys,\r\n params: CreateTokenParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenCreation(\r\n wallet,\r\n params.name,\r\n params.symbol,\r\n params.totalSupply,\r\n params.fee,\r\n params.image\r\n );\r\n return this.submitTx(\"/v2/token/create\", tx);\r\n }\r\n\r\n async stake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedStake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/stake\", tx);\r\n }\r\n\r\n async unstake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnstake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/unstake\", tx);\r\n }\r\n\r\n async faucet(wallet: WalletKeys): Promise<ApiResponse> {\r\n const tx = createSignedFaucetRequest(wallet);\r\n return this.submitTx(\"/v2/faucet\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedBurn(wallet, amount, fee, token);\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async updateTokenMetadata(\r\n wallet: WalletKeys,\r\n params: TokenMetadataUpdateParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataUpdate(wallet, params.symbol, {\r\n image: params.image,\r\n description: params.description,\r\n website: params.website,\r\n twitter: params.twitter,\r\n discord: params.discord,\r\n });\r\n return this.submitTx(\"/v2/token/metadata/update\", tx);\r\n }\r\n\r\n async claimTokenMetadata(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataClaim(wallet, tokenSymbol);\r\n return this.submitTx(\"/v2/token/metadata/claim\", tx);\r\n }\r\n\r\n // ===== Rollup =====\r\n\r\n /** Get the current rollup accumulator status. */\r\n async getRollupStatus(): Promise<RollupStatus> {\r\n const data = await this.get<{ rollup: RollupStatus }>(\"/v2/rollup/status\");\r\n return data.rollup;\r\n }\r\n\r\n /** Submit a transfer into the rollup batch accumulator. */\r\n async submitRollupTransfer(\r\n params: RollupSubmitParams\r\n ): Promise<RollupSubmitResult> {\r\n return this.post<RollupSubmitResult>(\"/v2/rollup/submit\", params);\r\n }\r\n\r\n /** Get the result of a completed rollup batch by ID. */\r\n async getRollupBatch(batchId: number): Promise<RollupBatchResult> {\r\n const data = await this.get<{ batch: RollupBatchResult }>(\r\n `/v2/rollup/batch/${batchId}`\r\n );\r\n return data.batch;\r\n }\r\n}\r\n\r\n// ===== NFT Sub-client =====\r\n\r\nclass NftClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getCollections(): Promise<NftCollection[]> {\r\n const data = await this.rc.get<{ collections: NftCollection[] }>(\r\n \"/nft/collections\"\r\n );\r\n return data.collections;\r\n }\r\n\r\n async getCollection(collectionId: string): Promise<NftCollection> {\r\n return this.rc.get<NftCollection>(\r\n `/nft/collection/${encodeURIComponent(collectionId)}`\r\n );\r\n }\r\n\r\n /**\r\n * Poll until a collection exists on-chain (i.e. the create tx has been mined).\r\n * Useful after `createCollection` since the tx goes to the mempool first.\r\n * @returns the collection once found, or throws after the timeout.\r\n */\r\n async waitForCollection(\r\n collectionId: string,\r\n opts: { timeoutMs?: number; pollMs?: number } = {}\r\n ): Promise<NftCollection> {\r\n const timeout = opts.timeoutMs ?? 30_000;\r\n const poll = opts.pollMs ?? 1_000;\r\n const deadline = Date.now() + timeout;\r\n while (Date.now() < deadline) {\r\n try {\r\n return await this.getCollection(collectionId);\r\n } catch {\r\n await new Promise((r) => setTimeout(r, poll));\r\n }\r\n }\r\n throw new Error(\r\n `Collection \"${collectionId}\" not found after ${timeout}ms — the create transaction may not have been mined yet`\r\n );\r\n }\r\n\r\n async getTokens(\r\n collectionId: string,\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<{ tokens: NftToken[]; total: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset !== undefined) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.rc.get(\r\n `/nft/collection/${encodeURIComponent(collectionId)}/tokens${q ? `?${q}` : \"\"}`\r\n );\r\n }\r\n\r\n async getToken(\r\n collectionId: string,\r\n tokenId: number\r\n ): Promise<NftToken> {\r\n return this.rc.get<NftToken>(\r\n `/nft/token/${encodeURIComponent(collectionId)}/${tokenId}`\r\n );\r\n }\r\n\r\n async getByOwner(pubkey: string): Promise<NftToken[]> {\r\n const data = await this.rc.get<{ nfts: NftToken[] }>(\r\n `/nft/owner/${encodeURIComponent(pubkey)}`\r\n );\r\n return data.nfts;\r\n }\r\n\r\n // Write operations\r\n\r\n async createCollection(\r\n wallet: WalletKeys,\r\n params: CreateNftCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftCreateCollection(wallet, params.symbol, params.name, {\r\n maxSupply: params.maxSupply,\r\n royaltyBps: params.royaltyBps,\r\n image: params.image,\r\n description: params.description,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/collection/create\", tx);\r\n }\r\n\r\n async mint(\r\n wallet: WalletKeys,\r\n params: MintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftMint(wallet, params.collectionId, params.name, {\r\n metadataUri: params.metadataUri,\r\n attributes: params.attributes,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/mint\", tx);\r\n }\r\n\r\n async batchMint(\r\n wallet: WalletKeys,\r\n params: BatchMintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBatchMint(\r\n wallet,\r\n params.collectionId,\r\n params.names,\r\n { uris: params.uris, batchAttributes: params.batchAttributes }\r\n );\r\n return this.rc.submitTx(\"/v2/nft/batch-mint\", tx);\r\n }\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftTransfer(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.to,\r\n params.salePrice\r\n );\r\n return this.rc.submitTx(\"/v2/nft/transfer\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n params: BurnNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBurn(wallet, params.collectionId, params.tokenId);\r\n return this.rc.submitTx(\"/v2/nft/burn\", tx);\r\n }\r\n\r\n async lock(\r\n wallet: WalletKeys,\r\n params: LockNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftLock(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.locked\r\n );\r\n return this.rc.submitTx(\"/v2/nft/lock\", tx);\r\n }\r\n\r\n async freezeCollection(\r\n wallet: WalletKeys,\r\n params: FreezeCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftFreezeCollection(\r\n wallet,\r\n params.collectionId,\r\n params.frozen\r\n );\r\n return this.rc.submitTx(\"/v2/nft/freeze-collection\", tx);\r\n }\r\n}\r\n\r\n// ===== DEX Sub-client =====\r\n\r\nclass DexClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getPools(): Promise<LiquidityPool[]> {\r\n const data = await this.rc.get<{ pools: LiquidityPool[] }>(\"/pools\");\r\n return data.pools;\r\n }\r\n\r\n async getPool(poolId: string): Promise<LiquidityPool> {\r\n return this.rc.get<LiquidityPool>(`/pool/${poolId}`);\r\n }\r\n\r\n async getPoolEvents(poolId: string): Promise<PoolEvent[]> {\r\n const data = await this.rc.get<{ events: PoolEvent[] }>(\r\n `/pool/${poolId}/events`\r\n );\r\n return data.events;\r\n }\r\n\r\n async getPriceHistory(poolId: string): Promise<PriceSnapshot[]> {\r\n const data = await this.rc.get<{ prices: PriceSnapshot[] }>(\r\n `/pool/${poolId}/prices`\r\n );\r\n return data.prices;\r\n }\r\n\r\n async getPoolStats(poolId: string): Promise<PoolStats> {\r\n return this.rc.get<PoolStats>(`/pool/${poolId}/stats`);\r\n }\r\n\r\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\r\n return this.rc.post<SwapQuote>(\"/swap/quote\", {\r\n pool_id: params.poolId,\r\n token_in: params.tokenIn,\r\n token_out: params.tokenOut,\r\n amount_in: params.amountIn,\r\n });\r\n }\r\n\r\n // Write operations\r\n\r\n async swap(\r\n wallet: WalletKeys,\r\n params: SwapParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedSwap(\r\n wallet,\r\n params.tokenIn,\r\n params.tokenOut,\r\n params.amountIn,\r\n params.minAmountOut\r\n );\r\n return this.rc.submitTx(\"/v2/swap/execute\", tx);\r\n }\r\n\r\n async createPool(\r\n wallet: WalletKeys,\r\n params: CreatePoolParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedPoolCreation(\r\n wallet,\r\n params.tokenA,\r\n params.tokenB,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/create\", tx);\r\n }\r\n\r\n async addLiquidity(\r\n wallet: WalletKeys,\r\n params: AddLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedAddLiquidity(\r\n wallet,\r\n params.poolId,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/add-liquidity\", tx);\r\n }\r\n\r\n async removeLiquidity(\r\n wallet: WalletKeys,\r\n params: RemoveLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedRemoveLiquidity(wallet, params.poolId, params.lpAmount);\r\n return this.rc.submitTx(\"/v2/pool/remove-liquidity\", tx);\r\n }\r\n}\r\n\r\n// ===== Bridge Sub-client =====\r\n\r\nclass BridgeClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getConfig(): Promise<BridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n custodyAddress: data.custodyAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n supportedTokens: data.supportedTokens as string[] | undefined,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async getWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n }\r\n\r\n /** Withdraw qETH/qUSDC — signed client-side, private key never sent to server */\r\n async withdraw(\r\n wallet: WalletKeys,\r\n params: BridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const tokenSymbol = params.tokenSymbol ?? \"qETH\";\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n tokenSymbol,\r\n params.fee\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amountUnits: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n /** Claim qETH or qUSDC after depositing on Base Sepolia */\r\n async claim(params: BridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n evmSignature: params.evmSignature,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n token: params.token ?? \"ETH\",\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ── XRGE Bridge ──\r\n\r\n async getXrgeConfig(): Promise<XrgeBridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/xrge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n vaultAddress: data.vaultAddress as string | undefined,\r\n tokenAddress: data.tokenAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async claimXrge(params: XrgeBridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n amount: params.amount,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async withdrawXrge(\r\n wallet: WalletKeys,\r\n params: XrgeBridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n \"XRGE\",\r\n 0.1\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amount: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getXrgeWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n try {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/xrge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n// ===== Mail Sub-client =====\r\n\r\nclass MailClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async send(params: SendMailParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/send\", params);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getInbox(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/inbox?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getSent(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/sent?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getTrash(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/trash?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getMessage(id: string): Promise<MailMessage> {\r\n return this.rc.get<MailMessage>(`/mail/message/${encodeURIComponent(id)}`);\r\n }\r\n\r\n async move(messageId: string, folder: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/move\", {\r\n messageId,\r\n folder,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/read\", {\r\n messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async delete(id: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/mail/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Messenger Sub-client =====\r\n\r\nclass MessengerClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getWallets(): Promise<MessengerWallet[]> {\r\n const data = await this.rc.get<{ wallets: MessengerWallet[] }>(\"/messenger/wallets\");\r\n return data.wallets ?? [];\r\n }\r\n\r\n async registerWallet(opts: {\r\n id: string;\r\n displayName: string;\r\n signingPublicKey: string;\r\n encryptionPublicKey: string;\r\n }): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/wallets/register\", opts);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getConversations(\r\n walletId: string,\r\n opts: { signingPublicKey?: string; encryptionPublicKey?: string } = {}\r\n ): Promise<MessengerConversation[]> {\r\n const params = new URLSearchParams({ walletId });\r\n if (opts.signingPublicKey) params.set(\"signingPublicKey\", opts.signingPublicKey);\r\n if (opts.encryptionPublicKey) params.set(\"encryptionPublicKey\", opts.encryptionPublicKey);\r\n const data = await this.rc.get<{ conversations: MessengerConversation[] }>(\r\n `/messenger/conversations?${params.toString()}`\r\n );\r\n return data.conversations ?? [];\r\n }\r\n\r\n async createConversation(participants: string[]): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/conversations\", {\r\n participants,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getMessages(conversationId: string): Promise<MessengerMessage[]> {\r\n const data = await this.rc.get<{ messages: MessengerMessage[] }>(\r\n `/messenger/messages?conversationId=${encodeURIComponent(conversationId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async sendMessage(\r\n conversationId: string,\r\n sender: string,\r\n encryptedContent: string,\r\n opts: {\r\n mediaType?: string;\r\n mediaData?: string;\r\n selfDestruct?: boolean;\r\n destructAfterSeconds?: number;\r\n } = {}\r\n ): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages\", {\r\n conversation_id: conversationId,\r\n sender,\r\n encrypted_content: encryptedContent,\r\n media_type: opts.mediaType,\r\n media_data: opts.mediaData,\r\n self_destruct: opts.selfDestruct,\r\n destruct_after_seconds: opts.destructAfterSeconds,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/messenger/messages/${encodeURIComponent(messageId)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages/read\", {\r\n message_id: messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Shielded Sub-client =====\r\n\r\nclass ShieldedClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getStats(): Promise<ShieldedStats> {\r\n return this.rc.get<ShieldedStats>(\"/shielded/stats\");\r\n }\r\n\r\n async isNullifierSpent(\r\n nullifierHex: string\r\n ): Promise<{ spent: boolean }> {\r\n return this.rc.get<{ spent: boolean }>(\r\n `/shielded/nullifier/${encodeURIComponent(nullifierHex)}`\r\n );\r\n }\r\n\r\n // Write operations\r\n\r\n /**\r\n * Shield public XRGE into a private note.\r\n * Creates the commitment client-side, submits to the chain.\r\n *\r\n * @returns The ShieldedNote (keep this locally — it's the only way to spend the note)\r\n */\r\n async shield(\r\n wallet: WalletKeys,\r\n params: ShieldParams\r\n ): Promise<ApiResponse & { note?: ShieldedNote }> {\r\n const note = createShieldedNote(params.amount, wallet.publicKey);\r\n const tx = createSignedShield(wallet, params.amount, note.commitment);\r\n const result = await this.rc.submitTx(\"/v2/shielded/shield\", tx);\r\n if (result.success) {\r\n return { ...result, note };\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Transfer between shielded notes (private → private).\r\n * Requires a pre-generated STARK proof.\r\n */\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: ShieldedTransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedShieldedTransfer(\r\n wallet,\r\n params.nullifiers,\r\n params.outputCommitments,\r\n params.proof,\r\n params.shieldedFee\r\n );\r\n return this.rc.submitTx(\"/v2/shielded/transfer\", tx);\r\n }\r\n\r\n /**\r\n * Unshield a private note back to public XRGE.\r\n * Requires a STARK proof of note ownership.\r\n */\r\n async unshield(\r\n wallet: WalletKeys,\r\n params: UnshieldParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnshield(\r\n wallet,\r\n params.nullifiers,\r\n params.amount,\r\n params.proof\r\n );\r\n return this.rc.submitTx(\"/v2/shielded/unshield\", tx);\r\n }\r\n}\r\n\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { bytesToHex, hexToBytes } from \"./utils.js\";\r\nimport type { WalletKeys } from \"./types.js\";\r\n\r\nexport class Wallet implements WalletKeys {\r\n public readonly publicKey: string;\r\n public readonly privateKey: string;\r\n\r\n private constructor(publicKey: string, privateKey: string) {\r\n this.publicKey = publicKey;\r\n this.privateKey = privateKey;\r\n }\r\n\r\n /**\r\n * Generate a new ML-DSA-65 keypair.\r\n * Uses crypto.getRandomValues for secure randomness.\r\n */\r\n static generate(): Wallet {\r\n const keypair = ml_dsa65.keygen();\r\n return new Wallet(\r\n bytesToHex(keypair.publicKey),\r\n bytesToHex(keypair.secretKey)\r\n );\r\n }\r\n\r\n /**\r\n * Restore a wallet from existing hex-encoded keys.\r\n */\r\n static fromKeys(publicKey: string, privateKey: string): Wallet {\r\n return new Wallet(publicKey, privateKey);\r\n }\r\n\r\n /**\r\n * Export keys as a plain object (for serialization/storage).\r\n */\r\n toJSON(): WalletKeys {\r\n return { publicKey: this.publicKey, privateKey: this.privateKey };\r\n }\r\n\r\n /**\r\n * Verify that the keypair is valid by signing and verifying a test message.\r\n */\r\n verify(): boolean {\r\n try {\r\n const msg = new TextEncoder().encode(\"rougechain-verify\");\r\n const sig = ml_dsa65.sign(msg, hexToBytes(this.privateKey));\r\n return ml_dsa65.verify(sig, msg, hexToBytes(this.publicKey));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/signer.ts","../src/shielded.ts","../src/client.ts","../src/address.ts","../src/wallet.ts"],"names":["hexToBytes","bytesToHex","sha256","ml_dsa65"],"mappings":"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","file":"index.js","sourcesContent":["export function hexToBytes(hex: string): Uint8Array {\r\n const bytes = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n}\r\n\r\nexport function generateNonce(): string {\r\n const bytes = crypto.getRandomValues(new Uint8Array(16));\r\n return bytesToHex(bytes);\r\n}\r\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { hexToBytes, bytesToHex, generateNonce } from \"./utils.js\";\r\nimport type {\r\n TransactionPayload,\r\n SignedTransaction,\r\n WalletKeys,\r\n} from \"./types.js\";\r\n\r\nexport const BURN_ADDRESS =\r\n \"XRGE_BURN_0x000000000000000000000000000000000000000000000000000000000000DEAD\";\r\n\r\nfunction sortKeysDeep(obj: unknown): unknown {\r\n if (Array.isArray(obj)) return obj.map(sortKeysDeep);\r\n if (obj !== null && typeof obj === \"object\") {\r\n const sorted: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj).sort()) {\r\n sorted[key] = sortKeysDeep((obj as Record<string, unknown>)[key]);\r\n }\r\n return sorted;\r\n }\r\n return obj;\r\n}\r\n\r\nexport function serializePayload(payload: TransactionPayload): Uint8Array {\r\n const json = JSON.stringify(sortKeysDeep(payload));\r\n return new TextEncoder().encode(json);\r\n}\r\n\r\nexport function signTransaction(\r\n payload: TransactionPayload,\r\n privateKey: string,\r\n publicKey: string\r\n): SignedTransaction {\r\n const payloadBytes = serializePayload(payload);\r\n const signature = ml_dsa65.sign(payloadBytes, hexToBytes(privateKey));\r\n return {\r\n payload,\r\n signature: bytesToHex(signature),\r\n public_key: publicKey,\r\n };\r\n}\r\n\r\nexport function verifyTransaction(signedTx: SignedTransaction): boolean {\r\n try {\r\n const payloadBytes = serializePayload(signedTx.payload);\r\n return ml_dsa65.verify(\r\n hexToBytes(signedTx.signature),\r\n payloadBytes,\r\n hexToBytes(signedTx.public_key)\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function isBurnAddress(address: string): boolean {\r\n return address === BURN_ADDRESS;\r\n}\r\n\r\n// ===== Transaction builders =====\r\n\r\nfunction buildAndSign(\r\n wallet: WalletKeys,\r\n payload: Omit<TransactionPayload, \"from\" | \"timestamp\" | \"nonce\">\r\n): SignedTransaction {\r\n const full: TransactionPayload = {\r\n ...payload,\r\n from: wallet.publicKey,\r\n timestamp: Date.now(),\r\n nonce: generateNonce(),\r\n } as TransactionPayload;\r\n return signTransaction(full, wallet.privateKey, wallet.publicKey);\r\n}\r\n\r\nexport function createSignedTransfer(\r\n wallet: WalletKeys,\r\n to: string,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"transfer\", to, amount, fee, token });\r\n}\r\n\r\nexport function createSignedTokenCreation(\r\n wallet: WalletKeys,\r\n tokenName: string,\r\n tokenSymbol: string,\r\n initialSupply: number,\r\n fee = 10,\r\n image?: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_token\",\r\n token_name: tokenName,\r\n token_symbol: tokenSymbol,\r\n initial_supply: initialSupply,\r\n fee,\r\n ...(image ? { image } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataUpdate(\r\n wallet: WalletKeys,\r\n tokenSymbol: string,\r\n metadata: {\r\n image?: string;\r\n description?: string;\r\n website?: string;\r\n twitter?: string;\r\n discord?: string;\r\n }\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"update_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n ...(metadata.image !== undefined ? { image: metadata.image } : {}),\r\n ...(metadata.description !== undefined ? { description: metadata.description } : {}),\r\n ...(metadata.website !== undefined ? { website: metadata.website } : {}),\r\n ...(metadata.twitter !== undefined ? { twitter: metadata.twitter } : {}),\r\n ...(metadata.discord !== undefined ? { discord: metadata.discord } : {}),\r\n });\r\n}\r\n\r\nexport function createSignedTokenMetadataClaim(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"claim_token_metadata\",\r\n token_symbol: tokenSymbol,\r\n });\r\n}\r\n\r\nexport function createSignedSwap(\r\n wallet: WalletKeys,\r\n tokenIn: string,\r\n tokenOut: string,\r\n amountIn: number,\r\n minAmountOut: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"swap\",\r\n token_in: tokenIn,\r\n token_out: tokenOut,\r\n amount_in: amountIn,\r\n min_amount_out: minAmountOut,\r\n });\r\n}\r\n\r\nexport function createSignedPoolCreation(\r\n wallet: WalletKeys,\r\n tokenA: string,\r\n tokenB: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"create_pool\",\r\n token_a: tokenA,\r\n token_b: tokenB,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedAddLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n amountA: number,\r\n amountB: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"add_liquidity\",\r\n pool_id: poolId,\r\n amount_a: amountA,\r\n amount_b: amountB,\r\n });\r\n}\r\n\r\nexport function createSignedRemoveLiquidity(\r\n wallet: WalletKeys,\r\n poolId: string,\r\n lpAmount: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"remove_liquidity\",\r\n pool_id: poolId,\r\n lp_amount: lpAmount,\r\n });\r\n}\r\n\r\nexport function createSignedStake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"stake\", amount, fee });\r\n}\r\n\r\nexport function createSignedUnstake(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"unstake\", amount, fee });\r\n}\r\n\r\nexport function createSignedFaucetRequest(\r\n wallet: WalletKeys\r\n): SignedTransaction {\r\n return buildAndSign(wallet, { type: \"faucet\" });\r\n}\r\n\r\nexport function createSignedBurn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"transfer\",\r\n to: BURN_ADDRESS,\r\n amount,\r\n fee,\r\n token,\r\n });\r\n}\r\n\r\n// ===== Bridge builders =====\r\n\r\nexport function createSignedBridgeWithdraw(\r\n wallet: WalletKeys,\r\n amount: number,\r\n evmAddress: string,\r\n tokenSymbol = \"qETH\",\r\n fee = 0.1\r\n): SignedTransaction {\r\n const evm = evmAddress.startsWith(\"0x\") ? evmAddress : `0x${evmAddress}`;\r\n return buildAndSign(wallet, {\r\n type: \"bridge_withdraw\",\r\n amount,\r\n fee,\r\n tokenSymbol,\r\n evmAddress: evm,\r\n });\r\n}\r\n\r\n// ===== NFT builders =====\r\n\r\nexport function createSignedNftCreateCollection(\r\n wallet: WalletKeys,\r\n symbol: string,\r\n name: string,\r\n opts: {\r\n maxSupply?: number;\r\n royaltyBps?: number;\r\n image?: string;\r\n description?: string;\r\n } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_create_collection\",\r\n symbol,\r\n name,\r\n fee: 50,\r\n maxSupply: opts.maxSupply,\r\n royaltyBps: opts.royaltyBps,\r\n image: opts.image,\r\n description: opts.description,\r\n });\r\n}\r\n\r\nexport function createSignedNftMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n name: string,\r\n opts: { metadataUri?: string; attributes?: unknown } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_mint\",\r\n collectionId,\r\n name,\r\n fee: 5,\r\n metadataUri: opts.metadataUri,\r\n attributes: opts.attributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftBatchMint(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n names: string[],\r\n opts: { uris?: string[]; batchAttributes?: unknown[] } = {}\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_batch_mint\",\r\n collectionId,\r\n names,\r\n fee: 5 * names.length,\r\n uris: opts.uris,\r\n batchAttributes: opts.batchAttributes,\r\n });\r\n}\r\n\r\nexport function createSignedNftTransfer(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n to: string,\r\n salePrice?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_transfer\",\r\n collectionId,\r\n tokenId,\r\n to,\r\n fee: 1,\r\n salePrice,\r\n });\r\n}\r\n\r\nexport function createSignedNftBurn(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_burn\",\r\n collectionId,\r\n tokenId,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftLock(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n tokenId: number,\r\n locked: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_lock\",\r\n collectionId,\r\n tokenId,\r\n locked,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\nexport function createSignedNftFreezeCollection(\r\n wallet: WalletKeys,\r\n collectionId: string,\r\n frozen: boolean\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"nft_freeze_collection\",\r\n collectionId,\r\n frozen,\r\n fee: 0.1,\r\n });\r\n}\r\n\r\n// ===== Shielded transaction builders =====\r\n\r\nexport function createSignedShield(\r\n wallet: WalletKeys,\r\n amount: number,\r\n commitment: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"shield\",\r\n amount,\r\n commitment,\r\n } as any);\r\n}\r\n\r\nexport function createSignedShieldedTransfer(\r\n wallet: WalletKeys,\r\n nullifiers: string[],\r\n outputCommitments: string[],\r\n proof: string,\r\n shieldedFee?: number\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"shielded_transfer\",\r\n nullifiers,\r\n output_commitments: outputCommitments,\r\n proof,\r\n fee: shieldedFee ?? 0,\r\n } as any);\r\n}\r\n\r\nexport function createSignedUnshield(\r\n wallet: WalletKeys,\r\n nullifiers: string[],\r\n amount: number,\r\n proof: string\r\n): SignedTransaction {\r\n return buildAndSign(wallet, {\r\n type: \"unshield\",\r\n nullifiers,\r\n amount,\r\n proof,\r\n } as any);\r\n}\r\n\r\n","/**\n * Client-side shielded transaction crypto primitives.\n *\n * Mirrors the Rust commitment.rs exactly:\n * commitment = SHA-256(\"ROUGECHAIN_COMMITMENT_V1\" || value || pubkey || randomness)\n * nullifier = SHA-256(\"ROUGECHAIN_NULLIFIER_V1\" || randomness || commitment)\n */\n\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { bytesToHex } from \"./utils.js\";\n\nconst COMMITMENT_DOMAIN = new TextEncoder().encode(\"ROUGECHAIN_COMMITMENT_V1\");\nconst NULLIFIER_DOMAIN = new TextEncoder().encode(\"ROUGECHAIN_NULLIFIER_V1\");\n\n/** Generate 32 bytes of cryptographically secure randomness (hex-encoded). */\nexport function generateRandomness(): string {\n const buf = new Uint8Array(32);\n crypto.getRandomValues(buf);\n return bytesToHex(buf);\n}\n\n/** Encode a u64 value as 8 big-endian bytes. */\nfunction u64ToBytes(value: number): Uint8Array {\n const buf = new Uint8Array(8);\n const view = new DataView(buf.buffer);\n // JS numbers are safe up to 2^53, sufficient for XRGE amounts\n view.setBigUint64(0, BigInt(value), false); // big-endian\n return buf;\n}\n\n/** Decode a hex string to Uint8Array. */\nfunction hexToU8(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const bytes = new Uint8Array(clean.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Compute a shielded note commitment.\n *\n * @param value - Note value in XRGE (integer)\n * @param ownerPubKey - Owner's ML-DSA-65 public key (hex)\n * @param randomness - 32-byte blinding factor (hex)\n * @returns 32-byte commitment hash (hex)\n */\nexport function computeCommitment(\n value: number,\n ownerPubKey: string,\n randomness: string\n): string {\n const valueBytes = u64ToBytes(value);\n const pubkeyBytes = hexToU8(ownerPubKey);\n const randBytes = hexToU8(randomness);\n\n // Concatenate: domain || value || pubkey || randomness\n const input = new Uint8Array(\n COMMITMENT_DOMAIN.length + valueBytes.length + pubkeyBytes.length + randBytes.length\n );\n let offset = 0;\n input.set(COMMITMENT_DOMAIN, offset); offset += COMMITMENT_DOMAIN.length;\n input.set(valueBytes, offset); offset += valueBytes.length;\n input.set(pubkeyBytes, offset); offset += pubkeyBytes.length;\n input.set(randBytes, offset);\n\n return bytesToHex(sha256(input));\n}\n\n/**\n * Compute a nullifier for a shielded note.\n *\n * @param randomness - The note's blinding factor (hex)\n * @param commitment - The note's commitment hash (hex)\n * @returns 32-byte nullifier hash (hex)\n */\nexport function computeNullifier(\n randomness: string,\n commitment: string\n): string {\n const randBytes = hexToU8(randomness);\n const commitBytes = hexToU8(commitment);\n\n const input = new Uint8Array(\n NULLIFIER_DOMAIN.length + randBytes.length + commitBytes.length\n );\n let offset = 0;\n input.set(NULLIFIER_DOMAIN, offset); offset += NULLIFIER_DOMAIN.length;\n input.set(randBytes, offset); offset += randBytes.length;\n input.set(commitBytes, offset);\n\n return bytesToHex(sha256(input));\n}\n\n/** A shielded note — kept locally by the owner (never sent to chain). */\nexport interface ShieldedNote {\n commitment: string;\n nullifier: string;\n value: number;\n randomness: string;\n ownerPubKey: string;\n}\n\n/**\n * Create a new shielded note for a given value.\n *\n * @param value - XRGE amount (integer)\n * @param ownerPubKey - Owner's public key (hex)\n * @returns A ShieldedNote with all derived fields\n */\nexport function createShieldedNote(\n value: number,\n ownerPubKey: string\n): ShieldedNote {\n const randomness = generateRandomness();\n const commitment = computeCommitment(value, ownerPubKey, randomness);\n const nullifier = computeNullifier(randomness, commitment);\n return { commitment, nullifier, value, randomness, ownerPubKey };\n}\n","import {\r\n createSignedTransfer,\r\n createSignedTokenCreation,\r\n createSignedSwap,\r\n createSignedPoolCreation,\r\n createSignedAddLiquidity,\r\n createSignedRemoveLiquidity,\r\n createSignedStake,\r\n createSignedUnstake,\r\n createSignedFaucetRequest,\r\n createSignedBurn,\r\n createSignedBridgeWithdraw,\r\n createSignedNftCreateCollection,\r\n createSignedNftMint,\r\n createSignedNftBatchMint,\r\n createSignedNftTransfer,\r\n createSignedNftBurn,\r\n createSignedNftLock,\r\n createSignedNftFreezeCollection,\r\n createSignedTokenMetadataUpdate,\r\n createSignedTokenMetadataClaim,\r\n createSignedShield,\r\n createSignedShieldedTransfer,\r\n createSignedUnshield,\r\n} from \"./signer.js\";\r\nimport type {\r\n WalletKeys,\r\n ApiResponse,\r\n SignedTransaction,\r\n NodeStats,\r\n Block,\r\n TokenMetadata,\r\n BalanceResponse,\r\n LiquidityPool,\r\n SwapQuote,\r\n PoolEvent,\r\n PoolStats,\r\n NftCollection,\r\n NftToken,\r\n Validator,\r\n BridgeConfig,\r\n BridgeWithdrawal,\r\n XrgeBridgeConfig,\r\n TransferParams,\r\n CreateTokenParams,\r\n SwapParams,\r\n CreatePoolParams,\r\n AddLiquidityParams,\r\n RemoveLiquidityParams,\r\n StakeParams,\r\n CreateNftCollectionParams,\r\n MintNftParams,\r\n BatchMintNftParams,\r\n TransferNftParams,\r\n BurnNftParams,\r\n LockNftParams,\r\n FreezeCollectionParams,\r\n BridgeWithdrawParams,\r\n BridgeClaimParams,\r\n XrgeBridgeClaimParams,\r\n XrgeBridgeWithdrawParams,\r\n SwapQuoteParams,\r\n TokenMetadataUpdateParams,\r\n TokenHolder,\r\n MailMessage,\r\n SendMailParams,\r\n MessengerWallet,\r\n MessengerConversation,\r\n MessengerMessage,\r\n PriceSnapshot,\r\n ShieldParams,\r\n ShieldedTransferParams,\r\n UnshieldParams,\r\n ShieldedStats,\r\n RollupStatus,\r\n RollupBatchResult,\r\n RollupSubmitParams,\r\n RollupSubmitResult,\r\n} from \"./types.js\";\r\nimport { createShieldedNote, type ShieldedNote } from \"./shielded.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 public readonly shielded: ShieldedClient;\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 this.shielded = new ShieldedClient(this);\r\n }\r\n\r\n // ===== Internal helpers =====\r\n\r\n /** @internal */\r\n async get<T = unknown>(path: string): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n headers: this.headers,\r\n });\r\n if (!res.ok) {\r\n throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async post<T = unknown>(path: string, body: unknown): Promise<T> {\r\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(\r\n `POST ${path} failed: ${res.status} ${res.statusText} ${text}`\r\n );\r\n }\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** @internal */\r\n async submitTx(\r\n endpoint: string,\r\n signedTx: SignedTransaction\r\n ): Promise<ApiResponse> {\r\n try {\r\n const raw = await this.post<Record<string, unknown>>(endpoint, signedTx);\r\n const { success, error, ...rest } = raw;\r\n return {\r\n success: success as boolean,\r\n error: error as string | undefined,\r\n data: Object.keys(rest).length > 0 ? rest : undefined,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ===== Stats & Health =====\r\n\r\n async getStats(): Promise<NodeStats> {\r\n return this.get<NodeStats>(\"/stats\");\r\n }\r\n\r\n async getHealth(): Promise<{ status: string; chain_id: string; height: number }> {\r\n return this.get(\"/health\");\r\n }\r\n\r\n // ===== Blocks =====\r\n\r\n async getBlocks(opts: { limit?: number } = {}): Promise<Block[]> {\r\n const q = opts.limit ? `?limit=${opts.limit}` : \"\";\r\n const data = await this.get<{ blocks: Block[] }>(`/blocks${q}`);\r\n return data.blocks;\r\n }\r\n\r\n async getBlocksSummary(\r\n range: \"1h\" | \"24h\" | \"7d\" = \"24h\"\r\n ): Promise<unknown> {\r\n return this.get(`/blocks/summary?range=${range}`);\r\n }\r\n\r\n // ===== Balance =====\r\n\r\n async getBalance(publicKey: string): Promise<BalanceResponse> {\r\n return this.get<BalanceResponse>(`/balance/${publicKey}`);\r\n }\r\n\r\n async getTokenBalance(publicKey: string, token: string): Promise<number> {\r\n const data = await this.get<{ balance: number }>(\r\n `/balance/${publicKey}/${token}`\r\n );\r\n return data.balance;\r\n }\r\n\r\n // ===== Transactions =====\r\n\r\n async getTransactions(\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<unknown> {\r\n const params = new URLSearchParams();\r\n if (opts.limit) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.get(`/txs${q ? `?${q}` : \"\"}`);\r\n }\r\n\r\n // ===== Tokens =====\r\n\r\n async getTokens(): Promise<TokenMetadata[]> {\r\n const data = await this.get<{ tokens: TokenMetadata[]; success: boolean }>(\r\n \"/tokens\"\r\n );\r\n return data.tokens;\r\n }\r\n\r\n async getTokenMetadata(symbol: string): Promise<TokenMetadata> {\r\n return this.get<TokenMetadata>(`/token/${symbol}/metadata`);\r\n }\r\n\r\n async getTokenHolders(\r\n symbol: string\r\n ): Promise<TokenHolder[]> {\r\n const data = await this.get<{ holders: TokenHolder[] }>(\r\n `/token/${symbol}/holders`\r\n );\r\n return data.holders;\r\n }\r\n\r\n async getTokenTransactions(\r\n symbol: string\r\n ): Promise<unknown> {\r\n return this.get(`/token/${symbol}/transactions`);\r\n }\r\n\r\n // ===== Validators =====\r\n\r\n async getValidators(): Promise<Validator[]> {\r\n const data = await this.get<{ validators: Validator[] }>(\"/validators\");\r\n return data.validators;\r\n }\r\n\r\n async getValidatorStats(): Promise<unknown> {\r\n return this.get(\"/validators/stats\");\r\n }\r\n\r\n async getFinality(): Promise<{\r\n finalized_height: number;\r\n tip_height: number;\r\n total_stake: number;\r\n finalized_stake: number;\r\n }> {\r\n return this.get(\"/finality\");\r\n }\r\n\r\n // ===== Peers =====\r\n\r\n async getPeers(): Promise<string[]> {\r\n const data = await this.get<{ peers: string[] }>(\"/peers\");\r\n return data.peers;\r\n }\r\n\r\n // ===== Burned =====\r\n\r\n async getBurnedTokens(): Promise<{\r\n burned: Record<string, number>;\r\n total_xrge_burned: number;\r\n }> {\r\n return this.get(\"/burned\");\r\n }\r\n\r\n // ===== Write operations =====\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTransfer(\r\n wallet,\r\n params.to,\r\n params.amount,\r\n params.fee,\r\n params.token\r\n );\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async createToken(\r\n wallet: WalletKeys,\r\n params: CreateTokenParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenCreation(\r\n wallet,\r\n params.name,\r\n params.symbol,\r\n params.totalSupply,\r\n params.fee,\r\n params.image\r\n );\r\n return this.submitTx(\"/v2/token/create\", tx);\r\n }\r\n\r\n async stake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedStake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/stake\", tx);\r\n }\r\n\r\n async unstake(\r\n wallet: WalletKeys,\r\n params: StakeParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnstake(wallet, params.amount, params.fee);\r\n return this.submitTx(\"/v2/unstake\", tx);\r\n }\r\n\r\n async faucet(wallet: WalletKeys): Promise<ApiResponse> {\r\n const tx = createSignedFaucetRequest(wallet);\r\n return this.submitTx(\"/v2/faucet\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n amount: number,\r\n fee = 1,\r\n token = \"XRGE\"\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedBurn(wallet, amount, fee, token);\r\n return this.submitTx(\"/v2/transfer\", tx);\r\n }\r\n\r\n async updateTokenMetadata(\r\n wallet: WalletKeys,\r\n params: TokenMetadataUpdateParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataUpdate(wallet, params.symbol, {\r\n image: params.image,\r\n description: params.description,\r\n website: params.website,\r\n twitter: params.twitter,\r\n discord: params.discord,\r\n });\r\n return this.submitTx(\"/v2/token/metadata/update\", tx);\r\n }\r\n\r\n async claimTokenMetadata(\r\n wallet: WalletKeys,\r\n tokenSymbol: string\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedTokenMetadataClaim(wallet, tokenSymbol);\r\n return this.submitTx(\"/v2/token/metadata/claim\", tx);\r\n }\r\n\r\n // ===== Rollup =====\r\n\r\n /** Get the current rollup accumulator status. */\r\n async getRollupStatus(): Promise<RollupStatus> {\r\n const data = await this.get<{ rollup: RollupStatus }>(\"/v2/rollup/status\");\r\n return data.rollup;\r\n }\r\n\r\n /** Submit a transfer into the rollup batch accumulator. */\r\n async submitRollupTransfer(\r\n params: RollupSubmitParams\r\n ): Promise<RollupSubmitResult> {\r\n return this.post<RollupSubmitResult>(\"/v2/rollup/submit\", params);\r\n }\r\n\r\n /** Get the result of a completed rollup batch by ID. */\r\n async getRollupBatch(batchId: number): Promise<RollupBatchResult> {\r\n const data = await this.get<{ batch: RollupBatchResult }>(\r\n `/v2/rollup/batch/${batchId}`\r\n );\r\n return data.batch;\r\n }\r\n}\r\n\r\n// ===== NFT Sub-client =====\r\n\r\nclass NftClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getCollections(): Promise<NftCollection[]> {\r\n const data = await this.rc.get<{ collections: NftCollection[] }>(\r\n \"/nft/collections\"\r\n );\r\n return data.collections;\r\n }\r\n\r\n async getCollection(collectionId: string): Promise<NftCollection> {\r\n return this.rc.get<NftCollection>(\r\n `/nft/collection/${encodeURIComponent(collectionId)}`\r\n );\r\n }\r\n\r\n /**\r\n * Poll until a collection exists on-chain (i.e. the create tx has been mined).\r\n * Useful after `createCollection` since the tx goes to the mempool first.\r\n * @returns the collection once found, or throws after the timeout.\r\n */\r\n async waitForCollection(\r\n collectionId: string,\r\n opts: { timeoutMs?: number; pollMs?: number } = {}\r\n ): Promise<NftCollection> {\r\n const timeout = opts.timeoutMs ?? 30_000;\r\n const poll = opts.pollMs ?? 1_000;\r\n const deadline = Date.now() + timeout;\r\n while (Date.now() < deadline) {\r\n try {\r\n return await this.getCollection(collectionId);\r\n } catch {\r\n await new Promise((r) => setTimeout(r, poll));\r\n }\r\n }\r\n throw new Error(\r\n `Collection \"${collectionId}\" not found after ${timeout}ms — the create transaction may not have been mined yet`\r\n );\r\n }\r\n\r\n async getTokens(\r\n collectionId: string,\r\n opts: { limit?: number; offset?: number } = {}\r\n ): Promise<{ tokens: NftToken[]; total: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\r\n if (opts.offset !== undefined) params.set(\"offset\", String(opts.offset));\r\n const q = params.toString();\r\n return this.rc.get(\r\n `/nft/collection/${encodeURIComponent(collectionId)}/tokens${q ? `?${q}` : \"\"}`\r\n );\r\n }\r\n\r\n async getToken(\r\n collectionId: string,\r\n tokenId: number\r\n ): Promise<NftToken> {\r\n return this.rc.get<NftToken>(\r\n `/nft/token/${encodeURIComponent(collectionId)}/${tokenId}`\r\n );\r\n }\r\n\r\n async getByOwner(pubkey: string): Promise<NftToken[]> {\r\n const data = await this.rc.get<{ nfts: NftToken[] }>(\r\n `/nft/owner/${encodeURIComponent(pubkey)}`\r\n );\r\n return data.nfts;\r\n }\r\n\r\n // Write operations\r\n\r\n async createCollection(\r\n wallet: WalletKeys,\r\n params: CreateNftCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftCreateCollection(wallet, params.symbol, params.name, {\r\n maxSupply: params.maxSupply,\r\n royaltyBps: params.royaltyBps,\r\n image: params.image,\r\n description: params.description,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/collection/create\", tx);\r\n }\r\n\r\n async mint(\r\n wallet: WalletKeys,\r\n params: MintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftMint(wallet, params.collectionId, params.name, {\r\n metadataUri: params.metadataUri,\r\n attributes: params.attributes,\r\n });\r\n return this.rc.submitTx(\"/v2/nft/mint\", tx);\r\n }\r\n\r\n async batchMint(\r\n wallet: WalletKeys,\r\n params: BatchMintNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBatchMint(\r\n wallet,\r\n params.collectionId,\r\n params.names,\r\n { uris: params.uris, batchAttributes: params.batchAttributes }\r\n );\r\n return this.rc.submitTx(\"/v2/nft/batch-mint\", tx);\r\n }\r\n\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: TransferNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftTransfer(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.to,\r\n params.salePrice\r\n );\r\n return this.rc.submitTx(\"/v2/nft/transfer\", tx);\r\n }\r\n\r\n async burn(\r\n wallet: WalletKeys,\r\n params: BurnNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftBurn(wallet, params.collectionId, params.tokenId);\r\n return this.rc.submitTx(\"/v2/nft/burn\", tx);\r\n }\r\n\r\n async lock(\r\n wallet: WalletKeys,\r\n params: LockNftParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftLock(\r\n wallet,\r\n params.collectionId,\r\n params.tokenId,\r\n params.locked\r\n );\r\n return this.rc.submitTx(\"/v2/nft/lock\", tx);\r\n }\r\n\r\n async freezeCollection(\r\n wallet: WalletKeys,\r\n params: FreezeCollectionParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedNftFreezeCollection(\r\n wallet,\r\n params.collectionId,\r\n params.frozen\r\n );\r\n return this.rc.submitTx(\"/v2/nft/freeze-collection\", tx);\r\n }\r\n}\r\n\r\n// ===== DEX Sub-client =====\r\n\r\nclass DexClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getPools(): Promise<LiquidityPool[]> {\r\n const data = await this.rc.get<{ pools: LiquidityPool[] }>(\"/pools\");\r\n return data.pools;\r\n }\r\n\r\n async getPool(poolId: string): Promise<LiquidityPool> {\r\n return this.rc.get<LiquidityPool>(`/pool/${poolId}`);\r\n }\r\n\r\n async getPoolEvents(poolId: string): Promise<PoolEvent[]> {\r\n const data = await this.rc.get<{ events: PoolEvent[] }>(\r\n `/pool/${poolId}/events`\r\n );\r\n return data.events;\r\n }\r\n\r\n async getPriceHistory(poolId: string): Promise<PriceSnapshot[]> {\r\n const data = await this.rc.get<{ prices: PriceSnapshot[] }>(\r\n `/pool/${poolId}/prices`\r\n );\r\n return data.prices;\r\n }\r\n\r\n async getPoolStats(poolId: string): Promise<PoolStats> {\r\n return this.rc.get<PoolStats>(`/pool/${poolId}/stats`);\r\n }\r\n\r\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\r\n return this.rc.post<SwapQuote>(\"/swap/quote\", {\r\n pool_id: params.poolId,\r\n token_in: params.tokenIn,\r\n token_out: params.tokenOut,\r\n amount_in: params.amountIn,\r\n });\r\n }\r\n\r\n // Write operations\r\n\r\n async swap(\r\n wallet: WalletKeys,\r\n params: SwapParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedSwap(\r\n wallet,\r\n params.tokenIn,\r\n params.tokenOut,\r\n params.amountIn,\r\n params.minAmountOut\r\n );\r\n return this.rc.submitTx(\"/v2/swap/execute\", tx);\r\n }\r\n\r\n async createPool(\r\n wallet: WalletKeys,\r\n params: CreatePoolParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedPoolCreation(\r\n wallet,\r\n params.tokenA,\r\n params.tokenB,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/create\", tx);\r\n }\r\n\r\n async addLiquidity(\r\n wallet: WalletKeys,\r\n params: AddLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedAddLiquidity(\r\n wallet,\r\n params.poolId,\r\n params.amountA,\r\n params.amountB\r\n );\r\n return this.rc.submitTx(\"/v2/pool/add-liquidity\", tx);\r\n }\r\n\r\n async removeLiquidity(\r\n wallet: WalletKeys,\r\n params: RemoveLiquidityParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedRemoveLiquidity(wallet, params.poolId, params.lpAmount);\r\n return this.rc.submitTx(\"/v2/pool/remove-liquidity\", tx);\r\n }\r\n}\r\n\r\n// ===== Bridge Sub-client =====\r\n\r\nclass BridgeClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getConfig(): Promise<BridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n custodyAddress: data.custodyAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n supportedTokens: data.supportedTokens as string[] | undefined,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async getWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n }\r\n\r\n /** Withdraw qETH/qUSDC — signed client-side, private key never sent to server */\r\n async withdraw(\r\n wallet: WalletKeys,\r\n params: BridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const tokenSymbol = params.tokenSymbol ?? \"qETH\";\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n tokenSymbol,\r\n params.fee\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amountUnits: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n /** Claim qETH or qUSDC after depositing on Base Sepolia */\r\n async claim(params: BridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n evmSignature: params.evmSignature,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n token: params.token ?? \"ETH\",\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n // ── XRGE Bridge ──\r\n\r\n async getXrgeConfig(): Promise<XrgeBridgeConfig> {\r\n try {\r\n const data = await this.rc.get<Record<string, unknown>>(\"/bridge/xrge/config\");\r\n return {\r\n enabled: data.enabled === true,\r\n vaultAddress: data.vaultAddress as string | undefined,\r\n tokenAddress: data.tokenAddress as string | undefined,\r\n chainId: (data.chainId as number) ?? 84532,\r\n };\r\n } catch {\r\n return { enabled: false, chainId: 84532 };\r\n }\r\n }\r\n\r\n async claimXrge(params: XrgeBridgeClaimParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/claim\",\r\n {\r\n evmTxHash: params.evmTxHash.startsWith(\"0x\")\r\n ? params.evmTxHash\r\n : `0x${params.evmTxHash}`,\r\n evmAddress: params.evmAddress.startsWith(\"0x\")\r\n ? params.evmAddress\r\n : `0x${params.evmAddress}`,\r\n amount: params.amount,\r\n recipientRougechainPubkey: params.recipientPubkey,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async withdrawXrge(\r\n wallet: WalletKeys,\r\n params: XrgeBridgeWithdrawParams\r\n ): Promise<ApiResponse> {\r\n try {\r\n const signed = createSignedBridgeWithdraw(\r\n wallet,\r\n params.amount,\r\n params.evmAddress,\r\n \"XRGE\",\r\n 0.1\r\n );\r\n const data = await this.rc.post<Record<string, unknown>>(\r\n \"/bridge/xrge/withdraw\",\r\n {\r\n fromPublicKey: wallet.publicKey,\r\n amount: params.amount,\r\n evmAddress: signed.payload.evmAddress,\r\n signature: signed.signature,\r\n payload: signed.payload,\r\n }\r\n );\r\n return {\r\n success: data.success === true,\r\n error: data.error as string | undefined,\r\n data,\r\n };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getXrgeWithdrawals(): Promise<BridgeWithdrawal[]> {\r\n try {\r\n const data = await this.rc.get<{ withdrawals: BridgeWithdrawal[] }>(\r\n \"/bridge/xrge/withdrawals\"\r\n );\r\n return data.withdrawals;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n// ===== Mail Sub-client =====\r\n\r\nclass MailClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async send(params: SendMailParams): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/send\", params);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getInbox(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/inbox?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getSent(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/sent?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getTrash(walletId: string): Promise<MailMessage[]> {\r\n const data = await this.rc.get<{ messages: MailMessage[] }>(\r\n `/mail/trash?walletId=${encodeURIComponent(walletId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async getMessage(id: string): Promise<MailMessage> {\r\n return this.rc.get<MailMessage>(`/mail/message/${encodeURIComponent(id)}`);\r\n }\r\n\r\n async move(messageId: string, folder: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/move\", {\r\n messageId,\r\n folder,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/mail/read\", {\r\n messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async delete(id: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/mail/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Messenger Sub-client =====\r\n\r\nclass MessengerClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n async getWallets(): Promise<MessengerWallet[]> {\r\n const data = await this.rc.get<{ wallets: MessengerWallet[] }>(\"/messenger/wallets\");\r\n return data.wallets ?? [];\r\n }\r\n\r\n async registerWallet(opts: {\r\n id: string;\r\n displayName: string;\r\n signingPublicKey: string;\r\n encryptionPublicKey: string;\r\n }): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/wallets/register\", opts);\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getConversations(\r\n walletId: string,\r\n opts: { signingPublicKey?: string; encryptionPublicKey?: string } = {}\r\n ): Promise<MessengerConversation[]> {\r\n const params = new URLSearchParams({ walletId });\r\n if (opts.signingPublicKey) params.set(\"signingPublicKey\", opts.signingPublicKey);\r\n if (opts.encryptionPublicKey) params.set(\"encryptionPublicKey\", opts.encryptionPublicKey);\r\n const data = await this.rc.get<{ conversations: MessengerConversation[] }>(\r\n `/messenger/conversations?${params.toString()}`\r\n );\r\n return data.conversations ?? [];\r\n }\r\n\r\n async createConversation(participants: string[]): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/conversations\", {\r\n participants,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async getMessages(conversationId: string): Promise<MessengerMessage[]> {\r\n const data = await this.rc.get<{ messages: MessengerMessage[] }>(\r\n `/messenger/messages?conversationId=${encodeURIComponent(conversationId)}`\r\n );\r\n return data.messages ?? [];\r\n }\r\n\r\n async sendMessage(\r\n conversationId: string,\r\n sender: string,\r\n encryptedContent: string,\r\n opts: {\r\n mediaType?: string;\r\n mediaData?: string;\r\n selfDestruct?: boolean;\r\n destructAfterSeconds?: number;\r\n } = {}\r\n ): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages\", {\r\n conversation_id: conversationId,\r\n sender,\r\n encrypted_content: encryptedContent,\r\n media_type: opts.mediaType,\r\n media_data: opts.mediaData,\r\n self_destruct: opts.selfDestruct,\r\n destruct_after_seconds: opts.destructAfterSeconds,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined, data };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const res = await this.rc.fetchFn(\r\n `${this.rc.baseUrl}/messenger/messages/${encodeURIComponent(messageId)}`,\r\n { method: \"DELETE\", headers: this.rc.headers }\r\n );\r\n const data = (await res.json()) as Record<string, unknown>;\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n async markRead(messageId: string): Promise<ApiResponse> {\r\n try {\r\n const data = await this.rc.post<Record<string, unknown>>(\"/messenger/messages/read\", {\r\n message_id: messageId,\r\n });\r\n return { success: data.success === true, error: data.error as string | undefined };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n}\r\n\r\n// ===== Shielded Sub-client =====\r\n\r\nclass ShieldedClient {\r\n constructor(private readonly rc: RougeChain) {}\r\n\r\n // Queries\r\n\r\n async getStats(): Promise<ShieldedStats> {\r\n return this.rc.get<ShieldedStats>(\"/shielded/stats\");\r\n }\r\n\r\n async isNullifierSpent(\r\n nullifierHex: string\r\n ): Promise<{ spent: boolean }> {\r\n return this.rc.get<{ spent: boolean }>(\r\n `/shielded/nullifier/${encodeURIComponent(nullifierHex)}`\r\n );\r\n }\r\n\r\n // Write operations\r\n\r\n /**\r\n * Shield public XRGE into a private note.\r\n * Creates the commitment client-side, submits to the chain.\r\n *\r\n * @returns The ShieldedNote (keep this locally — it's the only way to spend the note)\r\n */\r\n async shield(\r\n wallet: WalletKeys,\r\n params: ShieldParams\r\n ): Promise<ApiResponse & { note?: ShieldedNote }> {\r\n const note = createShieldedNote(params.amount, wallet.publicKey);\r\n const tx = createSignedShield(wallet, params.amount, note.commitment);\r\n const result = await this.rc.submitTx(\"/v2/shielded/shield\", tx);\r\n if (result.success) {\r\n return { ...result, note };\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Transfer between shielded notes (private → private).\r\n * Requires a pre-generated STARK proof.\r\n */\r\n async transfer(\r\n wallet: WalletKeys,\r\n params: ShieldedTransferParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedShieldedTransfer(\r\n wallet,\r\n params.nullifiers,\r\n params.outputCommitments,\r\n params.proof,\r\n params.shieldedFee\r\n );\r\n return this.rc.submitTx(\"/v2/shielded/transfer\", tx);\r\n }\r\n\r\n /**\r\n * Unshield a private note back to public XRGE.\r\n * Requires a STARK proof of note ownership.\r\n */\r\n async unshield(\r\n wallet: WalletKeys,\r\n params: UnshieldParams\r\n ): Promise<ApiResponse> {\r\n const tx = createSignedUnshield(\r\n wallet,\r\n params.nullifiers,\r\n params.amount,\r\n params.proof\r\n );\r\n return this.rc.submitTx(\"/v2/shielded/unshield\", tx);\r\n }\r\n}\r\n\r\n","/**\n * RougeChain Bech32m Address Utilities for SDK\n *\n * Derives compact, human-readable addresses from PQC public keys:\n * address = bech32m(\"rouge\", SHA-256(raw_pubkey_bytes))\n *\n * Result: ~63-char address like \"rouge1q8f3x7k2m4n9p...\"\n * Matches the Rust implementation in core/crypto/src/lib.rs exactly.\n */\n\nconst CHARSET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\nconst BECH32M_CONST = 0x2bc830a3;\nconst HRP = \"rouge\";\n\nfunction hrpExpand(hrp: string): number[] {\n const ret: number[] = [];\n for (let i = 0; i < hrp.length; i++) ret.push(hrp.charCodeAt(i) >> 5);\n ret.push(0);\n for (let i = 0; i < hrp.length; i++) ret.push(hrp.charCodeAt(i) & 31);\n return ret;\n}\n\nfunction polymod(values: number[]): number {\n const GEN = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\n let chk = 1;\n for (const v of values) {\n const b = chk >> 25;\n chk = ((chk & 0x1ffffff) << 5) ^ v;\n for (let i = 0; i < 5; i++) {\n if ((b >> i) & 1) chk ^= GEN[i];\n }\n }\n return chk;\n}\n\nfunction createChecksum(hrp: string, data: number[]): number[] {\n const values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]);\n const pm = polymod(values) ^ BECH32M_CONST;\n const ret: number[] = [];\n for (let i = 0; i < 6; i++) ret.push((pm >> (5 * (5 - i))) & 31);\n return ret;\n}\n\nfunction verifyChecksum(hrp: string, data: number[]): boolean {\n return polymod(hrpExpand(hrp).concat(data)) === BECH32M_CONST;\n}\n\nfunction convertBits(data: Uint8Array, fromBits: number, toBits: number, pad: boolean): number[] {\n let acc = 0;\n let bits = 0;\n const ret: number[] = [];\n const maxv = (1 << toBits) - 1;\n for (const value of data) {\n acc = (acc << fromBits) | value;\n bits += fromBits;\n while (bits >= toBits) {\n bits -= toBits;\n ret.push((acc >> bits) & maxv);\n }\n }\n if (pad) {\n if (bits > 0) ret.push((acc << (toBits - bits)) & maxv);\n } else if (bits >= fromBits || ((acc << (toBits - bits)) & maxv)) {\n throw new Error(\"Invalid bit conversion\");\n }\n return ret;\n}\n\nfunction bech32mEncode(hrp: string, data: Uint8Array): string {\n const data5bit = convertBits(data, 8, 5, true);\n const checksum = createChecksum(hrp, data5bit);\n const combined = data5bit.concat(checksum);\n let result = hrp + \"1\";\n for (const d of combined) result += CHARSET[d];\n return result;\n}\n\nfunction bech32mDecode(str: string): { hrp: string; data: Uint8Array } {\n const lower = str.toLowerCase();\n const pos = lower.lastIndexOf(\"1\");\n if (pos < 1 || pos + 7 > lower.length) throw new Error(\"Invalid bech32m string\");\n const hrp = lower.slice(0, pos);\n const data5bit: number[] = [];\n for (let i = pos + 1; i < lower.length; i++) {\n const d = CHARSET.indexOf(lower[i]);\n if (d === -1) throw new Error(`Invalid character: ${lower[i]}`);\n data5bit.push(d);\n }\n if (!verifyChecksum(hrp, data5bit)) throw new Error(\"Invalid bech32m checksum\");\n const payload = data5bit.slice(0, data5bit.length - 6);\n const ret: number[] = [];\n let acc = 0, bits = 0;\n for (const value of payload) {\n acc = (acc << 5) | value;\n bits += 5;\n while (bits >= 8) {\n bits -= 8;\n ret.push((acc >> bits) & 0xff);\n }\n }\n return { hrp, data: new Uint8Array(ret) };\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\n }\n return bytes;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function sha256(data: Uint8Array): Promise<Uint8Array> {\n const buf = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const hash = await crypto.subtle.digest(\"SHA-256\", buf);\n return new Uint8Array(hash);\n}\n\n/**\n * Derive a compact Bech32m address from an ML-DSA-65 public key (hex).\n * Returns a ~63-character string like \"rouge1q8f3x7k2m4n9p...\"\n */\nexport async function pubkeyToAddress(publicKeyHex: string): Promise<string> {\n const pkBytes = hexToBytes(publicKeyHex);\n const hash = await sha256(pkBytes);\n return bech32mEncode(HRP, hash);\n}\n\n/**\n * Decode a Bech32m address back to its 32-byte SHA-256 hash (hex).\n */\nexport function addressToHash(address: string): string {\n const { data } = bech32mDecode(address);\n return bytesToHex(data);\n}\n\n/**\n * Check if a string is a valid RougeChain Bech32m address.\n */\nexport function isRougeAddress(input: string): boolean {\n if (!input.toLowerCase().startsWith(\"rouge1\") || input.length < 10) return false;\n try {\n bech32mDecode(input);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Format an address for compact display: \"rouge1q8f3...k9m2\"\n */\nexport function formatAddress(address: string, prefixLen = 12, suffixLen = 4): string {\n if (address.length <= prefixLen + suffixLen + 3) return address;\n return `${address.slice(0, prefixLen)}...${address.slice(-suffixLen)}`;\n}\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\r\nimport { bytesToHex, hexToBytes } from \"./utils.js\";\r\nimport { pubkeyToAddress } from \"./address.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 * Derive the compact Bech32m address from the public key.\r\n * Returns a ~63-character `rouge1...` string.\r\n */\r\n async address(): Promise<string> {\r\n return pubkeyToAddress(this.publicKey);\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\r\n"]}
|