uint8_t = ['number', 'number', 'Uint8Array'],
uint16_t = ['number', 'number', 'Uint16Array'],
uint32_t = ['number', 'number', 'Uint32Array'],
- uint64_t = ['BigInt', 'BigInt', 'BigUint64Array'],
+ uint64_t = ['bigint', 'bigint', 'BigUint64Array'],
)
self.java_type_map = dict(
String = "number"
self.bindings_header = self.wasm_import_header(target)
- self.bindings_version_file = ""
+ self.bindings_version_file = """export function get_ldk_java_bindings_version(): String {
+ return "<git_version_ldk_garbagecollected>";
+}"""
self.bindings_footer = ""
/** The script_pubkey in this output */
public script_pubkey: Uint8Array;
/** The value, in satoshis, of this output */
- public value: BigInt;
+ public value: bigint;
/* @internal */
public constructor(_dummy: object, ptr: number) {
this.script_pubkey = bindings.decodeUint8Array(bindings.TxOut_get_script_pubkey(ptr));
this.value = bindings.TxOut_get_value(ptr);
}
- public constructor_new(value: BigInt, script_pubkey: Uint8Array): TxOut {
+ public constructor_new(value: bigint, script_pubkey: Uint8Array): TxOut {
return new TxOut(null, bindings.TxOut_new(bindings.encodeUint8Array(script_pubkey), value));
}
}"""
void __attribute__((export_name("TS_free"))) TS_free(uint32_t ptr) {
FREE((void*)ptr);
}
+
+jstring __attribute__((export_name("TS_get_ldk_c_bindings_version"))) TS_get_ldk_c_bindings_version() {
+ const char *res = check_get_ldk_bindings_version();
+ if (res == NULL) return NULL;
+ return str_ref_to_ts(res, strlen(res));
+}
+jstring __attribute__((export_name("TS_get_ldk_version"))) get_ldk_version() {
+ const char *res = check_get_ldk_version();
+ if (res == NULL) return NULL;
+ return str_ref_to_ts(res, strlen(res));
+}
+#include "version.c"
"""
- self.c_version_file = ""
+ self.c_version_file = """jstring __attribute__((export_name("TS_get_lib_version_string"))) TS_get_lib_version_string() {
+ return str_ref_to_ts("<git_version_ldk_garbagecollected>", strlen("<git_version_ldk_garbagecollected>"));
+}"""
self.hu_struct_file_prefix = """
import CommonBase from './CommonBase.mjs';
import * as bindings from '../bindings.mjs'
-import * as InternalUtils from '../InternalUtils.mjs'
"""
self.util_fn_pfx = self.hu_struct_file_prefix + "\nexport class UtilMethods extends CommonBase {\n"
self.is_arr_some_check = ("", " != 0")
self.get_native_arr_len_call = ("", "->arr_len")
- with open(outdir + "/InternalUtils.mts", "w") as f:
- f.write("export function check_arr_len(arr: Uint8Array, len: number): Uint8Array {\n")
- f.write("\tif (arr.length != len) { throw new Error(\"Expected array of length \" + len + \"got \" + arr.length); }\n")
- f.write("\treturn arr;\n")
- f.write("}")
-
def release_native_arr_ptr_call(self, ty_info, arr_var, arr_ptr_var):
return None
def create_native_arr_call(self, arr_len, ty_info):
def wasm_import_header(self, target):
res = """
+import * as version from './version.mjs';
+
const imports: any = {};
imports.env = {};
export async function initializeWasm(path: string) {
const source = fs.readFileSync(path);
imports.env["js_invoke_function"] = js_invoke;
- const { instance: wasmInstance } = await WebAssembly.instantiate(source, imports);
- wasm = wasmInstance.exports;
- if (!wasm.test_bigint_pass_deadbeef0badf00d(BigInt("0xdeadbeef0badf00d"))) {
- throw new Error(\"Currently need BigInt-as-u64 support, try ----experimental-wasm-bigint");
- }
- isWasmInitialized = true;
-};
-"""
+ const { instance: wasmInstance } = await WebAssembly.instantiate(source, imports);"""
else:
res += """
export async function initializeWasm(uri: string) {
const stream = fetch(uri);
imports.env["js_invoke_function"] = js_invoke;
- const { instance: wasmInstance } = await WebAssembly.instantiateStreaming(stream, imports);
+ const { instance: wasmInstance } = await WebAssembly.instantiateStreaming(stream, imports);"""
+
+ return res + """
wasm = wasmInstance.exports;
if (!wasm.test_bigint_pass_deadbeef0badf00d(BigInt("0xdeadbeef0badf00d"))) {
throw new Error(\"Currently need BigInt-as-u64 support, try ----experimental-wasm-bigint");
}
- isWasmInitialized = true;
-};
-"""
-
- return res + """
+ if (decodeString(wasm.TS_get_lib_version_string()) !== version.get_ldk_java_bindings_version())
+ throw new Error(\"Compiled LDK library and LDK class failes do not match\");
+ // Fetching the LDK versions from C also checks that the header and binaries match
+ if (wasm.TS_get_ldk_c_bindings_version() == 0)
+ throw new Error(\"LDK version did not match the header we built against\");
+ if (wasm.TS_get_ldk_version() == 0)
+ throw new Error(\"LDK C bindings version did not match the header we built against\");
+ const c_bindings_version: string = decodeString(wasm.TS_get_ldk_c_bindings_version());
+ const ldk_version: string = decodeString(wasm.TS_get_ldk_version());
+ console.log(\"Loaded LDK-Java Bindings with LDK \" + ldk_version + \" and LDK-C-Bindings \" + c_bindings_version);
+ isWasmInitialized = true;
+};
// WASM CODEC
arrayMemoryView[0] = inputArray.length;
return cArrayPointer;
}
-export function encodeUint64Array (inputArray: BigUint64Array|Array<BigInt>): number {
+export function encodeUint64Array (inputArray: BigUint64Array|Array<bigint>): number {
const cArrayPointer = wasm.TS_malloc(inputArray.length * 8 + 1);
const arrayLengthView = new Uint32Array(wasm.memory.buffer, cArrayPointer, 1);
arrayLengthView[0] = inputArray.length;