libbitcoinkernel-sys 0.3.0

Raw FFI bindings to libbitcoinkernel. For safe usage, see the bitcoinkernel crate.
Documentation
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
//! Raw FFI bindings to libbitcoinkernel.
//!
//! For documentation on the underlying API, refer to the upstream C header:
//! <https://github.com/bitcoin/bitcoin/blob/master/src/kernel/bitcoinkernel.h>

#![no_std]
#![allow(non_camel_case_types, non_upper_case_globals)]

use core::ffi::{c_char, c_int, c_uchar, c_uint, c_void};

// Primitive type aliases - alphabetical order

pub type btck_BlockCheckFlags = u32;
pub type btck_BlockValidationResult = u32;
pub type btck_ChainType = u8;
pub type btck_LogCategory = u8;
pub type btck_LogLevel = u8;
pub type btck_ScriptVerificationFlags = u32;
pub type btck_ScriptVerifyStatus = u8;
pub type btck_SynchronizationState = u8;
pub type btck_ValidationMode = u8;
pub type btck_Warning = u8;

// btck_BlockValidationResult

pub const btck_BlockValidationResult_UNSET: btck_BlockValidationResult = 0;
pub const btck_BlockValidationResult_CONSENSUS: btck_BlockValidationResult = 1;
pub const btck_BlockValidationResult_CACHED_INVALID: btck_BlockValidationResult = 2;
pub const btck_BlockValidationResult_INVALID_HEADER: btck_BlockValidationResult = 3;
pub const btck_BlockValidationResult_MUTATED: btck_BlockValidationResult = 4;
pub const btck_BlockValidationResult_MISSING_PREV: btck_BlockValidationResult = 5;
pub const btck_BlockValidationResult_INVALID_PREV: btck_BlockValidationResult = 6;
pub const btck_BlockValidationResult_TIME_FUTURE: btck_BlockValidationResult = 7;
pub const btck_BlockValidationResult_HEADER_LOW_WORK: btck_BlockValidationResult = 8;

// btck_ChainType

pub const btck_ChainType_MAINNET: btck_ChainType = 0;
pub const btck_ChainType_TESTNET: btck_ChainType = 1;
pub const btck_ChainType_TESTNET_4: btck_ChainType = 2;
pub const btck_ChainType_SIGNET: btck_ChainType = 3;
pub const btck_ChainType_REGTEST: btck_ChainType = 4;

// btck_LogCategory

pub const btck_LogCategory_ALL: btck_LogCategory = 0;
pub const btck_LogCategory_BENCH: btck_LogCategory = 1;
pub const btck_LogCategory_BLOCKSTORAGE: btck_LogCategory = 2;
pub const btck_LogCategory_COINDB: btck_LogCategory = 3;
pub const btck_LogCategory_LEVELDB: btck_LogCategory = 4;
pub const btck_LogCategory_MEMPOOL: btck_LogCategory = 5;
pub const btck_LogCategory_PRUNE: btck_LogCategory = 6;
pub const btck_LogCategory_RAND: btck_LogCategory = 7;
pub const btck_LogCategory_REINDEX: btck_LogCategory = 8;
pub const btck_LogCategory_VALIDATION: btck_LogCategory = 9;
pub const btck_LogCategory_KERNEL: btck_LogCategory = 10;

// btck_LogLevel

pub const btck_LogLevel_TRACE: btck_LogLevel = 0;
pub const btck_LogLevel_DEBUG: btck_LogLevel = 1;
pub const btck_LogLevel_INFO: btck_LogLevel = 2;

// btck_ScriptVerificationFlags

