summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIm-Beast <franik.mateusz@gmail.com>2024-10-15 12:07:26 +0200
committerIm-Beast <franik.mateusz@gmail.com>2024-10-15 12:07:26 +0200
commit19d5722aeabdb5e42bb14a340cc30854083bb795 (patch)
treeae387273bebef6f61ab93dfcc2a681384d450a41
parentb1db21e7393854a2067a4674fcb09a441c4314b1 (diff)
feat: support wownero in monero.ts bindings
-rw-r--r--impls/monero.ts/README.md9
-rw-r--r--impls/monero.ts/checksum.ts12
-rw-r--r--impls/monero.ts/src/bindings.ts567
-rw-r--r--impls/monero.ts/src/pending_transaction.ts21
-rw-r--r--impls/monero.ts/src/symbols.ts552
-rw-r--r--impls/monero.ts/src/transaction_history.ts16
-rw-r--r--impls/monero.ts/src/transaction_info.ts40
-rw-r--r--impls/monero.ts/src/utils.ts14
-rw-r--r--impls/monero.ts/src/wallet.ts64
-rw-r--r--impls/monero.ts/src/wallet_manager.ts5
10 files changed, 676 insertions, 624 deletions
diff --git a/impls/monero.ts/README.md b/impls/monero.ts/README.md
index 773e8f6..fe06467 100644
--- a/impls/monero.ts/README.md
+++ b/impls/monero.ts/README.md
@@ -13,13 +13,14 @@ There are at least two ways to do so:
an example of doing so.
```ts
import {
- loadDylib,
+ loadMoneroDylib,
Wallet,
WalletManager,
} from "https://raw.githubusercontent.com/MrCyjaneK/monero_c/master/impls/monero.ts/mod.ts";
// Try to load dylib from the default lib/* path
- loadDylib();
+ // You can also use loadWowneroDylib for Wownero
+ loadMoneroDylib();
const wm = await WalletManager.new();
const wallet = await Wallet.create(wm, "./my_wallet", "password");
@@ -33,11 +34,11 @@ There are at least two ways to do so:
```ts
import { dlopen } from "jsr:@denosaurs/plug";
// It's recommened to put the monero.ts github link into your import_map to reduce the url clutter
- import { loadDylib, symbols, Wallet, WalletManager } from "https://raw.githubusercontent.com/MrCyjaneK/monero_c/master/impls/monero.ts/mod.ts";
+ import { loadMoneroDylib, symbols, Wallet, WalletManager } from "https://raw.githubusercontent.com/MrCyjaneK/monero_c/master/impls/monero.ts/mod.ts";
// Load dylib loaded by plug
const lib = await dlopen(..., symbols);
- loadDylib(lib);
+ loadMoneroDylib(lib);
const wm = await WalletManager.new();
const wallet = await Wallet.create(wm, "./my_wallet", "password");
diff --git a/impls/monero.ts/checksum.ts b/impls/monero.ts/checksum.ts
index 22d3038..b0d12b0 100644
--- a/impls/monero.ts/checksum.ts
+++ b/impls/monero.ts/checksum.ts
@@ -1,8 +1,8 @@
import { moneroChecksum } from "./checksum_monero.ts";
-import { readCString } from "./src/utils.ts";
-import { dylib, loadDylib } from "./src/bindings.ts";
+import { getSymbol, readCString } from "./src/utils.ts";
+import { dylib, loadMoneroDylib } from "./src/bindings.ts";
-loadDylib();
+loadMoneroDylib();
export class ChecksumError extends Error {
readonly code: number;
@@ -21,7 +21,7 @@ export class ChecksumError extends Error {
* @returns {ChecksumError} which contains information about why checksum failed
*/
export async function validateChecksum(): Promise<ChecksumError | null> {
- const cppHeaderHash = await readCString(await dylib.symbols.MONERO_checksum_wallet2_api_c_h(), false);
+ const cppHeaderHash = await readCString(await getSymbol("checksum_wallet2_api_c_h")!(), false);
const tsHeaderHash = moneroChecksum.wallet2_api_c_h_sha256;
const errors: string[] = [];
@@ -32,14 +32,14 @@ export async function validateChecksum(): Promise<ChecksumError | null> {
errorCode++;
}
- const cppSourceHash = await readCString(await dylib.symbols.MONERO_checksum_wallet2_api_c_cpp(), false);
+ const cppSourceHash = await readCString(await getSymbol("checksum_wallet2_api_c_cpp")!(), false);
const tsSourceHash = moneroChecksum.wallet2_api_c_cpp_sha256;
if (cppSourceHash !== tsSourceHash) {
errors.push(`ERR: CPP source file check mismatch ${cppSourceHash} == ${tsSourceHash}`);
errorCode++;
}
- const cppExportHash = await readCString(await dylib.symbols.MONERO_checksum_wallet2_api_c_exp(), false);
+ const cppExportHash = await readCString(await getSymbol("checksum_wallet2_api_c_exp")!(), false);
const tsExportHash = moneroChecksum.wallet2_api_c_exp_sha256;
if (cppExportHash !== tsExportHash) {
if (Deno.build.os !== "darwin") {
diff --git a/impls/monero.ts/src/bindings.ts b/impls/monero.ts/src/bindings.ts
index b854f7d..93ce8f9 100644
--- a/impls/monero.ts/src/bindings.ts
+++ b/impls/monero.ts/src/bindings.ts
@@ -1,542 +1,8 @@
-export const symbols = {
- "MONERO_WalletManagerFactory_getWalletManager": {
- nonblocking: true,
- parameters: [],
- // void*
- result: "pointer",
- },
+import { type Dylib, moneroSymbols, type MoneroTsDylib, wowneroSymbols, type WowneroTsDylib } from "./symbols.ts";
- //#region WalletManager
- "MONERO_WalletManager_createWallet": {
- nonblocking: true,
- // void* wm_ptr, const char* path, const char* password, const char* language, int networkType
- parameters: ["pointer", "pointer", "pointer", "pointer", "i32"],
- // void*
- result: "pointer",
- },
- "MONERO_WalletManager_openWallet": {
- nonblocking: true,
- // void* wm_ptr, const char* path, const char* password, int networkType
- "parameters": ["pointer", "pointer", "pointer", "i32"],
- // void*
- result: "pointer",
- },
- "MONERO_WalletManager_recoveryWallet": {
- nonblocking: true,
- // void* wm_ptr, const char* path, const char* password, const char* mnemonic,
- // int networkType, uint64_t restoreHeight, uint64_t kdfRounds, const char* seedOffset
- parameters: ["pointer", "pointer", "pointer", "pointer", "i32", "u64", "u64", "pointer"],
- // void*
- result: "pointer",
- },
- "MONERO_WalletManager_blockchainHeight": {
- nonblocking: true,
- // void* wm_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_WalletManager_blockchainTargetHeight": {
- nonblocking: true,
- // void* wm_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_WalletManager_setDaemonAddress": {
- nonblocking: true,
- // void* wm_ptr, const char* address
- parameters: ["pointer", "pointer"],
- // void
- result: "void",
- },
- //#endregion
+export let dylib: Dylib;
- //#region Wallet
- "MONERO_Wallet_init": {
- nonblocking: true,
- // void* wallet_ptr, const char* daemon_address, uint64_t upper_transaction_size_limit,
- // const char* daemon_username, const char* daemon_password, bool use_ssl, bool lightWallet,
- // const char* proxy_address
- parameters: ["pointer", "pointer", "u64", "pointer", "pointer", "bool", "bool", "pointer"],
- // bool
- result: "bool",
- },
- "MONERO_Wallet_init3": {
- nonblocking: true,
- // void* wallet_ptr, const char* argv0, const char* default_log_base_name,
- // const char* log_path, bool console
- parameters: ["pointer", "pointer", "pointer", "pointer", "bool"],
- // void
- result: "void",
- },
- "MONERO_Wallet_setTrustedDaemon": {
- nonblocking: true,
- // void* wallet_ptr, bool arg
- parameters: ["pointer", "bool"],
- // void
- result: "void",
- },
- "MONERO_Wallet_startRefresh": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // void
- result: "void",
- },
- "MONERO_Wallet_refreshAsync": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // void
- result: "void",
- },
- "MONERO_Wallet_blockChainHeight": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_Wallet_daemonBlockChainHeight": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_Wallet_synchronized": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // bool
- result: "bool",
- },
- "MONERO_Wallet_store": {
- nonblocking: true,
- // void* wallet_ptr, const char* path
- parameters: ["pointer", "pointer"],
- // bool
- result: "bool",
- },
- "MONERO_Wallet_address": {
- nonblocking: true,
- // void* wallet_ptr, uint64_t accountIndex, uint64_t addressIndex
- parameters: ["pointer", "u64", "u64"],
- // char*
- result: "pointer",
- },
- "MONERO_Wallet_balance": {
- nonblocking: true,
- // void* wallet_ptr, uint32_t accountIndex
- parameters: ["pointer", "u32"],
- // uint64_t
- result: "u64",
- },
- "MONERO_Wallet_unlockedBalance": {
- nonblocking: true,
- // void* wallet_ptr, uint32_t accountIndex
- parameters: ["pointer", "u32"],
- // uint64_t
- result: "u64",
- },
- "MONERO_Wallet_addSubaddressAccount": {
- nonblocking: true,
- // void* wallet_ptr, const char* label
- parameters: ["pointer", "pointer"],
- // void
- result: "void",
- },
- "MONERO_Wallet_numSubaddressAccounts": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // size_t
- result: "usize",
- },
- "MONERO_Wallet_addSubaddress": {
- nonblocking: true,
- // void* wallet_ptr, uint32_t accountIndex, const char* label
- parameters: ["pointer", "u32", "pointer"],
- // void
- result: "void",
- },
- "MONERO_Wallet_numSubaddresses": {
- nonblocking: true,
- // void* wallet_ptr, uint32_t accountIndex
- parameters: ["pointer", "u32"],
- // size_t
- result: "usize",
- },
- "MONERO_Wallet_getSubaddressLabel": {
- nonblocking: true,
- // void* wallet_ptr, uint32_t accountIndex, uint32_t addressIndex
- parameters: ["pointer", "u32", "u32"],
- // const char*
- result: "pointer",
- },
- "MONERO_Wallet_setSubaddressLabel": {
- nonblocking: true,
- // void* wallet_ptr, uint32_t accountIndex, uint32_t addressIndex, const char* label
- parameters: ["pointer", "u32", "u32", "pointer"],
- // void
- result: "void",
- },
- "MONERO_Wallet_status": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // int
- result: "i32",
- },
- "MONERO_Wallet_errorString": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // char*
- result: "pointer",
- },
- "MONERO_Wallet_history": {
- nonblocking: true,
- // void* wallet_ptr
- parameters: ["pointer"],
- // void*
- result: "pointer",
- },
- "MONERO_Wallet_createTransaction": {
- nonblocking: true,
- // void* wallet_ptr, const char* dst_addr, const char* payment_id
- // uint64_t amount, uint32_t mixin_count, int pendingTransactionPriority,
- // uint32_t subaddr_account, const char* preferredInputs, const char* separator
- parameters: ["pointer", "pointer", "pointer", "u64", "u32", "i32", "u32", "pointer", "pointer"],
- // void*
- result: "pointer",
- },
- "MONERO_Wallet_amountFromString": {
- nonblocking: true,
- // const char* amount
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- //#endregion
-
- //#region TransactionHistory
- "MONERO_TransactionHistory_count": {
- nonblocking: true,
- // void* txHistory_ptr
- parameters: ["pointer"],
- // int
- result: "i32",
- },
- "MONERO_TransactionHistory_transaction": {
- nonblocking: true,
- // void* txHistory_ptr, int index
- parameters: ["pointer", "i32"],
- // void*
- result: "pointer",
- },
- "MONERO_TransactionHistory_transactionById": {
- nonblocking: true,
- // void* txHistory_ptr, const char* id
- parameters: ["pointer", "pointer"],
- // void*
- result: "pointer",
- },
- "MONERO_TransactionHistory_refresh": {
- nonblocking: true,
- // void* txHistory_ptr
- parameters: ["pointer"],
- // void
- result: "void",
- },
- "MONERO_TransactionHistory_setTxNote": {
- nonblocking: true,
- // void* txHistory_ptr, const char* txid, const char* note
- parameters: ["pointer", "pointer", "pointer"],
- // void
- result: "void",
- },
- //#endregion
-
- //#region TransactionInfo
- "MONERO_TransactionInfo_direction": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // int
- result: "i32",
- },
- "MONERO_TransactionInfo_isPending": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // bool
- result: "bool",
- },
- "MONERO_TransactionInfo_isFailed": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // bool
- result: "bool",
- },
- "MONERO_TransactionInfo_isCoinbase": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // bool
- result: "bool",
- },
- "MONERO_TransactionInfo_amount": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_TransactionInfo_fee": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_TransactionInfo_blockHeight": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_TransactionInfo_description": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_TransactionInfo_subaddrIndex": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_TransactionInfo_subaddrAccount": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // uint32_t
- result: "u32",
- },
- "MONERO_TransactionInfo_label": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_TransactionInfo_confirmations": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_TransactionInfo_unlockTime": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_TransactionInfo_hash": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_TransactionInfo_timestamp": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_TransactionInfo_paymentId": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_TransactionInfo_transfers_count": {
- nonblocking: true,
- // void* txInfo_ptr
- parameters: ["pointer"],
- // int
- result: "i32",
- },
- "MONERO_TransactionInfo_transfers_amount": {
- nonblocking: true,
- // void* txInfo_ptr, int index
- parameters: ["pointer", "i32"],
- // uint64_t
- result: "u64",
- },
- "MONERO_TransactionInfo_transfers_address": {
- nonblocking: true,
- // void* txInfo_ptr, int index
- parameters: ["pointer", "i32"],
- // const char*
- result: "pointer",
- },
- //#endregion
-
- //#region PendingTransaction
- "MONERO_PendingTransaction_status": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // int
- result: "i32",
- },
- "MONERO_PendingTransaction_errorString": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_PendingTransaction_commit": {
- nonblocking: true,
- // void* pendingTx_ptr, const char* filename, bool overwrite
- parameters: ["pointer", "pointer", "bool"],
- // bool
- result: "bool",
- },
- "MONERO_PendingTransaction_commitUR": {
- nonblocking: true,
- // void* pendingTx_ptr, int max_fragment_length
- parameters: ["pointer", "i32"],
- // const char*
- result: "pointer",
- },
- "MONERO_PendingTransaction_amount": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_PendingTransaction_dust": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_PendingTransaction_fee": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_PendingTransaction_txid": {
- nonblocking: true,
- // void* pendingTx_ptr, const char* separator
- parameters: ["pointer", "pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_PendingTransaction_txCount": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // uint64_t
- result: "u64",
- },
- "MONERO_PendingTransaction_subaddrAccount": {
- nonblocking: true,
- // void* pendingTx_ptr, const char* separator
- parameters: ["pointer", "pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_PendingTransaction_subaddrIndices": {
- nonblocking: true,
- // void* pendingTx_ptr, const char* separator
- parameters: ["pointer", "pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_PendingTransaction_multisigSignData": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_PendingTransaction_signMultisigTx": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // void
- result: "void",
- },
- "MONERO_PendingTransaction_signersKeys": {
- nonblocking: true,
- // void* pendingTx_ptr
- parameters: ["pointer"],
- // const char*
- result: "pointer",
- },
- "MONERO_PendingTransaction_hex": {
- nonblocking: true,
- // void* pendingTx_ptr, const char* separator
- parameters: ["pointer", "pointer"],
- // const char*
- result: "pointer",
- },
- //#endregion
-
- //#region Checksum
- "MONERO_checksum_wallet2_api_c_h": {
- nonblocking: true,
- parameters: [],
- // const char*
- result: "pointer",
- },
- "MONERO_checksum_wallet2_api_c_cpp": {
- nonblocking: true,
- parameters: [],
- // const char*
- result: "pointer",
- },
- "MONERO_checksum_wallet2_api_c_exp": {
- nonblocking: true,
- parameters: [],
- // const char*
- result: "pointer",
- },
- //#endregion
-
- "MONERO_free": {
- nonblocking: true,
- // void* ptr
- parameters: ["pointer"],
- // void
- result: "void",
- },
-} as const;
-
-type MoneroTsDylib = Deno.DynamicLibrary<typeof symbols>;
-
-export let dylib: MoneroTsDylib;
-export function loadDylib(newDylib?: MoneroTsDylib) {
+export function loadMoneroDylib(newDylib?: MoneroTsDylib) {
if (newDylib) {
dylib = newDylib;
return;
@@ -558,5 +24,30 @@ export function loadDylib(newDylib?: MoneroTsDylib) {
break;
}
- dylib = Deno.dlopen(libPath, symbols);
+ dylib = Deno.dlopen(libPath, moneroSymbols);
+}
+
+export function loadWowneroDylib(newDylib?: WowneroTsDylib) {
+ if (newDylib) {
+ dylib = newDylib;
+ return;
+ }
+
+ let libPath: string;
+ switch (Deno.build.os) {
+ case "darwin":
+ libPath = "./lib/wownero_libwallet2_api_c.dylib";
+ break;
+ case "android":
+ libPath = "./lib/libwownero_libwallet2_api_c.so";
+ break;
+ case "windows":
+ libPath = "./lib/wownero_libwallet2_api_c.dll";
+ break;
+ default:
+ libPath = "./lib/wownero_libwallet2_api_c.so";
+ break;
+ }
+
+ dylib = Deno.dlopen(libPath, wowneroSymbols);
}
diff --git a/impls/monero.ts/src/pending_transaction.ts b/impls/monero.ts/src/pending_transaction.ts
index cf48721..12ad719 100644
--- a/impls/monero.ts/src/pending_transaction.ts
+++ b/impls/monero.ts/src/pending_transaction.ts
@@ -1,5 +1,4 @@
-import { dylib } from "./bindings.ts";
-import { CString, readCString, type Sanitizer } from "./utils.ts";
+import { CString, getSymbol, readCString, type Sanitizer } from "./utils.ts";
export type PendingTransactionPtr = Deno.PointerObject<"transactionInfo">;
@@ -13,13 +12,13 @@ export class PendingTransaction {
}
async status(): Promise<number> {
- return await dylib.symbols.MONERO_PendingTransaction_status(this.#pendingTxPtr);
+ return await getSymbol("PendingTransaction_status")(this.#pendingTxPtr);
}
async errorString(): Promise<string | null> {
if (!await this.status()) return null;
- const error = await dylib.symbols.MONERO_PendingTransaction_errorString(this.#pendingTxPtr);
+ const error = await getSymbol("PendingTransaction_errorString")(this.#pendingTxPtr);
if (!error) return null;
return await readCString(error) || null;
@@ -34,7 +33,7 @@ export class PendingTransaction {
}
async commit(fileName: string, overwrite: boolean, sanitize = true): Promise<boolean> {
- const bool = await dylib.symbols.MONERO_PendingTransaction_commit(
+ const bool = await getSymbol("PendingTransaction_commit")(
this.#pendingTxPtr,
CString(fileName),
overwrite,
@@ -44,7 +43,7 @@ export class PendingTransaction {
}
async commitUR(maxFragmentLength: number): Promise<string | null> {
- const result = await dylib.symbols.MONERO_PendingTransaction_commitUR(
+ const result = await getSymbol("PendingTransaction_commitUR")(
this.#pendingTxPtr,
maxFragmentLength,
);
@@ -54,19 +53,19 @@ export class PendingTransaction {
}
async amount(): Promise<bigint> {
- return await dylib.symbols.MONERO_PendingTransaction_amount(this.#pendingTxPtr);
+ return await getSymbol("PendingTransaction_amount")(this.#pendingTxPtr);
}
async dust(): Promise<bigint> {
- return await dylib.symbols.MONERO_PendingTransaction_dust(this.#pendingTxPtr);
+ return await getSymbol("PendingTransaction_dust")(this.#pendingTxPtr);
}
async fee(): Promise<bigint> {
- return await dylib.symbols.MONERO_PendingTransaction_fee(this.#pendingTxPtr);
+ return await getSymbol("PendingTransaction_fee")(this.#pendingTxPtr);
}
async txid(separator: string, sanitize = true): Promise<string | null> {
- const result = await dylib.symbols.MONERO_PendingTransaction_txid(
+ const result = await getSymbol("PendingTransaction_txid")(
this.#pendingTxPtr,
CString(separator),
);
@@ -76,6 +75,6 @@ export class PendingTransaction {
}
async txCount(): Promise<bigint> {
- return await dylib.symbols.MONERO_PendingTransaction_txCount(this.#pendingTxPtr);
+ return await getSymbol("PendingTransaction_txCount")(this.#pendingTxPtr);
}
}
diff --git a/impls/monero.ts/src/symbols.ts b/impls/monero.ts/src/symbols.ts
new file mode 100644
index 0000000..0c91f38
--- /dev/null
+++ b/impls/monero.ts/src/symbols.ts
@@ -0,0 +1,552 @@
+export const moneroSymbols = {
+ "MONERO_WalletManagerFactory_getWalletManager": {
+ nonblocking: true,
+ parameters: [],
+ // void*
+ result: "pointer",
+ },
+
+ //#region WalletManager
+ "MONERO_WalletManager_createWallet": {
+ nonblocking: true,
+ // void* wm_ptr, const char* path, const char* password, const char* language, int networkType
+ parameters: ["pointer", "pointer", "pointer", "pointer", "i32"],
+ // void*
+ result: "pointer",
+ },
+ "MONERO_WalletManager_openWallet": {
+ nonblocking: true,
+ // void* wm_ptr, const char* path, const char* password, int networkType
+ "parameters": ["pointer", "pointer", "pointer", "i32"],
+ // void*
+ result: "pointer",
+ },
+ "MONERO_WalletManager_recoveryWallet": {
+ nonblocking: true,
+ // void* wm_ptr, const char* path, const char* password, const char* mnemonic,
+ // int networkType, uint64_t restoreHeight, uint64_t kdfRounds, const char* seedOffset
+ parameters: ["pointer", "pointer", "pointer", "pointer", "i32", "u64", "u64", "pointer"],
+ // void*
+ result: "pointer",
+ },
+ "MONERO_WalletManager_blockchainHeight": {
+ nonblocking: true,
+ // void* wm_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_WalletManager_blockchainTargetHeight": {
+ nonblocking: true,
+ // void* wm_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_WalletManager_setDaemonAddress": {
+ nonblocking: true,
+ // void* wm_ptr, const char* address
+ parameters: ["pointer", "pointer"],
+ // void
+ result: "void",
+ },
+ //#endregion
+
+ //#region Wallet
+ "MONERO_Wallet_init": {
+ nonblocking: true,
+ // void* wallet_ptr, const char* daemon_address, uint64_t upper_transaction_size_limit,
+ // const char* daemon_username, const char* daemon_password, bool use_ssl, bool lightWallet,
+ // const char* proxy_address
+ parameters: ["pointer", "pointer", "u64", "pointer", "pointer", "bool", "bool", "pointer"],
+ // bool
+ result: "bool",
+ },
+ "MONERO_Wallet_init3": {
+ nonblocking: true,
+ // void* wallet_ptr, const char* argv0, const char* default_log_base_name,
+ // const char* log_path, bool console
+ parameters: ["pointer", "pointer", "pointer", "pointer", "bool"],
+ // void
+ result: "void",
+ },
+ "MONERO_Wallet_setTrustedDaemon": {
+ nonblocking: true,
+ // void* wallet_ptr, bool arg
+ parameters: ["pointer", "bool"],
+ // void
+ result: "void",
+ },
+ "MONERO_Wallet_startRefresh": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // void
+ result: "void",
+ },
+ "MONERO_Wallet_refreshAsync": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // void
+ result: "void",
+ },
+ "MONERO_Wallet_blockChainHeight": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_Wallet_daemonBlockChainHeight": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_Wallet_synchronized": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // bool
+ result: "bool",
+ },
+ "MONERO_Wallet_store": {
+ nonblocking: true,
+ // void* wallet_ptr, const char* path
+ parameters: ["pointer", "pointer"],
+ // bool
+ result: "bool",
+ },
+ "MONERO_Wallet_address": {
+ nonblocking: true,
+ // void* wallet_ptr, uint64_t accountIndex, uint64_t addressIndex
+ parameters: ["pointer", "u64", "u64"],
+ // char*
+ result: "pointer",
+ },
+ "MONERO_Wallet_balance": {
+ nonblocking: true,
+ // void* wallet_ptr, uint32_t accountIndex
+ parameters: ["pointer", "u32"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_Wallet_unlockedBalance": {
+ nonblocking: true,
+ // void* wallet_ptr, uint32_t accountIndex
+ parameters: ["pointer", "u32"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_Wallet_addSubaddressAccount": {
+ nonblocking: true,
+ // void* wallet_ptr, const char* label
+ parameters: ["pointer", "pointer"],
+ // void
+ result: "void",
+ },
+ "MONERO_Wallet_numSubaddressAccounts": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // size_t
+ result: "usize",
+ },
+ "MONERO_Wallet_addSubaddress": {
+ nonblocking: true,
+ // void* wallet_ptr, uint32_t accountIndex, const char* label
+ parameters: ["pointer", "u32", "pointer"],
+ // void
+ result: "void",
+ },
+ "MONERO_Wallet_numSubaddresses": {
+ nonblocking: true,
+ // void* wallet_ptr, uint32_t accountIndex
+ parameters: ["pointer", "u32"],
+ // size_t
+ result: "usize",
+ },
+ "MONERO_Wallet_getSubaddressLabel": {
+ nonblocking: true,
+ // void* wallet_ptr, uint32_t accountIndex, uint32_t addressIndex
+ parameters: ["pointer", "u32", "u32"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_Wallet_setSubaddressLabel": {
+ nonblocking: true,
+ // void* wallet_ptr, uint32_t accountIndex, uint32_t addressIndex, const char* label
+ parameters: ["pointer", "u32", "u32", "pointer"],
+ // void
+ result: "void",
+ },
+ "MONERO_Wallet_status": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // int
+ result: "i32",
+ },
+ "MONERO_Wallet_errorString": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // char*
+ result: "pointer",
+ },
+ "MONERO_Wallet_history": {
+ nonblocking: true,
+ // void* wallet_ptr
+ parameters: ["pointer"],
+ // void*
+ result: "pointer",
+ },
+ "MONERO_Wallet_createTransaction": {
+ nonblocking: true,
+ // void* wallet_ptr, const char* dst_addr, const char* payment_id
+ // uint64_t amount, uint32_t mixin_count, int pendingTransactionPriority,
+ // uint32_t subaddr_account, const char* preferredInputs, const char* separator
+ parameters: ["pointer", "pointer", "pointer", "u64", "u32", "i32", "u32", "pointer", "pointer"],
+ // void*
+ result: "pointer",
+ },
+ "MONERO_Wallet_amountFromString": {
+ nonblocking: true,
+ // const char* amount
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ //#endregion
+
+ //#region TransactionHistory
+ "MONERO_TransactionHistory_count": {
+ nonblocking: true,
+ // void* txHistory_ptr
+ parameters: ["pointer"],
+ // int
+ result: "i32",
+ },
+ "MONERO_TransactionHistory_transaction": {
+ nonblocking: true,
+ // void* txHistory_ptr, int index
+ parameters: ["pointer", "i32"],
+ // void*
+ result: "pointer",
+ },
+ "MONERO_TransactionHistory_transactionById": {
+ nonblocking: true,
+ // void* txHistory_ptr, const char* id
+ parameters: ["pointer", "pointer"],
+ // void*
+ result: "pointer",
+ },
+ "MONERO_TransactionHistory_refresh": {
+ nonblocking: true,
+ // void* txHistory_ptr
+ parameters: ["pointer"],
+ // void
+ result: "void",
+ },
+ "MONERO_TransactionHistory_setTxNote": {
+ nonblocking: true,
+ // void* txHistory_ptr, const char* txid, const char* note
+ parameters: ["pointer", "pointer", "pointer"],
+ // void
+ result: "void",
+ },
+ //#endregion
+
+ //#region TransactionInfo
+ "MONERO_TransactionInfo_direction": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // int
+ result: "i32",
+ },
+ "MONERO_TransactionInfo_isPending": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // bool
+ result: "bool",
+ },
+ "MONERO_TransactionInfo_isFailed": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // bool
+ result: "bool",
+ },
+ "MONERO_TransactionInfo_isCoinbase": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // bool
+ result: "bool",
+ },
+ "MONERO_TransactionInfo_amount": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_TransactionInfo_fee": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_TransactionInfo_blockHeight": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_TransactionInfo_description": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_TransactionInfo_subaddrIndex": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_TransactionInfo_subaddrAccount": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // uint32_t
+ result: "u32",
+ },
+ "MONERO_TransactionInfo_label": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_TransactionInfo_confirmations": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_TransactionInfo_unlockTime": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_TransactionInfo_hash": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_TransactionInfo_timestamp": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_TransactionInfo_paymentId": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_TransactionInfo_transfers_count": {
+ nonblocking: true,
+ // void* txInfo_ptr
+ parameters: ["pointer"],
+ // int
+ result: "i32",
+ },
+ "MONERO_TransactionInfo_transfers_amount": {
+ nonblocking: true,
+ // void* txInfo_ptr, int index
+ parameters: ["pointer", "i32"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_TransactionInfo_transfers_address": {
+ nonblocking: true,
+ // void* txInfo_ptr, int index
+ parameters: ["pointer", "i32"],
+ // const char*
+ result: "pointer",
+ },
+ //#endregion
+
+ //#region PendingTransaction
+ "MONERO_PendingTransaction_status": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // int
+ result: "i32",
+ },
+ "MONERO_PendingTransaction_errorString": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_PendingTransaction_commit": {
+ nonblocking: true,
+ // void* pendingTx_ptr, const char* filename, bool overwrite
+ parameters: ["pointer", "pointer", "bool"],
+ // bool
+ result: "bool",
+ },
+ "MONERO_PendingTransaction_commitUR": {
+ nonblocking: true,
+ // void* pendingTx_ptr, int max_fragment_length
+ parameters: ["pointer", "i32"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_PendingTransaction_amount": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_PendingTransaction_dust": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_PendingTransaction_fee": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_PendingTransaction_txid": {
+ nonblocking: true,
+ // void* pendingTx_ptr, const char* separator
+ parameters: ["pointer", "pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_PendingTransaction_txCount": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // uint64_t
+ result: "u64",
+ },
+ "MONERO_PendingTransaction_subaddrAccount": {
+ nonblocking: true,
+ // void* pendingTx_ptr, const char* separator
+ parameters: ["pointer", "pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_PendingTransaction_subaddrIndices": {
+ nonblocking: true,
+ // void* pendingTx_ptr, const char* separator
+ parameters: ["pointer", "pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_PendingTransaction_multisigSignData": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_PendingTransaction_signMultisigTx": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // void
+ result: "void",
+ },
+ "MONERO_PendingTransaction_signersKeys": {
+ nonblocking: true,
+ // void* pendingTx_ptr
+ parameters: ["pointer"],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_PendingTransaction_hex": {
+ nonblocking: true,
+ // void* pendingTx_ptr, const char* separator
+ parameters: ["pointer", "pointer"],
+ // const char*
+ result: "pointer",
+ },
+ //#endregion
+
+ //#region Checksum
+ "MONERO_checksum_wallet2_api_c_h": {
+ optional: true,
+ nonblocking: true,
+ parameters: [],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_checksum_wallet2_api_c_cpp": {
+ optional: true,
+ nonblocking: true,
+ parameters: [],
+ // const char*
+ result: "pointer",
+ },
+ "MONERO_checksum_wallet2_api_c_exp": {
+ optional: true,
+ nonblocking: true,
+ parameters: [],
+ // const char*
+ result: "pointer",
+ },
+ //#endregion
+
+ "MONERO_free": {
+ nonblocking: true,
+ // void* ptr
+ parameters: ["pointer"],
+ // void
+ result: "void",
+ },
+} as const;
+
+type MoneroSymbols = typeof moneroSymbols;
+export type MoneroTsDylib = Deno.DynamicLibrary<MoneroSymbols>;
+
+type ReplaceMonero<T extends string> = T extends `MONERO${infer Y}` ? `WOWNERO${Y}` : never;
+
+type WowneroSymbols = { [Key in keyof MoneroSymbols as ReplaceMonero<Key>]: MoneroSymbols[Key] };
+
+export const wowneroSymbols = Object.fromEntries(
+ Object.entries(moneroSymbols).map(([key, value]) => [key.replace("MONERO", "WOWNERO"), value]),
+) as WowneroSymbols;
+
+export type WowneroTsDylib = Deno.DynamicLibrary<WowneroSymbols>;
+
+export type Dylib = MoneroTsDylib | WowneroTsDylib;
diff --git a/impls/monero.ts/src/transaction_history.ts b/impls/monero.ts/src/transaction_history.ts
index cc76fc2..aab64da 100644
--- a/impls/monero.ts/src/transaction_history.ts
+++ b/impls/monero.ts/src/transaction_history.ts
@@ -1,6 +1,5 @@
-import { dylib } from "./bindings.ts";
import { TransactionInfo, TransactionInfoPtr } from "./transaction_info.ts";
-import { CString } from "./utils.ts";
+import { CString, getSymbol } from "./utils.ts";
export type TransactionHistoryPtr = Deno.PointerObject<"transactionHistory">;
@@ -12,24 +11,23 @@ export class TransactionHistory {
}
async count(): Promise<number> {
- return await dylib.symbols.MONERO_TransactionHistory_count(this.#txHistoryPtr);
+ return await getSymbol("TransactionHistory_count")(this.#txHistoryPtr);
}
async transaction(index: number): Promise<TransactionInfo> {
return new TransactionInfo(
- (await dylib.symbols.MONERO_TransactionHistory_transaction(
- this.#txHistoryPtr,
- index,
- )) as TransactionInfoPtr,
+ (
+ await getSymbol("TransactionHistory_transaction")(this.#txHistoryPtr, index)
+ ) as TransactionInfoPtr,
);
}
async refresh(): Promise<void> {
- await dylib.symbols.MONERO_TransactionHistory_refresh(this.#txHistoryPtr);
+ await getSymbol("TransactionHistory_refresh")(this.#txHistoryPtr);
}
async setTxNote(transactionId: string, note: string): Promise<void> {
- await dylib.symbols.MONERO_TransactionHistory_setTxNote(
+ await getSymbol("TransactionHistory_setTxNote")(
this.#txHistoryPtr,
CString(transactionId),
CString(note),
diff --git a/impls/monero.ts/src/transaction_info.ts b/impls/monero.ts/src/transaction_info.ts
index 7db45f5..22ea0e7 100644
--- a/impls/monero.ts/src/transaction_info.ts
+++ b/impls/monero.ts/src/transaction_info.ts
@@ -1,5 +1,5 @@
import { dylib } from "./bindings.ts";
-import { readCString, Sanitizer } from "./utils.ts";
+import { getSymbol, readCString, Sanitizer } from "./utils.ts";
export type TransactionInfoPtr = Deno.PointerObject<"transactionInfo">;
@@ -13,7 +13,7 @@ export class TransactionInfo {
}
async direction(): Promise<"in" | "out"> {
- switch (await dylib.symbols.MONERO_TransactionInfo_direction(this.#txInfoPtr)) {
+ switch (await getSymbol("TransactionInfo_direction")(this.#txInfoPtr)) {
case 0:
return "in";
case 1:
@@ -25,80 +25,80 @@ export class TransactionInfo {
}
async isPending(): Promise<boolean> {
- return await dylib.symbols.MONERO_TransactionInfo_isPending(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_isPending")(this.#txInfoPtr);
}
async isFailed(): Promise<boolean> {
- return await dylib.symbols.MONERO_TransactionInfo_isFailed(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_isFailed")(this.#txInfoPtr);
}
async isCoinbase(): Promise<boolean> {
- return await dylib.symbols.MONERO_TransactionInfo_isCoinbase(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_isCoinbase")(this.#txInfoPtr);
}
async amount(): Promise<bigint> {
- return await dylib.symbols.MONERO_TransactionInfo_amount(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_amount")(this.#txInfoPtr);
}
async fee(): Promise<bigint> {
- return await dylib.symbols.MONERO_TransactionInfo_fee(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_fee")(this.#txInfoPtr);
}
async blockHeight(): Promise<bigint> {
- return await dylib.symbols.MONERO_TransactionInfo_blockHeight(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_blockHeight")(this.#txInfoPtr);
}
async description(): Promise<string> {
- const description = await dylib.symbols.MONERO_TransactionInfo_description(this.#txInfoPtr);
+ const description = await getSymbol("TransactionInfo_description")(this.#txInfoPtr);
return await readCString(description) || "";
}
async subaddrIndex(): Promise<string> {
- const subaddrIndex = await dylib.symbols.MONERO_TransactionInfo_subaddrIndex(this.#txInfoPtr);
+ const subaddrIndex = await getSymbol("TransactionInfo_subaddrIndex")(this.#txInfoPtr);
return await readCString(subaddrIndex) || "";
}
async subaddrAccount(): Promise<number> {
- return await dylib.symbols.MONERO_TransactionInfo_subaddrAccount(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_subaddrAccount")(this.#txInfoPtr);
}
async label(): Promise<string> {
- const label = await dylib.symbols.MONERO_TransactionInfo_label(this.#txInfoPtr);
+ const label = await getSymbol("TransactionInfo_label")(this.#txInfoPtr);
return await readCString(label) || "";
}
async confirmations(): Promise<bigint> {
- return await dylib.symbols.MONERO_TransactionInfo_confirmations(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_confirmations")(this.#txInfoPtr);
}
async unlockTime(): Promise<bigint> {
- return await dylib.symbols.MONERO_TransactionInfo_unlockTime(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_unlockTime")(this.#txInfoPtr);
}
async hash(): Promise<string> {
- const hash = await dylib.symbols.MONERO_TransactionInfo_hash(this.#txInfoPtr);
+ const hash = await getSymbol("TransactionInfo_hash")(this.#txInfoPtr);
return await readCString(hash) || "";
}
async timestamp(): Promise<bigint> {
- return await dylib.symbols.MONERO_TransactionInfo_timestamp(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_timestamp")(this.#txInfoPtr);
}
async paymentId(): Promise<string> {
- const paymentId = await dylib.symbols.MONERO_TransactionInfo_paymentId(this.#txInfoPtr);
+ const paymentId = await getSymbol("TransactionInfo_paymentId")(this.#txInfoPtr);
return await readCString(paymentId) || "";
}
async transfersCount(): Promise<number> {
- return await dylib.symbols.MONERO_TransactionInfo_transfers_count(this.#txInfoPtr);
+ return await getSymbol("TransactionInfo_transfers_count")(this.#txInfoPtr);
}
async transfersAmount(index: number): Promise<bigint> {
- return await dylib.symbols.MONERO_TransactionInfo_transfers_amount(this.#txInfoPtr, index);
+ return await getSymbol("TransactionInfo_transfers_amount")(this.#txInfoPtr, index);
}
async transfersAddress(index: number): Promise<string> {
- const transfersAddress = await dylib.symbols.MONERO_TransactionInfo_transfers_address(this.#txInfoPtr, index);
+ const transfersAddress = await getSymbol("TransactionInfo_transfers_address")(this.#txInfoPtr, index);
return await readCString(transfersAddress) || "";
}
}
diff --git a/impls/monero.ts/src/utils.ts b/impls/monero.ts/src/utils.ts
index 6fa640f..e88ddcd 100644
--- a/impls/monero.ts/src/utils.ts
+++ b/impls/monero.ts/src/utils.ts
@@ -1,4 +1,5 @@
import { dylib } from "../mod.ts";
+import type { moneroSymbols, MoneroTsDylib, WowneroTsDylib } from "./symbols.ts";
export type Sanitizer = () => void | PromiseLike<void>;
@@ -7,6 +8,17 @@ export function CString(string: string): Deno.PointerValue<string> {
return Deno.UnsafePointer.of(textEncoder.encode(`${string}\x00`));
}
+type SymbolWithoutPrefix = keyof typeof moneroSymbols extends `MONERO_${infer DylibSymbol}` ? DylibSymbol : never;
+export function getSymbol<S extends SymbolWithoutPrefix>(
+ symbol: S,
+): MoneroTsDylib["symbols"][`MONERO_${S}`] | WowneroTsDylib["symbols"][`WOWNERO_${S}`] {
+ if ("MONERO_free" in dylib.symbols) {
+ return dylib.symbols[`MONERO_${symbol}` as const];
+ } else {
+ return dylib.symbols[`WOWNERO_${symbol}` as const];
+ }
+}
+
/**
* This method reads string from the given pointer and frees the string.
*
@@ -19,7 +31,7 @@ export async function readCString(pointer: Deno.PointerValue, free = true): Prom
if (!pointer) return null;
const string = new Deno.UnsafePointerView(pointer).getCString();
if (free) {
- await dylib.symbols.MONERO_free(pointer);
+ await getSymbol("free")(pointer);
}
return string;
}
diff --git a/impls/monero.ts/src/wallet.ts b/impls/monero.ts/src/wallet.ts
index e3aae2e..ea25f21 100644
--- a/impls/monero.ts/src/wallet.ts
+++ b/impls/monero.ts/src/wallet.ts
@@ -1,8 +1,8 @@
import { dylib } from "./bindings.ts";
-import { CString, readCString, Sanitizer } from "./utils.ts";
+import { CString, getSymbol, readCString, Sanitizer } from "./utils.ts";
+
import { WalletManager, type WalletManagerPtr } from "./wallet_manager.ts";
import { TransactionHistory, TransactionHistoryPtr } from "./transaction_history.ts";
-
import { PendingTransaction } from "./pending_transaction.ts";
import { PendingTransactionPtr } from "./pending_transaction.ts";
@@ -24,39 +24,39 @@ export class Wallet {
}
async store(path = ""): Promise<boolean> {
- const bool = await dylib.symbols.MONERO_Wallet_store(this.#walletPtr, CString(path));
+ const bool = await getSymbol("Wallet_store")(this.#walletPtr, CString(path));
await this.throwIfError();
return bool;
}
- async initWallet(): Promise<void> {
+ async initWallet(daemonAddress = "http://nodex.monerujo.io:18081"): Promise<void> {
await this.init();
await this.setTrustedDaemon(true);
- await this.setDaemonAddress("http://nodex.monerujo.io:18081");
+ await this.setDaemonAddress(daemonAddress);
await this.startRefresh();
await this.refreshAsync();
await this.throwIfError();
}
async setDaemonAddress(address: string): Promise<void> {
- await dylib.symbols.MONERO_WalletManager_setDaemonAddress(
+ await getSymbol("WalletManager_setDaemonAddress")(
this.#walletManagerPtr,
CString(address),
);
}
async startRefresh(): Promise<void> {
- await dylib.symbols.MONERO_Wallet_startRefresh(this.#walletPtr);
+ await getSymbol("Wallet_startRefresh")(this.#walletPtr);
await this.throwIfError();
}
async refreshAsync(): Promise<void> {
- await dylib.symbols.MONERO_Wallet_refreshAsync(this.#walletPtr);
+ await getSymbol("Wallet_refreshAsync")(this.#walletPtr);
await this.throwIfError();
}
async init(): Promise<boolean> {
- const bool = await dylib.symbols.MONERO_Wallet_init(
+ const bool = await getSymbol("Wallet_init")(
this.#walletPtr,
CString("http://nodex.monerujo.io:18081"),
0n,
@@ -71,7 +71,7 @@ export class Wallet {
}
async setTrustedDaemon(value: boolean): Promise<void> {
- await dylib.symbols.MONERO_Wallet_setTrustedDaemon(this.#walletPtr, value);
+ await getSymbol("Wallet_setTrustedDaemon")(this.#walletPtr, value);
}
static async create(
@@ -83,7 +83,7 @@ export class Wallet {
// We assign holder of the pointer in Wallet constructor
const walletManagerPtr = walletManager.getPointer();
- const walletPtr = await dylib.symbols.MONERO_WalletManager_createWallet(
+ const walletPtr = await getSymbol("WalletManager_createWallet")(
walletManagerPtr,
CString(path),
CString(password),
@@ -107,7 +107,7 @@ export class Wallet {
// We assign holder of the pointer in Wallet constructor
const walletManagerPtr = walletManager.getPointer();
- const walletPtr = await dylib.symbols.MONERO_WalletManager_openWallet(
+ const walletPtr = await getSymbol("WalletManager_openWallet")(
walletManagerPtr,
CString(path),
CString(password),
@@ -133,7 +133,7 @@ export class Wallet {
// We assign holder of the pointer in Wallet constructor
const walletManagerPtr = walletManager.getPointer();
- const walletPtr = await dylib.symbols.MONERO_WalletManager_recoveryWallet(
+ const walletPtr = await getSymbol("WalletManager_recoveryWallet")(
walletManagerPtr,
CString(path),
CString(password),
@@ -152,7 +152,7 @@ export class Wallet {
}
async address(accountIndex = 0n, addressIndex = 0n): Promise<string> {
- const address = await dylib.symbols.MONERO_Wallet_address(this.#walletPtr, accountIndex, addressIndex);
+ const address = await getSymbol("Wallet_address")(this.#walletPtr, accountIndex, addressIndex);
if (!address) {
const error = await this.errorString();
throw new Error(`Failed getting address from a wallet: ${error ?? "<Error unknown>"}`);
@@ -161,21 +161,21 @@ export class Wallet {
}
async balance(accountIndex = 0): Promise<bigint> {
- return await dylib.symbols.MONERO_Wallet_balance(this.#walletPtr, accountIndex);
+ return await getSymbol("Wallet_balance")(this.#walletPtr, accountIndex);
}
async unlockedBalance(accountIndex = 0): Promise<bigint> {
- return await dylib.symbols.MONERO_Wallet_unlockedBalance(this.#walletPtr, accountIndex);
+ return await getSymbol("Wallet_unlockedBalance")(this.#walletPtr, accountIndex);
}
status(): Promise<number> {
- return dylib.symbols.MONERO_Wallet_status(this.#walletPtr);
+ return getSymbol("Wallet_status")(this.#walletPtr);
}
async errorString(): Promise<string | null> {
if (!await this.status()) return null;
- const error = await dylib.symbols.MONERO_Wallet_errorString(this.#walletPtr);
+ const error = await getSymbol("Wallet_errorString")(this.#walletPtr);
if (!error) return null;
return await readCString(error) || null;
@@ -190,37 +190,37 @@ export class Wallet {
}
async synchronized(): Promise<boolean> {
- const synchronized = await dylib.symbols.MONERO_Wallet_synchronized(this.#walletPtr);
+ const synchronized = await getSymbol("Wallet_synchronized")(this.#walletPtr);
await this.throwIfError();
return synchronized;
}
async blockChainHeight(): Promise<bigint> {
- const height = await dylib.symbols.MONERO_Wallet_blockChainHeight(this.#walletPtr);
+ const height = await getSymbol("Wallet_blockChainHeight")(this.#walletPtr);
await this.throwIfError();
return height;
}
async daemonBlockChainHeight(): Promise<bigint> {
- const height = await dylib.symbols.MONERO_Wallet_daemonBlockChainHeight(this.#walletPtr);
+ const height = await getSymbol("Wallet_daemonBlockChainHeight")(this.#walletPtr);
await this.throwIfError();
return height;
}
async managerBlockChainHeight(): Promise<bigint> {
- const height = await dylib.symbols.MONERO_WalletManager_blockchainHeight(this.#walletManagerPtr);
+ const height = await getSymbol("WalletManager_blockchainHeight")(this.#walletManagerPtr);
await this.throwIfError();
return height;
}
async managerTargetBlockChainHeight(): Promise<bigint> {
- const height = await dylib.symbols.MONERO_WalletManager_blockchainTargetHeight(this.#walletManagerPtr);
+ const height = await getSymbol("WalletManager_blockchainTargetHeight")(this.#walletManagerPtr);
await this.throwIfError();
return height;
}
async addSubaddressAccount(label: string): Promise<void> {
- await dylib.symbols.MONERO_Wallet_addSubaddressAccount(
+ await getSymbol("Wallet_addSubaddressAccount")(
this.#walletPtr,
CString(label),
);
@@ -228,13 +228,13 @@ export class Wallet {
}
async numSubaddressAccounts(): Promise<bigint> {
- const accountsLen = await dylib.symbols.MONERO_Wallet_numSubaddressAccounts(this.#walletPtr);
+ const accountsLen = await getSymbol("Wallet_numSubaddressAccounts")(this.#walletPtr);
await this.throwIfError();
return accountsLen;
}
async addSubaddress(accountIndex: number, label: string): Promise<void> {
- await dylib.symbols.MONERO_Wallet_addSubaddress(
+ await getSymbol("Wallet_addSubaddress")(
this.#walletPtr,
accountIndex,
CString(label),
@@ -243,7 +243,7 @@ export class Wallet {
}
async numSubaddresses(accountIndex: number): Promise<bigint> {
- const address = await dylib.symbols.MONERO_Wallet_numSubaddresses(
+ const address = await getSymbol("Wallet_numSubaddresses")(
this.#walletPtr,
accountIndex,
);
@@ -252,7 +252,7 @@ export class Wallet {
}
async getSubaddressLabel(accountIndex: number, addressIndex: number): Promise<string> {
- const label = await dylib.symbols.MONERO_Wallet_getSubaddressLabel(this.#walletPtr, accountIndex, addressIndex);
+ const label = await getSymbol("Wallet_getSubaddressLabel")(this.#walletPtr, accountIndex, addressIndex);
if (!label) {
const error = await this.errorString();
throw new Error(`Failed getting subaddress label from a wallet: ${error ?? "<Error unknown>"}`);
@@ -261,7 +261,7 @@ export class Wallet {
}
async setSubaddressLabel(accountIndex: number, addressIndex: number, label: string): Promise<void> {
- await dylib.symbols.MONERO_Wallet_setSubaddressLabel(
+ await getSymbol("Wallet_setSubaddressLabel")(
this.#walletPtr,
accountIndex,
addressIndex,
@@ -271,7 +271,7 @@ export class Wallet {
}
async getHistory(): Promise<TransactionHistory> {
- const transactionHistoryPointer = await dylib.symbols.MONERO_Wallet_history(this.#walletPtr);
+ const transactionHistoryPointer = await getSymbol("Wallet_history")(this.#walletPtr);
await this.throwIfError();
return new TransactionHistory(transactionHistoryPointer as TransactionHistoryPtr);
}
@@ -287,7 +287,7 @@ export class Wallet {
paymentId = "",
separator = ",",
): Promise<PendingTransaction> {
- const pendingTxPtr = await dylib.symbols.MONERO_Wallet_createTransaction(
+ const pendingTxPtr = await getSymbol("Wallet_createTransaction")(
this.#walletPtr,
CString(destinationAddress),
CString(paymentId),
@@ -303,6 +303,6 @@ export class Wallet {
}
async amountFromString(amount: string): Promise<bigint> {
- return await dylib.symbols.MONERO_Wallet_amountFromString(CString(amount));
+ return await getSymbol("Wallet_amountFromString")(CString(amount));
}
}
diff --git a/impls/monero.ts/src/wallet_manager.ts b/impls/monero.ts/src/wallet_manager.ts
index ad9cf31..b1fafec 100644
--- a/impls/monero.ts/src/wallet_manager.ts
+++ b/impls/monero.ts/src/wallet_manager.ts
@@ -1,5 +1,4 @@
-import { dylib } from "./bindings.ts";
-import { Sanitizer } from "./utils.ts";
+import { getSymbol, Sanitizer } from "./utils.ts";
export type WalletManagerPtr = Deno.PointerObject<"walletManager">;
@@ -17,7 +16,7 @@ export class WalletManager {
}
static async new(sanitizer?: Sanitizer) {
- const ptr = await dylib.symbols.MONERO_WalletManagerFactory_getWalletManager();
+ const ptr = await getSymbol("WalletManagerFactory_getWalletManager")();
if (!ptr) {
sanitizer?.();
throw new Error("Failed retrieving wallet manager");