@bennyblader/ddk-rn 0.3.32 → 0.3.35

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.
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "ddk_ffi"
3
- version = "0.3.32"
3
+ version = "0.3.35"
4
4
  edition = "2021"
5
5
  license = "MIT"
6
6
  description = "rust-dlc language bindings"
@@ -16,7 +16,7 @@ crate-type = ["cdylib", "staticlib", "rlib"]
16
16
  uniffi = { version = "0.29.4", features = ["cli"] }
17
17
  # ddk-dlc = { path = "../../../ernest/dlcdevkit/dlc", features = ["use-serde"] }
18
18
  # ddk-dlc = { git = "https://github.com/bennyhodl/dlcdevkit.git", branch = "master", features = ["use-serde"] }
19
- ddk-dlc = { version = "1.0.4", features = ["use-serde"] }
19
+ ddk-dlc = { version = "1.0.9", features = ["use-serde"] }
20
20
  bitcoin = "0.32.7"
21
21
  thiserror = "2.0.12"
22
22
  secp256k1-zkp = "0.11.0"
@@ -150,6 +150,15 @@ namespace ddk_ffi {
150
150
  sequence<sequence<sequence<sequence<u8>>>> msgs
151
151
  );
152
152
 
153
+ [Throws=DLCError]
154
+ sequence<AdaptorSignature> create_cet_adaptor_sigs_from_points(
155
+ sequence<Transaction> cets,
156
+ sequence<sequence<u8>> adaptor_points,
157
+ sequence<u8> funding_secret_key,
158
+ sequence<u8> funding_script_pubkey,
159
+ u64 fund_output_value
160
+ );
161
+
153
162
  boolean verify_cet_adaptor_sigs_from_oracle_info(
154
163
  sequence<AdaptorSignature> adaptor_sigs,
155
164
  sequence<Transaction> cets,
@@ -211,6 +220,25 @@ namespace ddk_ffi {
211
220
  sequence<sequence<u8>> oracle_signatures,
212
221
  sequence<u8> adaptor_signature
213
222
  );
223
+
224
+ // Debug function to get all inputs for adaptor signature creation
225
+ // Use this to compare values with Fordefi
226
+ [Throws=DLCError]
227
+ CetAdaptorSignatureDebugInfo get_cet_adaptor_signature_inputs(
228
+ Transaction cet,
229
+ sequence<OracleInfo> oracle_info,
230
+ sequence<u8> funding_script_pubkey,
231
+ u64 fund_output_value,
232
+ sequence<sequence<sequence<u8>>> msgs
233
+ );
234
+
235
+ // Get sighash for a CET - the actual message that gets signed
236
+ [Throws=DLCError]
237
+ sequence<u8> get_cet_sighash(
238
+ Transaction cet,
239
+ sequence<u8> funding_script_pubkey,
240
+ u64 fund_output_value
241
+ );
214
242
  };
215
243
 
216
244
  // Transaction representation
@@ -303,6 +331,25 @@ dictionary OracleInfo {
303
331
  sequence<sequence<u8>> nonces;
304
332
  };
305
333
 
334
+ // Debug info for CET adaptor signature inputs
335
+ // All the values that go into creating an adaptor signature
336
+ dictionary CetAdaptorSignatureDebugInfo {
337
+ // The sighash (32 bytes) - this is the message that gets signed
338
+ sequence<u8> sighash;
339
+ // The adaptor point (33 bytes compressed public key)
340
+ sequence<u8> adaptor_point;
341
+ // Input index (always 0 for CETs)
342
+ u32 input_index;
343
+ // The funding script pubkey used for sighash
344
+ sequence<u8> script_pubkey;
345
+ // The fund output value used for sighash
346
+ u64 value;
347
+ // The CET txid
348
+ string cet_txid;
349
+ // Raw CET bytes for verification
350
+ sequence<u8> cet_raw;
351
+ };
352
+
306
353
  // Error types for DLC operations
307
354
  [Error]
