summaryrefslogtreecommitdiff
path: root/impls/monero.ts/src/transaction_info.ts
diff options
context:
space:
mode:
authorCzarek Nakamoto <cyjan@mrcyjanek.net>2025-01-05 13:17:22 +0100
committerCzarek Nakamoto <cyjan@mrcyjanek.net>2025-01-05 13:17:22 +0100
commit085d74b37b478be77bc873d66876247a751aa957 (patch)
treed8434dd9c8c57df9b64ae93059d9ebb5a16b90f2 /impls/monero.ts/src/transaction_info.ts
parent8e7bc59509c40f00702ba568a0adcb3cf82e6e05 (diff)
parentc3dd64bdee37d361a2c1252d127fb575936e43e6 (diff)
Merge remote-tracking branch 'origin/develop' into rust-develop
Diffstat (limited to 'impls/monero.ts/src/transaction_info.ts')
-rw-r--r--impls/monero.ts/src/transaction_info.ts169
1 files changed, 106 insertions, 63 deletions
diff --git a/impls/monero.ts/src/transaction_info.ts b/impls/monero.ts/src/transaction_info.ts
index 22ea0e7..9becfb9 100644
--- a/impls/monero.ts/src/transaction_info.ts
+++ b/impls/monero.ts/src/transaction_info.ts
@@ -1,104 +1,147 @@
-import { dylib } from "./bindings.ts";
-import { getSymbol, readCString, Sanitizer } from "./utils.ts";
+import { fns } from "./bindings.ts";
+import { C_SEPARATOR, CString, maybeMultipleStrings, readCString, SEPARATOR } from "./utils.ts";
-export type TransactionInfoPtr = Deno.PointerObject<"transactionInfo">;
+export type TransactionInfoPtr = Deno.PointerObject<"pendingTransaction">;
-export class TransactionInfo {
- #txInfoPtr: TransactionInfoPtr;
- sanitizer?: Sanitizer;
-
- constructor(txInfoPtr: TransactionInfoPtr, sanitizer?: Sanitizer) {
- this.#txInfoPtr = txInfoPtr;
- this.sanitizer = sanitizer;
- }
+export interface TransferData {
+ address: string | null;
+ amount: bigint;
+}
- async direction(): Promise<"in" | "out"> {
- switch (await getSymbol("TransactionInfo_direction")(this.#txInfoPtr)) {
- case 0:
- return "in";
- case 1:
- return "out";
- default:
- await this.sanitizer?.();
- throw new Error("Invalid TransactionInfo direction");
+export class TransactionInfo<MultDest extends boolean = boolean> {
+ #ptr: TransactionInfoPtr;
+
+ #amount!: bigint;
+ #fee!: bigint;
+ #timestamp!: bigint;
+ #transfersCount!: number;
+ #paymentId!: string | null;
+ #hash!: string | null;
+
+ #subaddrAccount!: number;
+ #subaddrIndex!: string | null;
+
+ #transfers!: readonly TransferData[];
+
+ constructor(ptr: TransactionInfoPtr) {
+ this.#ptr = ptr;
+ }
+
+ static async new(ptr: TransactionInfoPtr): Promise<TransactionInfo> {
+ const instance = new TransactionInfo(ptr);
+
+ const [amount, paymentId, fee, hash, subaddrIndex, subaddrAccount, timestamp, transfersCount] = await Promise.all([
+ fns.TransactionInfo_amount(ptr),
+ fns.TransactionInfo_paymentId(ptr).then(readCString),
+ fns.TransactionInfo_fee(ptr),
+ fns.TransactionInfo_hash(ptr).then(readCString),
+ fns.TransactionInfo_subaddrIndex(ptr, C_SEPARATOR).then(readCString),
+ fns.TransactionInfo_subaddrAccount(ptr),
+ fns.TransactionInfo_timestamp(ptr),
+ fns.TransactionInfo_transfers_count(ptr),
+ ]);
+
+ instance.#amount = amount;
+ instance.#fee = fee;
+ instance.#timestamp = timestamp;
+ instance.#transfersCount = transfersCount;
+ instance.#paymentId = paymentId;
+ instance.#hash = hash;
+
+ instance.#subaddrAccount = subaddrAccount;
+ instance.#subaddrIndex = subaddrIndex;
+
+ const transfers = [];
+ for (let i = 0; i < transfersCount; ++i) {
+ const [amount, address] = await Promise.all([
+ fns.TransactionInfo_transfers_amount(ptr, i),
+ fns.TransactionInfo_transfers_address(ptr, i).then(readCString),
+ ]);
+
+ transfers.push({ amount, address });
}
- }
+ Object.freeze(transfers);
+ instance.#transfers = transfers;
- async isPending(): Promise<boolean> {
- return await getSymbol("TransactionInfo_isPending")(this.#txInfoPtr);
+ return instance;
}
- async isFailed(): Promise<boolean> {
- return await getSymbol("TransactionInfo_isFailed")(this.#txInfoPtr);
+ get amount(): bigint {
+ return this.#amount;
}
- async isCoinbase(): Promise<boolean> {
- return await getSymbol("TransactionInfo_isCoinbase")(this.#txInfoPtr);
+ get fee(): bigint {
+ return this.#fee;
}
- async amount(): Promise<bigint> {
- return await getSymbol("TransactionInfo_amount")(this.#txInfoPtr);
+ get timestamp(): bigint {
+ return this.#timestamp;
}
- async fee(): Promise<bigint> {
- return await getSymbol("TransactionInfo_fee")(this.#txInfoPtr);
+ get transfersCount(): number {
+ return this.#transfersCount;
}
- async blockHeight(): Promise<bigint> {
- return await getSymbol("TransactionInfo_blockHeight")(this.#txInfoPtr);
+ get paymentId(): string | null {
+ return this.#paymentId;
}
- async description(): Promise<string> {
- const description = await getSymbol("TransactionInfo_description")(this.#txInfoPtr);
- return await readCString(description) || "";
+ get hash(): string | null {
+ return this.#hash;
}
- async subaddrIndex(): Promise<string> {
- const subaddrIndex = await getSymbol("TransactionInfo_subaddrIndex")(this.#txInfoPtr);
- return await readCString(subaddrIndex) || "";
+ get subaddrAccount(): number {
+ return this.#subaddrAccount;
}
- async subaddrAccount(): Promise<number> {
- return await getSymbol("TransactionInfo_subaddrAccount")(this.#txInfoPtr);
+ get subaddrIndex(): string | null {
+ return this.#subaddrIndex;
}
- async label(): Promise<string> {
- const label = await getSymbol("TransactionInfo_label")(this.#txInfoPtr);
- return await readCString(label) || "";
+ get transfers(): readonly TransferData[] {
+ return this.#transfers;
}
- async confirmations(): Promise<bigint> {
- return await getSymbol("TransactionInfo_confirmations")(this.#txInfoPtr);
+ async direction(): Promise<"in" | "out"> {
+ switch (await fns.TransactionInfo_direction(this.#ptr)) {
+ case 0:
+ return "in";
+ case 1:
+ return "out";
+ default:
+ throw new Error("Invalid TransactionInfo direction");
+ }
}
- async unlockTime(): Promise<bigint> {
- return await getSymbol("TransactionInfo_unlockTime")(this.#txInfoPtr);
+ async description(): Promise<string | null> {
+ return await readCString(
+ await fns.TransactionInfo_description(this.#ptr),
+ );
}
- async hash(): Promise<string> {
- const hash = await getSymbol("TransactionInfo_hash")(this.#txInfoPtr);
- return await readCString(hash) || "";
+ async label(): Promise<string | null> {
+ return await readCString(
+ await fns.TransactionInfo_label(this.#ptr),
+ );
}
- async timestamp(): Promise<bigint> {
- return await getSymbol("TransactionInfo_timestamp")(this.#txInfoPtr);
+ async confirmations(): Promise<bigint> {
+ return await fns.TransactionInfo_confirmations(this.#ptr);
}
- async paymentId(): Promise<string> {
- const paymentId = await getSymbol("TransactionInfo_paymentId")(this.#txInfoPtr);
- return await readCString(paymentId) || "";
+ async unlockTime(): Promise<bigint> {
+ return await fns.TransactionInfo_unlockTime(this.#ptr);
}
- async transfersCount(): Promise<number> {
- return await getSymbol("TransactionInfo_transfers_count")(this.#txInfoPtr);
+ async isPending(): Promise<boolean> {
+ return await fns.TransactionInfo_isPending(this.#ptr);
}
- async transfersAmount(index: number): Promise<bigint> {
- return await getSymbol("TransactionInfo_transfers_amount")(this.#txInfoPtr, index);
+ async isFailed(): Promise<boolean> {
+ return await fns.TransactionInfo_isFailed(this.#ptr);
}
- async transfersAddress(index: number): Promise<string> {
- const transfersAddress = await getSymbol("TransactionInfo_transfers_address")(this.#txInfoPtr, index);
- return await readCString(transfersAddress) || "";
+ async isCoinbase(): Promise<boolean> {
+ return await fns.TransactionInfo_isCoinbase(this.#ptr);
}
}