pub const btck_ScriptVerificationFlags_NONE: btck_ScriptVerificationFlags = 0;
pub const btck_ScriptVerificationFlags_P2SH: btck_ScriptVerificationFlags = 1 << 0;
pub const btck_ScriptVerificationFlags_DERSIG: btck_ScriptVerificationFlags = 1 << 2;
pub const btck_ScriptVerificationFlags_NULLDUMMY: btck_ScriptVerificationFlags = 1 << 4;
pub const btck_ScriptVerificationFlags_CHECKLOCKTIMEVERIFY: btck_ScriptVerificationFlags = 1 << 9;
pub const btck_ScriptVerificationFlags_CHECKSEQUENCEVERIFY: btck_ScriptVerificationFlags = 1 << 10;
pub const btck_ScriptVerificationFlags_WITNESS: btck_ScriptVerificationFlags = 1 << 11;
pub const btck_ScriptVerificationFlags_TAPROOT: btck_ScriptVerificationFlags = 1 << 17;
pub const btck_ScriptVerificationFlags_ALL: btck_ScriptVerificationFlags =
    btck_ScriptVerificationFlags_P2SH
        | btck_ScriptVerificationFlags_DERSIG
        | btck_ScriptVerificationFlags_NULLDUMMY
        | btck_ScriptVerificationFlags_CHECKLOCKTIMEVERIFY
        | btck_ScriptVerificationFlags_CHECKSEQUENCEVERIFY
        | btck_ScriptVerificationFlags_WITNESS
        | btck_ScriptVerificationFlags_TAPROOT;

// btck_ScriptVerifyStatus

pub const btck_ScriptVerifyStatus_OK: btck_ScriptVerifyStatus = 0;
pub const btck_ScriptVerifyStatus_ERROR_INVALID_FLAGS_COMBINATION: btck_ScriptVerifyStatus = 1;
pub const btck_ScriptVerifyStatus_ERROR_SPENT_OUTPUTS_REQUIRED: btck_ScriptVerifyStatus = 2;

// btck_SynchronizationState

pub const btck_SynchronizationState_INIT_REINDEX: btck_SynchronizationState = 0;
pub const btck_SynchronizationState_INIT_DOWNLOAD: btck_SynchronizationState = 1;
pub const btck_SynchronizationState_POST_INIT: btck_SynchronizationState = 2;

// btck_ValidationMode

pub const btck_ValidationMode_VALID: btck_ValidationMode = 0;
pub const btck_ValidationMode_INVALID: btck_ValidationMode = 1;
pub const btck_ValidationMode_INTERNAL_ERROR: btck_ValidationMode = 2;

// btck_Warning

pub const btck_Warning_UNKNOWN_NEW_RULES_ACTIVATED: btck_Warning = 0;
pub const btck_Warning_LARGE_WORK_INVALID_CHAIN: btck_Warning = 1;

// Opaque types - alphabetical order