308
355
  enum DLCError {
@@ -193,6 +193,31 @@ pub struct OracleInfo {
193
193
  pub nonces: Vec<Vec<u8>>,
194
194
  }
195
195
 
196
+ /// Debug info for CET adaptor signature inputs.
197
+ ///
198
+ /// Contains all the values that go into creating an adaptor signature,
199
+ /// useful for comparing with external signers during debugging.
200
+ ///
201
+ /// This struct is intentionally always available (not feature-gated)
202
+ /// to support production debugging scenarios.
203
+ #[derive(Clone)]
204
+ pub struct CetAdaptorSignatureDebugInfo {
205
+ /// The sighash (32 bytes) - this is the message that gets signed
206
+ pub sighash: Vec<u8>,
207
+ /// The adaptor point (33 bytes compressed public key)
208
+ pub adaptor_point: Vec<u8>,
209
+ /// Input index (always 0 for CETs)
210
+ pub input_index: u32,
211
+ /// The funding script pubkey used for sighash
212
+ pub script_pubkey: Vec<u8>,
213
+ /// The fund output value used for sighash
214
+ pub value: u64,
215
+ /// The CET txid
216
+ pub cet_txid: String,
217
+ /// Raw CET bytes for verification
218
+ pub cet_raw: Vec<u8>,
219
+ }
220
+
196
221
  // Conversion helpers
197
222
  pub fn btc_tx_to_transaction(tx: &BtcTransaction) -> Transaction {
198
223
  use bitcoin::consensus::Encodable;
@@ -932,6 +957,63 @@ pub fn create_cet_adaptor_sigs_from_oracle_info(
932
957
  Ok(adaptor_sigs)
933
958
  }
934
959
 
960
+ /// Create adaptor signatures from pre-computed adaptor points.
961
+ pub fn create_cet_adaptor_sigs_from_points(
962
+ cets: Vec<Transaction>,
963
+ adaptor_points: Vec<Vec<u8>>,
964
+ funding_secret_key: Vec<u8>,
965
+ funding_script_pubkey: Vec<u8>,
966
+ fund_output_value: u64,
967
+ ) -> Result<Vec<AdaptorSignature>, DLCError> {
968
+ if cets.len() != adaptor_points.len() {
969
+ return Err(DLCError::InvalidArgument(format!(
970
+ "CETs length ({}) does not match adaptor points length ({})",
971
+ cets.len(),
972
+ adaptor_points.len()
973
+ )));
974
+ }
975
+
976
+ let cets = cets
977
+ .iter()
978
+ .map(transaction_to_btc_tx)
979
+ .collect::<Result<Vec<_>, _>>()?;
980
+
981
+ let adaptor_points = adaptor_points
982
+ .iter()
983
+ .map(|p| {
984
+ PublicKey::from_slice(p)
985
+ .map_err(|_| DLCError::InvalidArgument("Invalid adaptor point".to_string()))
986
+ })
987
+ .collect::<Result<Vec<_>, _>>()?;
988
+
989
+ let funding_sk = SecretKey::from_slice(&funding_secret_key)
990
+ .map_err(|_| DLCError::InvalidArgument("Invalid funding secret key".to_string()))?;
991
+ let funding_script = Script::from_bytes(&funding_script_pubkey);
992
+
993
+ let inputs: Vec<(&bitcoin::Transaction, &PublicKey)> =
994
+ cets.iter().zip(adaptor_points.iter()).collect();
995
+
996
+ let secp = get_secp_context();
997
+ let adaptor_sigs = ddk_dlc::create_cet_adaptor_sigs_from_points(
998
+ secp,
999
+ &inputs,
1000
+ &funding_sk,
1001
+ funding_script,
1002
+ Amount::from_sat(fund_output_value),
1003
+ )
1004
+ .map_err(|e| DLCError::Secp256k1Error(e.to_string()))?;
1005
+
1006
+ let adaptor_sigs = adaptor_sigs
1007
+ .iter()
1008
+ .map(|sig| AdaptorSignature {
1009
+ signature: sig.as_ref().to_vec(),
1010
+ proof: Vec::new(),
1011
+ })
1012
+ .collect::<Vec<_>>();
1013
+
1014
+ Ok(adaptor_sigs)
1015
+ }
1016
+
935
1017
  pub fn verify_cet_adaptor_sig_from_oracle_info(
936
1018
  adaptor_sig: AdaptorSignature,
937
1019
  cet: Transaction,
@@ -1154,6 +1236,116 @@ pub fn extract_ecdsa_signature_from_oracle_signatures(
1154
1236
  Ok(ecdsa_sig.serialize_der().to_vec())
1155
1237
  }
1156
1238
 
1239
+ /// Get all the inputs that go into creating a CET adaptor signature.
1240
+ ///
1241
+ /// This debug function is intentionally always available (not feature-gated)
1242
+ /// to enable debugging signature mismatches in production environments where
1243
+ /// rebuilding with debug features may not be feasible.
1244
+ ///
1245
+ /// Use this to compare values with external signers (e.g., Fordefi) when
1246
+ /// debugging adaptor signature verification failures.
1247
+ ///
1248
+ /// Returns:
1249
+ /// - `sighash`: The 32-byte BIP143 sighash message that gets signed
1250
+ /// - `adaptor_point`: The 33-byte compressed adaptor public key
1251
+ /// - `input_index`: Always 0 for CETs
1252
+ /// - `script_pubkey`: The funding script used for sighash calculation
1253
+ /// - `value`: The fund output value used for sighash calculation
1254
+ /// - `cet_txid`: The CET transaction ID
1255
+ /// - `cet_raw`: Raw serialized CET bytes
1256
+ pub fn get_cet_adaptor_signature_inputs(
1257
+ cet: Transaction,
1258
+ oracle_info: Vec<OracleInfo>,
1259
+ funding_script_pubkey: Vec<u8>,
1260
+ fund_output_value: u64,
1261
+ msgs: Vec<Vec<Vec<u8>>>,
1262
+ ) -> Result<CetAdaptorSignatureDebugInfo, DLCError> {
1263
+ let btc_tx = transaction_to_btc_tx(&cet)?;
1264
+ let funding_script = Script::from_bytes(&funding_script_pubkey);
1265
+
1266
+ // Convert oracle info
1267
+ let oracle_infos: Vec<DlcOracleInfo> = oracle_info
1268
+ .iter()
1269
+ .map(|info| {
1270
+ let public_key = XOnlyPublicKey::from_slice(&info.public_key)
1271
+ .map_err(|_| DLCError::InvalidPublicKey)?;
1272
+ let nonces = info
1273
+ .nonces
1274
+ .iter()
1275
+ .map(|nonce| XOnlyPublicKey::from_slice(nonce))
1276
+ .collect::<Result<Vec<_>, _>>()
1277
+ .map_err(|_| DLCError::InvalidArgument("Invalid nonce pubkey".to_string()))?;
1278
+ Ok(DlcOracleInfo { public_key, nonces })
1279
+ })
1280
+ .collect::<Result<Vec<_>, DLCError>>()?;
1281
+
1282
+ // Convert messages
1283
+ let cet_msgs: Vec<Vec<Message>> = msgs
1284
+ .into_iter()
1285
+ .map(|outcome_msgs| {
1286
+ outcome_msgs
1287
+ .iter()
1288
+ .map(|m| {
1289
+ Message::from_digest_slice(m)
1290
+ .map_err(|_| DLCError::InvalidArgument("Invalid message".to_string()))
1291
+ })
1292
+ .collect::<Result<Vec<_>, _>>()
1293
+ })
1294
+ .collect::<Result<Vec<_>, _>>()?;
1295
+
1296
+ let secp = get_secp_context();
1297
+
1298
+ // Get the adaptor point
1299
+ let adaptor_point = ddk_dlc::get_adaptor_point_from_oracle_info(secp, &oracle_infos, &cet_msgs)
1300
+ .map_err(|e| DLCError::Secp256k1Error(e.to_string()))?;
1301
+
1302
+ // Get the sighash - this is the actual message being signed
1303
+ let sig_hash = ddk_dlc::util::get_sig_hash_msg(
1304
+ &btc_tx,
1305
+ 0, // input_index is always 0 for CETs
1306
+ funding_script,
1307
+ Amount::from_sat(fund_output_value),
1308
+ )
1309
+ .map_err(DLCError::from)?;
1310
+
1311
+ Ok(CetAdaptorSignatureDebugInfo {
1312
+ sighash: sig_hash.as_ref().to_vec(),
1313
+ adaptor_point: adaptor_point.serialize().to_vec(),
1314
+ input_index: 0,
1315
+ script_pubkey: funding_script_pubkey,
1316
+ value: fund_output_value,
1317
+ cet_txid: btc_tx.compute_txid().to_string(),
1318
+ cet_raw: cet.raw_bytes,
1319
+ })
1320
+ }
1321
+
1322
+ /// Get the sighash for a CET - the actual 32-byte message that gets signed.
1323
+ ///
1324
+ /// This debug function is intentionally always available (not feature-gated)
1325
+ /// to enable debugging sighash mismatches in production environments where
1326
+ /// rebuilding with debug features may not be feasible.
1327
+ ///
1328
+ /// Use this to compare sighash values with external signers (e.g., Fordefi)
1329
+ /// when debugging signature verification failures.
1330
+ pub fn get_cet_sighash(
1331
+ cet: Transaction,
1332
+ funding_script_pubkey: Vec<u8>,
1333
+ fund_output_value: u64,
1334
+ ) -> Result<Vec<u8>, DLCError> {
1335
+ let btc_tx = transaction_to_btc_tx(&cet)?;
1336
+ let funding_script = Script::from_bytes(&funding_script_pubkey);
1337
+
1338
+ let sig_hash = ddk_dlc::util::get_sig_hash_msg(
1339
+ &btc_tx,
1340
+ 0, // input_index is always 0 for CETs
1341
+ funding_script,
1342
+ Amount::from_sat(fund_output_value),
1343
+ )
1344
+ .map_err(DLCError::from)?;
1345
+
1346
+ Ok(sig_hash.as_ref().to_vec())
1347
+ }
1348
+
1157
1349
  pub fn convert_mnemonic_to_seed(
1158
1350
  mnemonic: String,
1159
1351
  passphrase: Option<String>,
@@ -2066,4 +2258,242 @@ mod tests {
2066
2258
  let ecdsa_sig = EcdsaSignature::from_der(&ecdsa_sig_bytes);
2067
2259
  assert!(ecdsa_sig.is_ok(), "Should be valid DER signature");
2068
2260
  }
2261
+
2262
+ #[test]
2263
+ fn test_get_cet_sighash() {
2264
+ // Setup: Create DLC transactions to get a valid CET
2265
+ let (offer_party_params, _offer_fund_sk) =
2266
+ get_party_params(1_000_000_000, 100_000_000, None);
2267
+ let (accept_party_params, _accept_fund_sk) =
2268
+ get_party_params(1_000_000_000, 100_000_000, Some(2));
2269
+
2270
+ let dlc_txs = create_dlc_transactions(
2271
+ payouts_test(),
2272
+ offer_party_params.clone(),
2273
+ accept_party_params.clone(),
2274
+ 100,
2275
+ 4,
2276
+ 10,
2277
+ 10,
2278
+ 0,
2279
+ )
2280
+ .unwrap();
2281
+
2282
+ let cet = dlc_txs.cets[0].clone();
2283
+ let funding_script_pubkey = ddk_dlc::make_funding_redeemscript(
2284
+ &PublicKey::from_slice(&offer_party_params.fund_pubkey).unwrap(),
2285
+ &PublicKey::from_slice(&accept_party_params.fund_pubkey).unwrap(),
2286
+ );
2287
+ let fund_output_value = dlc_txs.fund.outputs[0].value;
2288
+
2289
+ // Act: Get the sighash
2290
+ let result = get_cet_sighash(
2291
+ cet.clone(),
2292
+ funding_script_pubkey.clone().into_bytes(),
2293
+ fund_output_value,
2294
+ );
2295
+
2296
+ // Assert
2297
+ assert!(result.is_ok(), "get_cet_sighash should succeed");
2298
+ let sighash = result.unwrap();
2299
+ assert_eq!(sighash.len(), 32, "Sighash should be 32 bytes");
2300
+
2301
+ // Verify against direct ddk-dlc call
2302
+ let btc_tx = transaction_to_btc_tx(&cet).unwrap();
2303
+ let direct_sighash = ddk_dlc::util::get_sig_hash_msg(
2304
+ &btc_tx,
2305
+ 0,
2306
+ Script::from_bytes(&funding_script_pubkey.clone().into_bytes()),
2307
+ Amount::from_sat(fund_output_value),
2308
+ )
2309
+ .unwrap();
2310
+
2311
+ assert_eq!(
2312
+ sighash,
2313
+ direct_sighash.as_ref().to_vec(),
2314
+ "Sighash should match direct ddk-dlc calculation"
2315
+ );
2316
+ }
2317
+
2318
+ #[test]
2319
+ fn test_get_cet_adaptor_signature_inputs() {
2320
+ // Setup: Create DLC transactions and oracle info
2321
+ let secp = Secp256k1::new();
2322
+ let mut rng = secp256k1_zkp::rand::thread_rng();
2323
+ let (offer_party_params, _offer_fund_sk) =
2324
+ get_party_params(1_000_000_000, 100_000_000, None);
2325
+ let (accept_party_params, _accept_fund_sk) =
2326
+ get_party_params(1_000_000_000, 100_000_000, Some(2));
2327
+
2328
+ let dlc_txs = create_dlc_transactions(
2329
+ payouts_test(),
2330
+ offer_party_params.clone(),
2331
+ accept_party_params.clone(),
2332
+ 100,
2333
+ 4,
2334
+ 10,
2335
+ 10,
2336
+ 0,
2337
+ )
2338
+ .unwrap();
2339
+
2340
+ let cet = dlc_txs.cets[0].clone();
2341
+ let funding_script_pubkey = ddk_dlc::make_funding_redeemscript(
2342
+ &PublicKey::from_slice(&offer_party_params.fund_pubkey).unwrap(),
2343
+ &PublicKey::from_slice(&accept_party_params.fund_pubkey).unwrap(),
2344
+ );
2345
+ let fund_output_value = dlc_txs.fund.outputs[0].value;
2346
+
2347
+ // Create oracle info (single oracle, single nonce for enumeration)
2348
+ let oracle_kp = Keypair::new(&secp, &mut rng);
2349
+ let oracle_pubkey = oracle_kp.x_only_public_key().0;
2350
+ let mut sk_nonce = [0u8; 32];
2351
+ rng.fill_bytes(&mut sk_nonce);
2352
+ let oracle_r_kp = Keypair::from_seckey_slice(&secp, &sk_nonce).unwrap();
2353
+ let nonce = XOnlyPublicKey::from_keypair(&oracle_r_kp).0;
2354
+
2355
+ let oracle_info = vec![OracleInfo {
2356
+ public_key: oracle_pubkey.serialize().to_vec(),
2357
+ nonces: vec![nonce.serialize().to_vec()],
2358
+ }];
2359
+
2360
+ // Create message (first outcome)
2361
+ let message = &[0u8];
2362
+ let hash = sha256::Hash::hash(message).to_byte_array();
2363
+ let msgs = vec![vec![hash.to_vec()]]; // Single oracle, single message
2364
+
2365
+ // Act: Get debug info
2366
+ let result = get_cet_adaptor_signature_inputs(
2367
+ cet.clone(),
2368
+ oracle_info.clone(),
2369
+ funding_script_pubkey.clone().into_bytes(),
2370
+ fund_output_value,
2371
+ msgs.clone(),
2372
+ );
2373
+
2374
+ // Assert
2375
+ assert!(
2376
+ result.is_ok(),
2377
+ "get_cet_adaptor_signature_inputs should succeed"
2378
+ );
2379
+ let debug_info = result.unwrap();
2380
+
2381
+ // Verify sighash
2382
+ assert_eq!(debug_info.sighash.len(), 32, "Sighash should be 32 bytes");
2383
+ let expected_sighash = get_cet_sighash(
2384
+ cet.clone(),
2385
+ funding_script_pubkey.clone().into_bytes(),
2386
+ fund_output_value,
2387
+ )
2388
+ .unwrap();
2389
+ assert_eq!(
2390
+ debug_info.sighash, expected_sighash,
2391
+ "Sighash should match get_cet_sighash result"
2392
+ );
2393
+
2394
+ // Verify adaptor point
2395
+ assert_eq!(
2396
+ debug_info.adaptor_point.len(),
2397
+ 33,
2398
+ "Adaptor point should be 33 bytes (compressed pubkey)"
2399
+ );
2400
+
2401
+ // Verify input index is always 0 for CETs
2402
+ assert_eq!(
2403
+ debug_info.input_index, 0,
2404
+ "Input index should always be 0 for CETs"
2405
+ );
2406
+
2407
+ // Verify script_pubkey matches what we passed in
2408
+ assert_eq!(
2409
+ debug_info.script_pubkey,
2410
+ funding_script_pubkey.clone().into_bytes(),
2411
+ "Script pubkey should match input"
2412
+ );
2413
+
2414
+ // Verify value matches
2415
+ assert_eq!(
2416
+ debug_info.value, fund_output_value,
2417
+ "Value should match input"
2418
+ );
2419
+
2420
+ // Verify cet_txid is valid
2421
+ let btc_tx = transaction_to_btc_tx(&cet).unwrap();
2422
+ assert_eq!(
2423
+ debug_info.cet_txid,
2424
+ btc_tx.compute_txid().to_string(),
2425
+ "CET txid should match"
2426
+ );
2427
+
2428
+ // Verify cet_raw matches input
2429
+ assert_eq!(
2430
+ debug_info.cet_raw, cet.raw_bytes,
2431
+ "CET raw bytes should match input"
2432
+ );
2433
+ }
2434
+
2435
+ #[test]
2436
+ fn test_get_cet_sighash_invalid_transaction() {
2437
+ // Create an invalid transaction (empty raw_bytes)
2438
+ let invalid_tx = Transaction {
2439
+ version: 2,
2440
+ lock_time: 0,
2441
+ inputs: vec![],
2442
+ outputs: vec![],
2443
+ raw_bytes: vec![0x00], // Invalid serialization
2444
+ };
2445
+
2446
+ let result = get_cet_sighash(invalid_tx, vec![0x00, 0x14], 100_000);
2447
+
2448
+ assert!(
2449
+ result.is_err(),
2450
+ "Should fail with invalid transaction bytes"
2451
+ );
2452
+ }
2453
+
2454
+ #[test]
2455
+ fn test_get_cet_adaptor_signature_inputs_invalid_oracle_pubkey() {
2456
+ // Setup valid CET
2457
+ let (offer_party_params, _) = get_party_params(1_000_000_000, 100_000_000, None);
2458
+ let (accept_party_params, _) = get_party_params(1_000_000_000, 100_000_000, Some(2));
2459
+
2460
+ let dlc_txs = create_dlc_transactions(
2461
+ payouts_test(),
2462
+ offer_party_params.clone(),
2463
+ accept_party_params.clone(),
2464
+ 100,
2465
+ 4,
2466
+ 10,
2467
+ 10,
2468
+ 0,
2469
+ )
2470
+ .unwrap();
2471
+
2472
+ let cet = dlc_txs.cets[0].clone();
2473
+ let funding_script_pubkey = ddk_dlc::make_funding_redeemscript(
2474
+ &PublicKey::from_slice(&offer_party_params.fund_pubkey).unwrap(),
2475
+ &PublicKey::from_slice(&accept_party_params.fund_pubkey).unwrap(),
2476
+ );
2477
+
2478
+ // Invalid oracle info (wrong pubkey length)
2479
+ let invalid_oracle_info = vec![OracleInfo {
2480
+ public_key: vec![0x00; 20], // Invalid: should be 32 bytes for x-only
2481
+ nonces: vec![vec![0x00; 32]],
2482
+ }];
2483
+
2484
+ let msgs = vec![vec![vec![0u8; 32]]];
2485
+
2486
+ let result = get_cet_adaptor_signature_inputs(
2487
+ cet,
2488
+ invalid_oracle_info,
2489
+ funding_script_pubkey.into_bytes(),
2490
+ 100_000,
2491
+ msgs,
2492
+ );
2493
+
2494
+ assert!(
2495
+ result.is_err(),
2496
+ "Should fail with invalid oracle public key"
2497
+ );
2498
+ }
2069
2499
  }
@@ -1 +1 @@
1
- {"version":3,"names":["getter","globalThis","NativeDdkFfi","_default","exports","default","isRustFutureContinuationCallbackTypeCompatible","isUniffiForeignFutureTypeCompatible"],"sourceRoot":"../../src","sources":["ddk_ffi-ffi.ts"],"mappings":";;;;;;AAAA;AACA;;AAkQA;AACA;AACA;AACA;AACA;AACA,MAAMA,MAAmC,GAAGA,CAAA,KACzCC,UAAU,CAASC,YAAY;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACpBL,MAAM,EAErB;AAmHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMM,8CAGL,GAAG,IAAI;AACR,MAAMC,mCAGL,GAAG,IAAI","ignoreList":[]}
1
+ {"version":3,"names":["getter","globalThis","NativeDdkFfi","_default","exports","default","isRustFutureContinuationCallbackTypeCompatible","isUniffiForeignFutureTypeCompatible"],"sourceRoot":"../../src","sources":["ddk_ffi-ffi.ts"],"mappings":";;;;;;AAAA;AACA;;AA2RA;AACA;AACA;AACA;AACA;AACA,MAAMA,MAAmC,GAAGA,CAAA,KACzCC,UAAU,CAASC,YAAY;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACpBL,MAAM,EAErB;AAmHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMM,8CAGL,GAAG,IAAI;AACR,MAAMC,mCAGL,GAAG,IAAI","ignoreList":[]}