summaryrefslogtreecommitdiff
path: root/tests/compare.ts
blob: d09bdd9337b9d89348c8967f3ae3074c88d938c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { moneroSymbols as symbols, type MoneroTsDylib, type WowneroTsDylib } from "../impls/monero.ts/src/symbols.ts";
import { loadMoneroDylib, loadWowneroDylib } from "../impls/monero.ts/src/bindings.ts";
import { Wallet, WalletManager } from "../impls/monero.ts/mod.ts";
import { readCString } from "../impls/monero.ts/src/utils.ts";
import { assertEquals } from "jsr:@std/assert";

const coin = Deno.args[0] as "monero" | "wownero";
const version = Deno.args[1];
const walletInfo = JSON.parse(Deno.args[2]);

const moneroSymbols = {
  ...symbols,

  "MONERO_Wallet_secretViewKey": {
    nonblocking: true,
    // void* wallet_ptr
    parameters: ["pointer"],
    // const char*
    result: "pointer",
  },
  "MONERO_Wallet_publicViewKey": {
    nonblocking: true,
    // void* wallet_ptr
    parameters: ["pointer"],
    // const char*
    result: "pointer",
  },

  "MONERO_Wallet_secretSpendKey": {
    nonblocking: true,
    // void* wallet_ptr
    parameters: ["pointer"],
    // const char*
    result: "pointer",
  },
  "MONERO_Wallet_publicSpendKey": {
    nonblocking: true,
    // void* wallet_ptr
    parameters: ["pointer"],
    // const char*
    result: "pointer",
  },
} as const;

type ReplaceMonero<T extends string> = T extends `MONERO${infer Y}` ? `WOWNERO${Y}` : never;
type WowneroSymbols = { [Key in keyof typeof moneroSymbols as ReplaceMonero<Key>]: (typeof moneroSymbols)[Key] };
const wowneroSymbols = Object.fromEntries(
  Object.entries(moneroSymbols).map(([key, value]) => [key.replace("MONERO", "WOWNERO"), value]),
) as WowneroSymbols;

let getKey: (wallet: Wallet, type: `${"secret" | "public"}${"Spend" | "View"}Key`) => Promise<string | null>;

if (coin === "monero") {
  const dylib = Deno.dlopen(`tests/libs/${version}/monero_libwallet2_api_c.so`, moneroSymbols);
  loadMoneroDylib(dylib as MoneroTsDylib);

  getKey = async (wallet, type) =>
    await readCString(await dylib.symbols[`MONERO_Wallet_${type}` as const](wallet.getPointer()));
} else {
  const dylib = Deno.dlopen(`tests/libs/${version}/wownero_libwallet2_api_c.so`, wowneroSymbols);
  loadWowneroDylib(dylib as WowneroTsDylib);

  getKey = async (wallet, type) =>
    await readCString(
      await dylib.symbols[`WOWNERO_Wallet_${type}` as const](wallet.getPointer()),
    );
}

const walletManager = await WalletManager.new();
const wallet = await Wallet.open(walletManager, walletInfo.path, walletInfo.password);

assertEquals(await wallet.address(), walletInfo.address);

assertEquals(await getKey(wallet, "publicSpendKey"), walletInfo.publicSpendKey);
assertEquals(await getKey(wallet, "secretSpendKey"), walletInfo.secretSpendKey);

assertEquals(await getKey(wallet, "publicViewKey"), walletInfo.publicViewKey);
assertEquals(await getKey(wallet, "secretViewKey"), walletInfo.secretViewKey);

await wallet.store(walletInfo.path);