#[repr(C)]
pub struct btck_Block {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_BlockHash {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_BlockHeader {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_BlockSpentOutputs {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_BlockTreeEntry {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_BlockValidationState {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_Chain {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_ChainParameters {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_ChainstateManager {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_ChainstateManagerOptions {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_Coin {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_ConsensusParams {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_Context {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_ContextOptions {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_LoggingConnection {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_PrecomputedTransactionData {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_ScriptPubkey {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_Transaction {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_TransactionInput {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_TransactionOutPoint {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_TransactionOutput {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_TransactionSpentOutputs {
    _unused: [u8; 0],
}
#[repr(C)]
pub struct btck_Txid {
    _unused: [u8; 0],
}

// Function-pointer type aliases - alphabetical order

pub type btck_DestroyCallback = Option<unsafe extern "C" fn(user_data: *mut c_void)>;

pub type btck_LogCallback = Option<
    unsafe extern "C" fn(user_data: *mut c_void, message: *const c_char, message_len: usize),
>;

pub type btck_NotifyBlockTip = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        state: btck_SynchronizationState,
        entry: *const btck_BlockTreeEntry,
        verification_progress: f64,
    ),
>;

pub type btck_NotifyFatalError = Option<
    unsafe extern "C" fn(user_data: *mut c_void, message: *const c_char, message_len: usize),
>;

pub type btck_NotifyFlushError = Option<
    unsafe extern "C" fn(user_data: *mut c_void, message: *const c_char, message_len: usize),
>;

pub type btck_NotifyHeaderTip = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        state: btck_SynchronizationState,
        height: i64,
        timestamp: i64,
        presync: c_int,
    ),
>;

pub type btck_NotifyProgress = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        title: *const c_char,
        title_len: usize,
        progress_percent: c_int,
        resume_possible: c_int,
    ),
>;

pub type btck_NotifyWarningSet = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        warning: btck_Warning,
        message: *const c_char,
        message_len: usize,
    ),
>;

pub type btck_NotifyWarningUnset =
    Option<unsafe extern "C" fn(user_data: *mut c_void, warning: btck_Warning)>;

pub type btck_ValidationInterfaceBlockChecked = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        block: *mut btck_Block,
        state: *const btck_BlockValidationState,
    ),
>;

pub type btck_ValidationInterfaceBlockConnected = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        block: *mut btck_Block,
        entry: *const btck_BlockTreeEntry,
    ),
>;

pub type btck_ValidationInterfaceBlockDisconnected = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        block: *mut btck_Block,
        entry: *const btck_BlockTreeEntry,
    ),
>;

pub type btck_ValidationInterfacePoWValidBlock = Option<
    unsafe extern "C" fn(
        user_data: *mut c_void,
        block: *mut btck_Block,
        entry: *const btck_BlockTreeEntry,
    ),
>;

pub type btck_WriteBytes =
    Option<unsafe extern "C" fn(bytes: *const c_void, size: usize, userdata: *mut c_void) -> c_int>;

// These structs are passed by value across the FFI boundary - alphabetical order
// Field order must match C exactly - sizes verified by const assertions below

#[repr(C)]
pub struct btck_LoggingOptions {
    pub log_timestamps: c_int,
    pub log_time_micros: c_int,
    pub log_threadnames: c_int,
    pub log_sourcelocations: c_int,
    pub always_print_category_levels: c_int,
}

#[repr(C)]
pub struct btck_NotificationInterfaceCallbacks {
    pub user_data: *mut c_void,
    pub user_data_destroy: btck_DestroyCallback,
    pub block_tip: btck_NotifyBlockTip,
    pub header_tip: btck_NotifyHeaderTip,
    pub progress: btck_NotifyProgress,
    pub warning_set: btck_NotifyWarningSet,
    pub warning_unset: btck_NotifyWarningUnset,
    pub flush_error: btck_NotifyFlushError,
    pub fatal_error: btck_NotifyFatalError,
}

#[repr(C)]
pub struct btck_ValidationInterfaceCallbacks {
    pub user_data: *mut c_void,
    pub user_data_destroy: btck_DestroyCallback,
    pub block_checked: btck_ValidationInterfaceBlockChecked,
    pub pow_valid_block: btck_ValidationInterfacePoWValidBlock,
    pub block_connected: btck_ValidationInterfaceBlockConnected,
    pub block_disconnected: btck_ValidationInterfaceBlockDisconnected,
}

// Layout guards for structs passed by value across the FFI boundary.
// Pointer-sized fields use size_of::<*const ()>() to remain correct on both
// 32-bit and 64-bit targets.
const _: () = {
    assert!(core::mem::size_of::<btck_LoggingOptions>() == 20);
    assert!(core::mem::align_of::<btck_LoggingOptions>() == 4);
    assert!(
        core::mem::size_of::<btck_NotificationInterfaceCallbacks>()
            == 9 * core::mem::size_of::<*const ()>()
    );
    assert!(
        core::mem::align_of::<btck_NotificationInterfaceCallbacks>()
            == core::mem::align_of::<*const ()>()
    );
    assert!(
        core::mem::size_of::<btck_ValidationInterfaceCallbacks>()
            == 6 * core::mem::size_of::<*const ()>()
    );
    assert!(
        core::mem::align_of::<btck_ValidationInterfaceCallbacks>()
            == core::mem::align_of::<*const ()>()
    );
};

// extern "C" declarations - grouped by type

extern "C" {

    // --- Transaction --------------------------------------------------------

    pub fn btck_transaction_create(
        raw_transaction: *const c_void,
        raw_transaction_len: usize,
    ) -> *mut btck_Transaction;

    pub fn btck_transaction_copy(transaction: *const btck_Transaction) -> *mut btck_Transaction;

    pub fn btck_transaction_to_bytes(
        transaction: *const btck_Transaction,
        writer: btck_WriteBytes,
        user_data: *mut c_void,
    ) -> c_int;

    pub fn btck_transaction_count_outputs(transaction: *const btck_Transaction) -> usize;

    pub fn btck_transaction_get_output_at(
        transaction: *const btck_Transaction,
        output_index: usize,
    ) -> *const btck_TransactionOutput;

    pub fn btck_transaction_get_input_at(
        transaction: *const btck_Transaction,
        input_index: usize,
    ) -> *const btck_TransactionInput;

    pub fn btck_transaction_count_inputs(transaction: *const btck_Transaction) -> usize;

    pub fn btck_transaction_get_locktime(transaction: *const btck_Transaction) -> u32;

    pub fn btck_transaction_get_txid(transaction: *const btck_Transaction) -> *const btck_Txid;

    pub fn btck_transaction_destroy(transaction: *mut btck_Transaction);

    // --- PrecomputedTransactionData -----------------------------------------

    pub fn btck_precomputed_transaction_data_create(
        tx_to: *const btck_Transaction,
        spent_outputs: *mut *const btck_TransactionOutput,
        spent_outputs_len: usize,
    ) -> *mut btck_PrecomputedTransactionData;

    pub fn btck_precomputed_transaction_data_copy(
        precomputed_txdata: *const btck_PrecomputedTransactionData,
    ) -> *mut btck_PrecomputedTransactionData;

    pub fn btck_precomputed_transaction_data_destroy(
        precomputed_txdata: *mut btck_PrecomputedTransactionData,
    );

    // --- ScriptPubkey -------------------------------------------------------

    pub fn btck_script_pubkey_create(
        script_pubkey: *const c_void,
        script_pubkey_len: usize,
    ) -> *mut btck_ScriptPubkey;

    pub fn btck_script_pubkey_copy(
        script_pubkey: *const btck_ScriptPubkey,
    ) -> *mut btck_ScriptPubkey;

    pub fn btck_script_pubkey_verify(
        script_pubkey: *const btck_ScriptPubkey,
        amount: i64,
        tx_to: *const btck_Transaction,
        precomputed_txdata: *const btck_PrecomputedTransactionData,
        input_index: c_uint,
        flags: btck_ScriptVerificationFlags,
        status: *mut btck_ScriptVerifyStatus,
    ) -> c_int;

    pub fn btck_script_pubkey_to_bytes(
        script_pubkey: *const btck_ScriptPubkey,
        writer: btck_WriteBytes,
        user_data: *mut c_void,
    ) -> c_int;

    pub fn btck_script_pubkey_destroy(script_pubkey: *mut btck_ScriptPubkey);

    // --- TransactionOutput --------------------------------------------------

    pub fn btck_transaction_output_create(
        script_pubkey: *const btck_ScriptPubkey,
        amount: i64,
    ) -> *mut btck_TransactionOutput;

    pub fn btck_transaction_output_get_script_pubkey(
        transaction_output: *const btck_TransactionOutput,
    ) -> *const btck_ScriptPubkey;

    pub fn btck_transaction_output_get_amount(
        transaction_output: *const btck_TransactionOutput,
    ) -> i64;

    pub fn btck_transaction_output_copy(
        transaction_output: *const btck_TransactionOutput,
    ) -> *mut btck_TransactionOutput;

    pub fn btck_transaction_output_destroy(transaction_output: *mut btck_TransactionOutput);

    // --- Logging ------------------------------------------------------------

    pub fn btck_logging_disable();

    pub fn btck_logging_set_options(options: btck_LoggingOptions);

    pub fn btck_logging_set_level_category(category: btck_LogCategory, level: btck_LogLevel);

    pub fn btck_logging_enable_category(category: btck_LogCategory);

    pub fn btck_logging_disable_category(category: btck_LogCategory);

    pub fn btck_logging_connection_create(
        log_callback: btck_LogCallback,
        user_data: *mut c_void,
        user_data_destroy_callback: btck_DestroyCallback,
    ) -> *mut btck_LoggingConnection;

    pub fn btck_logging_connection_destroy(logging_connection: *mut btck_LoggingConnection);

    // --- ChainParameters ----------------------------------------------------

    pub fn btck_chain_parameters_create(chain_type: btck_ChainType) -> *mut btck_ChainParameters;

    pub fn btck_chain_parameters_copy(
        chain_parameters: *const btck_ChainParameters,
    ) -> *mut btck_ChainParameters;

    pub fn btck_chain_parameters_get_consensus_params(
        chain_parameters: *const btck_ChainParameters,
    ) -> *const btck_ConsensusParams;

    pub fn btck_chain_parameters_destroy(chain_parameters: *mut btck_ChainParameters);

    // --- ContextOptions -----------------------------------------------------

    pub fn btck_context_options_create() -> *mut btck_ContextOptions;

    pub fn btck_context_options_set_chainparams(
        context_options: *mut btck_ContextOptions,
        chain_parameters: *const btck_ChainParameters,
    );

    pub fn btck_context_options_set_notifications(
        context_options: *mut btck_ContextOptions,
        notifications: btck_NotificationInterfaceCallbacks,
    );

    pub fn btck_context_options_set_validation_interface(
        context_options: *mut btck_ContextOptions,
        validation_interface_callbacks: btck_ValidationInterfaceCallbacks,
    );

    pub fn btck_context_options_destroy(context_options: *mut btck_ContextOptions);

    // --- Context ------------------------------------------------------------

    pub fn btck_context_create(context_options: *const btck_ContextOptions) -> *mut btck_Context;

    pub fn btck_context_copy(context: *const btck_Context) -> *mut btck_Context;

    pub fn btck_context_interrupt(context: *mut btck_Context) -> c_int;

    pub fn btck_context_destroy(context: *mut btck_Context);

    // --- BlockTreeEntry -----------------------------------------------------

    pub fn btck_block_tree_entry_get_previous(
        block_tree_entry: *const btck_BlockTreeEntry,
    ) -> *const btck_BlockTreeEntry;

    pub fn btck_block_tree_entry_get_ancestor(
        block_tree_entry: *const btck_BlockTreeEntry,
        height: i32,
    ) -> *const btck_BlockTreeEntry;

    pub fn btck_block_tree_entry_get_block_header(
        block_tree_entry: *const btck_BlockTreeEntry,
    ) -> *mut btck_BlockHeader;

    pub fn btck_block_tree_entry_get_height(block_tree_entry: *const btck_BlockTreeEntry) -> i32;

    pub fn btck_block_tree_entry_get_block_hash(
        block_tree_entry: *const btck_BlockTreeEntry,
    ) -> *const btck_BlockHash;

    pub fn btck_block_tree_entry_equals(
        entry1: *const btck_BlockTreeEntry,
        entry2: *const btck_BlockTreeEntry,
    ) -> c_int;

    // --- ChainstateManagerOptions -------------------------------------------

    pub fn btck_chainstate_manager_options_create(
        context: *const btck_Context,
        data_directory: *const c_char,
        data_directory_len: usize,
        blocks_directory: *const c_char,
        blocks_directory_len: usize,
    ) -> *mut btck_ChainstateManagerOptions;

    pub fn btck_chainstate_manager_options_set_worker_threads_num(
        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
        worker_threads: c_int,
    );

    pub fn btck_chainstate_manager_options_set_wipe_dbs(
        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
        wipe_block_tree_db: c_int,
        wipe_chainstate_db: c_int,
    ) -> c_int;

    pub fn btck_chainstate_manager_options_update_block_tree_db_in_memory(
        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
        block_tree_db_in_memory: c_int,
    );

    pub fn btck_chainstate_manager_options_update_chainstate_db_in_memory(
        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
        chainstate_db_in_memory: c_int,
    );

    pub fn btck_chainstate_manager_options_destroy(
        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
    );

    // --- ChainstateManager --------------------------------------------------

    pub fn btck_chainstate_manager_create(
        chainstate_manager_options: *const btck_ChainstateManagerOptions,
    ) -> *mut btck_ChainstateManager;

    pub fn btck_chainstate_manager_get_best_entry(
        chainstate_manager: *const btck_ChainstateManager,
    ) -> *const btck_BlockTreeEntry;

    pub fn btck_chainstate_manager_process_block_header(
        chainstate_manager: *mut btck_ChainstateManager,
        header: *const btck_BlockHeader,
        block_validation_state: *mut btck_BlockValidationState,
    ) -> c_int;

    pub fn btck_chainstate_manager_import_blocks(
        chainstate_manager: *mut btck_ChainstateManager,
        block_file_paths_data: *mut *const c_char,
        block_file_paths_lens: *mut usize,
        block_file_paths_data_len: usize,
    ) -> c_int;

    pub fn btck_chainstate_manager_process_block(
        chainstate_manager: *mut btck_ChainstateManager,
        block: *const btck_Block,
        new_block: *mut c_int,
    ) -> c_int;

    pub fn btck_chainstate_manager_get_active_chain(
        chainstate_manager: *const btck_ChainstateManager,
    ) -> *const btck_Chain;

    pub fn btck_chainstate_manager_get_block_tree_entry_by_hash(
        chainstate_manager: *const btck_ChainstateManager,
        block_hash: *const btck_BlockHash,
    ) -> *const btck_BlockTreeEntry;

    pub fn btck_chainstate_manager_destroy(chainstate_manager: *mut btck_ChainstateManager);

    // --- Block --------------------------------------------------------------

    pub fn btck_block_read(
        chainstate_manager: *const btck_ChainstateManager,
        block_tree_entry: *const btck_BlockTreeEntry,
    ) -> *mut btck_Block;

    pub fn btck_block_create(raw_block: *const c_void, raw_block_len: usize) -> *mut btck_Block;

    pub fn btck_block_copy(block: *const btck_Block) -> *mut btck_Block;

    pub fn btck_block_check(
        block: *const btck_Block,
        consensus_params: *const btck_ConsensusParams,
        flags: btck_BlockCheckFlags,
        validation_state: *mut btck_BlockValidationState,
    ) -> c_int;

    pub fn btck_block_count_transactions(block: *const btck_Block) -> usize;

    pub fn btck_block_get_transaction_at(
        block: *const btck_Block,
        transaction_index: usize,
    ) -> *const btck_Transaction;

    pub fn btck_block_get_header(block: *const btck_Block) -> *mut btck_BlockHeader;

    pub fn btck_block_get_hash(block: *const btck_Block) -> *mut btck_BlockHash;

    pub fn btck_block_to_bytes(
        block: *const btck_Block,
        writer: btck_WriteBytes,
        user_data: *mut c_void,
    ) -> c_int;

    pub fn btck_block_destroy(block: *mut btck_Block);

    // --- BlockValidationState -----------------------------------------------

    pub fn btck_block_validation_state_create() -> *mut btck_BlockValidationState;

    pub fn btck_block_validation_state_get_validation_mode(
        block_validation_state: *const btck_BlockValidationState,
    ) -> btck_ValidationMode;

    pub fn btck_block_validation_state_get_block_validation_result(
        block_validation_state: *const btck_BlockValidationState,
    ) -> btck_BlockValidationResult;

    pub fn btck_block_validation_state_copy(
        block_validation_state: *const btck_BlockValidationState,
    ) -> *mut btck_BlockValidationState;

    pub fn btck_block_validation_state_destroy(
        block_validation_state: *mut btck_BlockValidationState,
    );

    // --- Chain --------------------------------------------------------------

    pub fn btck_chain_get_height(chain: *const btck_Chain) -> i32;

    pub fn btck_chain_get_by_height(
        chain: *const btck_Chain,
        block_height: i32,
    ) -> *const btck_BlockTreeEntry;

    pub fn btck_chain_contains(
        chain: *const btck_Chain,
        block_tree_entry: *const btck_BlockTreeEntry,
    ) -> c_int;

    // --- BlockSpentOutputs --------------------------------------------------

    pub fn btck_block_spent_outputs_read(
        chainstate_manager: *const btck_ChainstateManager,
        block_tree_entry: *const btck_BlockTreeEntry,
    ) -> *mut btck_BlockSpentOutputs;

    pub fn btck_block_spent_outputs_copy(
        block_spent_outputs: *const btck_BlockSpentOutputs,
    ) -> *mut btck_BlockSpentOutputs;

    pub fn btck_block_spent_outputs_count(
        block_spent_outputs: *const btck_BlockSpentOutputs,
    ) -> usize;

    pub fn btck_block_spent_outputs_get_transaction_spent_outputs_at(
        block_spent_outputs: *const btck_BlockSpentOutputs,
        transaction_spent_outputs_index: usize,
    ) -> *const btck_TransactionSpentOutputs;

    pub fn btck_block_spent_outputs_destroy(block_spent_outputs: *mut btck_BlockSpentOutputs);

    // --- TransactionSpentOutputs --------------------------------------------

    pub fn btck_transaction_spent_outputs_copy(
        transaction_spent_outputs: *const btck_TransactionSpentOutputs,
    ) -> *mut btck_TransactionSpentOutputs;

    pub fn btck_transaction_spent_outputs_count(
        transaction_spent_outputs: *const btck_TransactionSpentOutputs,
    ) -> usize;

    pub fn btck_transaction_spent_outputs_get_coin_at(
        transaction_spent_outputs: *const btck_TransactionSpentOutputs,
        coin_index: usize,
    ) -> *const btck_Coin;

    pub fn btck_transaction_spent_outputs_destroy(
        transaction_spent_outputs: *mut btck_TransactionSpentOutputs,
    );

    // --- TransactionInput ---------------------------------------------------

    pub fn btck_transaction_input_copy(
        transaction_input: *const btck_TransactionInput,
    ) -> *mut btck_TransactionInput;

    pub fn btck_transaction_input_get_out_point(
        transaction_input: *const btck_TransactionInput,
    ) -> *const btck_TransactionOutPoint;

    pub fn btck_transaction_input_get_sequence(
        transaction_input: *const btck_TransactionInput,
    ) -> u32;

    pub fn btck_transaction_input_destroy(transaction_input: *mut btck_TransactionInput);

    // --- TransactionOutPoint ------------------------------------------------

    pub fn btck_transaction_out_point_copy(
        transaction_out_point: *const btck_TransactionOutPoint,
    ) -> *mut btck_TransactionOutPoint;

    pub fn btck_transaction_out_point_get_index(
        transaction_out_point: *const btck_TransactionOutPoint,
    ) -> u32;

    pub fn btck_transaction_out_point_get_txid(
        transaction_out_point: *const btck_TransactionOutPoint,
    ) -> *const btck_Txid;

    pub fn btck_transaction_out_point_destroy(transaction_out_point: *mut btck_TransactionOutPoint);

    // --- Txid ---------------------------------------------------------------

    pub fn btck_txid_copy(txid: *const btck_Txid) -> *mut btck_Txid;

    pub fn btck_txid_equals(txid1: *const btck_Txid, txid2: *const btck_Txid) -> c_int;

    pub fn btck_txid_to_bytes(txid: *const btck_Txid, output: *mut c_uchar);

    pub fn btck_txid_destroy(txid: *mut btck_Txid);

    // --- Coin ---------------------------------------------------------------

    pub fn btck_coin_copy(coin: *const btck_Coin) -> *mut btck_Coin;

    pub fn btck_coin_confirmation_height(coin: *const btck_Coin) -> u32;

    pub fn btck_coin_is_coinbase(coin: *const btck_Coin) -> c_int;

    pub fn btck_coin_get_output(coin: *const btck_Coin) -> *const btck_TransactionOutput;

    pub fn btck_coin_destroy(coin: *mut btck_Coin);

    // --- BlockHash ----------------------------------------------------------

    pub fn btck_block_hash_create(block_hash: *const c_uchar) -> *mut btck_BlockHash;

    pub fn btck_block_hash_equals(
        hash1: *const btck_BlockHash,
        hash2: *const btck_BlockHash,
    ) -> c_int;

    pub fn btck_block_hash_copy(block_hash: *const btck_BlockHash) -> *mut btck_BlockHash;

    pub fn btck_block_hash_to_bytes(block_hash: *const btck_BlockHash, output: *mut c_uchar);

    pub fn btck_block_hash_destroy(block_hash: *mut btck_BlockHash);

    // --- BlockHeader --------------------------------------------------------

    pub fn btck_block_header_create(
        raw_block_header: *const c_void,
        raw_block_header_len: usize,
    ) -> *mut btck_BlockHeader;

    pub fn btck_block_header_copy(header: *const btck_BlockHeader) -> *mut btck_BlockHeader;

    pub fn btck_block_header_get_hash(header: *const btck_BlockHeader) -> *mut btck_BlockHash;

    pub fn btck_block_header_get_prev_hash(
        header: *const btck_BlockHeader,
    ) -> *const btck_BlockHash;

    pub fn btck_block_header_get_timestamp(header: *const btck_BlockHeader) -> u32;

    pub fn btck_block_header_get_bits(header: *const btck_BlockHeader) -> u32;

    pub fn btck_block_header_get_version(header: *const btck_BlockHeader) -> i32;

    pub fn btck_block_header_get_nonce(header: *const btck_BlockHeader) -> u32;

    pub fn btck_block_header_to_bytes(
        header: *const btck_BlockHeader,
        output: *mut c_uchar,
    ) -> c_int;

    pub fn btck_block_header_destroy(header: *mut btck_BlockHeader);

} // extern "C"