#[allow(unused_imports)]
use crate::constants::{
BIP54_MAX_SIGOPS_PER_TX, HALVING_INTERVAL, INITIAL_SUBSIDY, LOCKTIME_THRESHOLD,
MAX_BLOCK_SIGOPS_COST, MAX_MONEY, TAPROOT_ACTIVATION_MAINNET, TAPROOT_ACTIVATION_TESTNET,
};
#[cfg(feature = "spec-lock")]
use blvm_spec_lock::spec_locked;
#[cfg_attr(feature = "spec-lock", spec_locked("6.5", "F_FeeNonNeg"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_in >= total_out))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_out >= 0))]
pub(crate) fn _verify_f_fee_non_neg(total_in: i64, total_out: i64) -> i64 {
total_in - total_out
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.1", "F_FeeArithmeticNonNeg"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_in >= total_out))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_in >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_out >= 0))]
pub(crate) fn _verify_f_fee_arithmetic_non_neg(total_in: i64, total_out: i64) -> i64 {
total_in - total_out
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.1", "F_FeeArithmeticBounded"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_in >= total_out))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_in >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total_out >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result <= total_in))]
pub(crate) fn _verify_f_fee_arithmetic_bounded(total_in: i64, total_out: i64) -> i64 {
total_in - total_out
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.3", "F_CoinbaseScriptSigMin"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len >= 2))]
pub(crate) fn _verify_f_coinbase_scriptsig_min(len: i64) -> i64 {
len - 2
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.3", "F_CoinbaseScriptSigMax"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len <= 100))]
pub(crate) fn _verify_f_coinbase_scriptsig_max(len: i64) -> i64 {
100 - len
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.3", "F_StackSizeSafe"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(depth >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(depth < 1000))]
pub(crate) fn _verify_f_stack_size_safe(depth: i64) -> i64 {
999 - depth
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.3", "F_StackCombinedSafe"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(alt >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack + alt <= 1000))]
pub(crate) fn _verify_f_stack_combined_safe(stack: i64, alt: i64) -> i64 {
1000 - (stack + alt)
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.3", "F_StackCombinedFail"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(alt >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack + alt >= 1001))]
pub(crate) fn _verify_f_stack_combined_fail(stack: i64, alt: i64) -> i64 {
(stack + alt) - 1001
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("7.1", "F_ExpandTargetZeroMantissa")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires((bits & 0x007fffff) == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_expand_target_zero_mantissa(bits: u64) -> i64 {
let mantissa = bits & 0x007fffff;
if mantissa == 0 { 0 } else { 1 } }
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_ExpandTargetExponent"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result <= 255))]
pub(crate) fn _verify_f_expand_target_exponent(bits: i64) -> i64 {
(bits >> 24) & 0xff
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("7.1", "F_ExpandTargetNonZeroMantissa")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires((bits & 0x007fffff) != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result != 0))]
pub(crate) fn _verify_f_expand_target_non_zero_mantissa(bits: u64) -> i64 {
let mantissa = bits & 0x007fffff;
if mantissa == 0 { 0 } else { 1 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_RetargetIntervalCount"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 2015))]
pub(crate) fn _verify_f_retarget_interval_count() -> i64 {
let d = 2016;
d - 1
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_NextWorkClamped"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(bits > 0))]
pub(crate) fn _verify_f_next_work_clamped(bits: i64) -> i64 {
if bits > 486604799 { 486604799 } else { bits }
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.1", "F_SubsidyZeroAfter64"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height >= HALVING_INTERVAL * 64))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_subsidy_zero_after_64(height: u64) -> i64 {
let k = height / HALVING_INTERVAL;
if k >= 64 {
0
} else {
INITIAL_SUBSIDY }
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.1", "F_SubsidyZeroAfter33"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height >= HALVING_INTERVAL * 33))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_subsidy_zero_after_33(height: u64) -> i64 {
let k = height / HALVING_INTERVAL;
match k {
0 => INITIAL_SUBSIDY,
1 => INITIAL_SUBSIDY >> 1,
2 => INITIAL_SUBSIDY >> 2,
3 => INITIAL_SUBSIDY >> 3,
4 => INITIAL_SUBSIDY >> 4,
5 => INITIAL_SUBSIDY >> 5,
6 => INITIAL_SUBSIDY >> 6,
7 => INITIAL_SUBSIDY >> 7,
8 => INITIAL_SUBSIDY >> 8,
9 => INITIAL_SUBSIDY >> 9,
10 => INITIAL_SUBSIDY >> 10,
11 => INITIAL_SUBSIDY >> 11,
12 => INITIAL_SUBSIDY >> 12,
13 => INITIAL_SUBSIDY >> 13,
14 => INITIAL_SUBSIDY >> 14,
15 => INITIAL_SUBSIDY >> 15,
16 => INITIAL_SUBSIDY >> 16,
17 => INITIAL_SUBSIDY >> 17,
18 => INITIAL_SUBSIDY >> 18,
19 => INITIAL_SUBSIDY >> 19,
20 => INITIAL_SUBSIDY >> 20,
21 => INITIAL_SUBSIDY >> 21,
22 => INITIAL_SUBSIDY >> 22,
23 => INITIAL_SUBSIDY >> 23,
24 => INITIAL_SUBSIDY >> 24,
25 => INITIAL_SUBSIDY >> 25,
26 => INITIAL_SUBSIDY >> 26,
27 => INITIAL_SUBSIDY >> 27,
28 => INITIAL_SUBSIDY >> 28,
29 => INITIAL_SUBSIDY >> 29,
30 => INITIAL_SUBSIDY >> 30,
31 => INITIAL_SUBSIDY >> 31,
32 => INITIAL_SUBSIDY >> 32,
33 => INITIAL_SUBSIDY >> 33,
34 => INITIAL_SUBSIDY >> 34,
35 => INITIAL_SUBSIDY >> 35,
36 => INITIAL_SUBSIDY >> 36,
37 => INITIAL_SUBSIDY >> 37,
38 => INITIAL_SUBSIDY >> 38,
39 => INITIAL_SUBSIDY >> 39,
40 => INITIAL_SUBSIDY >> 40,
41 => INITIAL_SUBSIDY >> 41,
42 => INITIAL_SUBSIDY >> 42,
43 => INITIAL_SUBSIDY >> 43,
44 => INITIAL_SUBSIDY >> 44,
45 => INITIAL_SUBSIDY >> 45,
46 => INITIAL_SUBSIDY >> 46,
47 => INITIAL_SUBSIDY >> 47,
48 => INITIAL_SUBSIDY >> 48,
49 => INITIAL_SUBSIDY >> 49,
50 => INITIAL_SUBSIDY >> 50,
51 => INITIAL_SUBSIDY >> 51,
52 => INITIAL_SUBSIDY >> 52,
53 => INITIAL_SUBSIDY >> 53,
54 => INITIAL_SUBSIDY >> 54,
55 => INITIAL_SUBSIDY >> 55,
56 => INITIAL_SUBSIDY >> 56,
57 => INITIAL_SUBSIDY >> 57,
58 => INITIAL_SUBSIDY >> 58,
59 => INITIAL_SUBSIDY >> 59,
60 => INITIAL_SUBSIDY >> 60,
61 => INITIAL_SUBSIDY >> 61,
62 => INITIAL_SUBSIDY >> 62,
63 => INITIAL_SUBSIDY >> 63,
_ => 0,
}
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.1", "F_SubsidyPiecewise"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(
result >= 0
))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(
result <= INITIAL_SUBSIDY
))]
pub(crate) fn _verify_f_subsidy_piecewise(height: u64) -> i64 {
let k = height / HALVING_INTERVAL;
match k {
0 => INITIAL_SUBSIDY,
1 => INITIAL_SUBSIDY >> 1,
2 => INITIAL_SUBSIDY >> 2,
3 => INITIAL_SUBSIDY >> 3,
4 => INITIAL_SUBSIDY >> 4,
5 => INITIAL_SUBSIDY >> 5,
6 => INITIAL_SUBSIDY >> 6,
7 => INITIAL_SUBSIDY >> 7,
8 => INITIAL_SUBSIDY >> 8,
9 => INITIAL_SUBSIDY >> 9,
10 => INITIAL_SUBSIDY >> 10,
11 => INITIAL_SUBSIDY >> 11,
12 => INITIAL_SUBSIDY >> 12,
13 => INITIAL_SUBSIDY >> 13,
14 => INITIAL_SUBSIDY >> 14,
15 => INITIAL_SUBSIDY >> 15,
16 => INITIAL_SUBSIDY >> 16,
17 => INITIAL_SUBSIDY >> 17,
18 => INITIAL_SUBSIDY >> 18,
19 => INITIAL_SUBSIDY >> 19,
20 => INITIAL_SUBSIDY >> 20,
21 => INITIAL_SUBSIDY >> 21,
22 => INITIAL_SUBSIDY >> 22,
23 => INITIAL_SUBSIDY >> 23,
24 => INITIAL_SUBSIDY >> 24,
25 => INITIAL_SUBSIDY >> 25,
26 => INITIAL_SUBSIDY >> 26,
27 => INITIAL_SUBSIDY >> 27,
28 => INITIAL_SUBSIDY >> 28,
29 => INITIAL_SUBSIDY >> 29,
30 => INITIAL_SUBSIDY >> 30,
31 => INITIAL_SUBSIDY >> 31,
32 => INITIAL_SUBSIDY >> 32,
33 => INITIAL_SUBSIDY >> 33,
34 => INITIAL_SUBSIDY >> 34,
35 => INITIAL_SUBSIDY >> 35,
36 => INITIAL_SUBSIDY >> 36,
37 => INITIAL_SUBSIDY >> 37,
38 => INITIAL_SUBSIDY >> 38,
39 => INITIAL_SUBSIDY >> 39,
40 => INITIAL_SUBSIDY >> 40,
41 => INITIAL_SUBSIDY >> 41,
42 => INITIAL_SUBSIDY >> 42,
43 => INITIAL_SUBSIDY >> 43,
44 => INITIAL_SUBSIDY >> 44,
45 => INITIAL_SUBSIDY >> 45,
46 => INITIAL_SUBSIDY >> 46,
47 => INITIAL_SUBSIDY >> 47,
48 => INITIAL_SUBSIDY >> 48,
49 => INITIAL_SUBSIDY >> 49,
50 => INITIAL_SUBSIDY >> 50,
51 => INITIAL_SUBSIDY >> 51,
52 => INITIAL_SUBSIDY >> 52,
53 => INITIAL_SUBSIDY >> 53,
54 => INITIAL_SUBSIDY >> 54,
55 => INITIAL_SUBSIDY >> 55,
56 => INITIAL_SUBSIDY >> 56,
57 => INITIAL_SUBSIDY >> 57,
58 => INITIAL_SUBSIDY >> 58,
59 => INITIAL_SUBSIDY >> 59,
60 => INITIAL_SUBSIDY >> 60,
61 => INITIAL_SUBSIDY >> 61,
62 => INITIAL_SUBSIDY >> 62,
63 => INITIAL_SUBSIDY >> 63,
_ => 0,
}
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.1", "F_SubsidyFloorHalf"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_subsidy_floor_half() -> i64 {
let prev = INITIAL_SUBSIDY >> 9;
let next = INITIAL_SUBSIDY >> 10;
next - prev / 2
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.2", "F_TotalSupplyNonNeg"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height < HALVING_INTERVAL))]
pub(crate) fn _verify_f_total_supply_non_neg(height: u64) -> i64 {
(height as i64 + 1) * INITIAL_SUBSIDY
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.2", "F_TotalSupplyMonoStep"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(supply >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(subsidy >= 0))]
pub(crate) fn _verify_f_total_supply_mono_step(supply: i64, subsidy: i64) -> i64 {
supply + subsidy
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.2", "F_TotalSupplyBound"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height < HALVING_INTERVAL))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result <= MAX_MONEY))]
pub(crate) fn _verify_f_total_supply_bound(height: u64) -> i64 {
(height as i64 + 1) * INITIAL_SUBSIDY
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.2", "F_TotalSupplyExact"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 2099999997690000))]
#[allow(clippy::identity_op)]
pub(crate) fn _verify_f_total_supply_exact() -> i64 {
(HALVING_INTERVAL as i64)
* ((INITIAL_SUBSIDY >> 0)
+ (INITIAL_SUBSIDY >> 1)
+ (INITIAL_SUBSIDY >> 2)
+ (INITIAL_SUBSIDY >> 3)
+ (INITIAL_SUBSIDY >> 4)
+ (INITIAL_SUBSIDY >> 5)
+ (INITIAL_SUBSIDY >> 6)
+ (INITIAL_SUBSIDY >> 7)
+ (INITIAL_SUBSIDY >> 8)
+ (INITIAL_SUBSIDY >> 9)
+ (INITIAL_SUBSIDY >> 10)
+ (INITIAL_SUBSIDY >> 11)
+ (INITIAL_SUBSIDY >> 12)
+ (INITIAL_SUBSIDY >> 13)
+ (INITIAL_SUBSIDY >> 14)
+ (INITIAL_SUBSIDY >> 15)
+ (INITIAL_SUBSIDY >> 16)
+ (INITIAL_SUBSIDY >> 17)
+ (INITIAL_SUBSIDY >> 18)
+ (INITIAL_SUBSIDY >> 19)
+ (INITIAL_SUBSIDY >> 20)
+ (INITIAL_SUBSIDY >> 21)
+ (INITIAL_SUBSIDY >> 22)
+ (INITIAL_SUBSIDY >> 23)
+ (INITIAL_SUBSIDY >> 24)
+ (INITIAL_SUBSIDY >> 25)
+ (INITIAL_SUBSIDY >> 26)
+ (INITIAL_SUBSIDY >> 27)
+ (INITIAL_SUBSIDY >> 28)
+ (INITIAL_SUBSIDY >> 29)
+ (INITIAL_SUBSIDY >> 30)
+ (INITIAL_SUBSIDY >> 31)
+ (INITIAL_SUBSIDY >> 32))
}
#[cfg_attr(feature = "spec-lock", spec_locked("6.2", "F_IssuedSupplyBelowCap"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result <= MAX_MONEY))]
#[allow(clippy::identity_op)]
pub(crate) fn _verify_f_issued_supply_below_cap() -> i64 {
(HALVING_INTERVAL as i64)
* ((INITIAL_SUBSIDY >> 0)
+ (INITIAL_SUBSIDY >> 1)
+ (INITIAL_SUBSIDY >> 2)
+ (INITIAL_SUBSIDY >> 3)
+ (INITIAL_SUBSIDY >> 4)
+ (INITIAL_SUBSIDY >> 5)
+ (INITIAL_SUBSIDY >> 6)
+ (INITIAL_SUBSIDY >> 7)
+ (INITIAL_SUBSIDY >> 8)
+ (INITIAL_SUBSIDY >> 9)
+ (INITIAL_SUBSIDY >> 10)
+ (INITIAL_SUBSIDY >> 11)
+ (INITIAL_SUBSIDY >> 12)
+ (INITIAL_SUBSIDY >> 13)
+ (INITIAL_SUBSIDY >> 14)
+ (INITIAL_SUBSIDY >> 15)
+ (INITIAL_SUBSIDY >> 16)
+ (INITIAL_SUBSIDY >> 17)
+ (INITIAL_SUBSIDY >> 18)
+ (INITIAL_SUBSIDY >> 19)
+ (INITIAL_SUBSIDY >> 20)
+ (INITIAL_SUBSIDY >> 21)
+ (INITIAL_SUBSIDY >> 22)
+ (INITIAL_SUBSIDY >> 23)
+ (INITIAL_SUBSIDY >> 24)
+ (INITIAL_SUBSIDY >> 25)
+ (INITIAL_SUBSIDY >> 26)
+ (INITIAL_SUBSIDY >> 27)
+ (INITIAL_SUBSIDY >> 28)
+ (INITIAL_SUBSIDY >> 29)
+ (INITIAL_SUBSIDY >> 30)
+ (INITIAL_SUBSIDY >> 31)
+ (INITIAL_SUBSIDY >> 32))
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_SequenceLockTimeMask"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result <= 65535))]
pub(crate) fn _verify_f_sequence_locktime_mask(seq: u64) -> u64 {
seq & 0x0000_ffff
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_EvalSeqLocksDisabled"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_height == -1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_time == -1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_eval_seq_locks_disabled(
height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || height > min_height) && (min_time < 0 || time > min_time)
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_MtpIndex"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t0 <= t1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == t1))]
#[allow(clippy::eq_op)]
pub(crate) fn _verify_f_mtp_index(t0: i64, t1: i64) -> i64 {
let mid_index = 2 / 2;
if mid_index == 1 {
t1
} else {
(t0 + t1) / 2 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_MtpIndexN4"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t0 <= t1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t1 <= t2))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t2 <= t3))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == t2))]
#[allow(unused_variables)]
pub(crate) fn _verify_f_mtp_index_n4(t0: i64, t1: i64, t2: i64, t3: i64) -> i64 {
let mid_index = 4 / 2;
if mid_index == 2 {
t2
} else {
(t1 + t2) / 2 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_MtpIndexN11"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t0 <= t1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t1 <= t2))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t2 <= t3))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t3 <= t4))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t4 <= t5))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t5 <= t6))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t6 <= t7))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t7 <= t8))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t8 <= t9))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(t9 <= t10))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == t5))]
#[allow(unused_variables)]
pub(crate) fn _verify_f_mtp_index_n11(
t0: i64,
t1: i64,
t2: i64,
t3: i64,
t4: i64,
t5: i64,
t6: i64,
t7: i64,
t8: i64,
t9: i64,
t10: i64,
) -> i64 {
let mid_index = 11 / 2;
if mid_index == 5 { t5 } else { t0 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.5", "F_LocktimeTypeIsHeight"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(lt >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(lt < 500000000))]
pub(crate) fn _verify_f_locktime_type_is_height(lt: i64) -> i64 {
500_000_000 - lt
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("13.3.5", "F_LocktimeTypeIsTimestamp")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(lt >= 500000000))]
pub(crate) fn _verify_f_locktime_type_is_timestamp(lt: i64) -> i64 {
lt - 500_000_000
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.5", "F_EvalSeqLocksHeightNotMet")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_height >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(block_height <= min_height))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_eval_seq_locks_height_not_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_SequenceTimeEncoding"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(value >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(value <= 65535))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result <= 33553920))]
pub(crate) fn _verify_f_sequence_time_encoding(value: i64) -> i64 {
value * 512
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_SequenceLockHeightAdd"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(ph >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(lock >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(lock <= 65535))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(ph <= 2147483647))]
pub(crate) fn _verify_f_sequence_lock_height_add(ph: i64, lock: i64) -> i64 {
ph + lock - 1
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.7", "F_BIP65PassesZeroZero"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack_locktime == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_bip65_passes_zero_zero(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
(tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.7", "F_BIP65RejectsTypeMismatch")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime < LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack_locktime >= LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_bip65_rejects_type_mismatch(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
(tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.7", "F_BIP65RejectsTypeMismatchReverse")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime >= LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack_locktime < LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_bip65_rejects_type_mismatch_reverse(
tx_locktime: u32,
stack_locktime: u32,
) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
(tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.7", "F_BIP65RejectsValueTooLow")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime > 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime < LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack_locktime < LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime < stack_locktime))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_bip65_rejects_value_too_low(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
(tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.7", "F_BIP65RejectsTimestampValueTooLow")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime >= LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack_locktime >= LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime < stack_locktime))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime > 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_bip65_rejects_timestamp_value_too_low(
tx_locktime: u32,
stack_locktime: u32,
) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
(tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.7", "F_BIP65Passes"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime > 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime < LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack_locktime < LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime >= stack_locktime))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_bip65_passes(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
(tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.7", "F_BIP65PassesTimestamp"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime >= LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(stack_locktime >= LOCKTIME_THRESHOLD))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime >= stack_locktime))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(tx_locktime > 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_bip65_passes_timestamp(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
(tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_EvalSeqLocksHeightMet"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_height >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(block_height > min_height))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_time < 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_eval_seq_locks_height_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_EvalSeqLocksTimeNotMet"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_time >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(time <= min_time))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_eval_seq_locks_time_not_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_EvalSeqLocksTimeMet"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_time >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(time > min_time))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_height < 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_eval_seq_locks_time_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_EvalSeqLocksBothMet"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_height >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(block_height > min_height))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(min_time >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(time > min_time))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_eval_seq_locks_both_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.3.1", "F_HeaderVersionFloor"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(block_version == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(bip34_active == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 1))]
pub(crate) fn _verify_f_header_version_floor(block_version: i64, bip34_active: i64) -> i64 {
if bip34_active != 0 && block_version < 2 {
0
} else {
1
}
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.3.1", "F_HeaderBitsFloor"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(bits == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_header_bits_floor(bits: i64) -> i64 {
if bits != 0 { 1 } else { 0 }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.3.1", "F_HeaderTimestampAfterMtp")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(timestamp >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(mtp >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((timestamp > mtp) == result))]
pub(crate) fn _verify_f_header_timestamp_after_mtp(timestamp: i64, mtp: i64) -> bool {
timestamp > mtp
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.1", "F_BIP30DuplicateRejected")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(duplicate == 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(exception == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_bip30_duplicate_rejected(duplicate: i64, exception: i64) -> i64 {
if duplicate == 1 && exception == 0 {
0
} else {
1
}
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.2", "F_BIP34PreActivationPass")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(bip34_active == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 1))]
pub(crate) fn _verify_f_bip34_pre_activation_pass(bip34_active: i64) -> i64 {
if bip34_active == 0 { 1 } else { 0 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.8", "F_CSFSZeroPubkeyInvalid"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(pk_len == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_csfs_zero_pubkey_invalid(pk_len: u64) -> bool {
pk_len != 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.8", "F_CSFSUnknownPubkeyValid")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(pk_len > 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(pk_len != 32))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_csfs_unknown_pubkey_valid(pk_len: u64) -> bool {
pk_len != 32
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.8", "F_CSFSEmptySigValid"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(sig_len == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(pk_len > 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_csfs_empty_sig_valid(sig_len: u64, pk_len: u64) -> bool {
if pk_len == 0 {
false } else if sig_len == 0 {
true } else {
false }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.3", "F_BIP66ActivationBelow"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(bip66_active == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 1))]
pub(crate) fn _verify_f_bip66_pre_activation_pass(bip66_active: i64) -> i64 {
if bip66_active == 0 { 1 } else { 0 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.3", "F_BIP66ActivationAt"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height >= 363725))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == strict_der))]
pub(crate) fn _verify_f_bip66_activation_at(height: i64, strict_der: i64) -> i64 {
if height < 363725 { 1 } else { strict_der }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.3", "F_StrictDERSoundness"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len_ok == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_strict_der_soundness(
len_ok: i64,
tag_ok: i64,
high_ok: i64,
lead_ok: i64,
) -> i64 {
if len_ok == 0 || tag_ok == 0 || high_ok == 0 || lead_ok == 0 {
0
} else {
1
}
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.1", "F_NoDuplicateInputs"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(same_prevout != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_no_duplicate_inputs(same_prevout: i64) -> i64 {
if same_prevout != 0 { 0 } else { 1 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("13.3.1", "F_OutputSumBounded"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(overflow != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_output_sum_bounded(value: i64, overflow: i64) -> i64 {
if overflow != 0 || !(0..=2_100_000_000_000_000).contains(&value) {
0
} else {
1
}
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("8.4.1", "F_MerkleMutationRejected")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(unpadded_equal != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_merkle_mutation_rejected(unpadded_equal: i64) -> i64 {
if unpadded_equal != 0 { 0 } else { 1 }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.4", "F_BIP90PreActivationPass")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(bip90_active == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 1))]
pub(crate) fn _verify_f_bip90_pre_activation_pass(bip90_active: i64) -> i64 {
if bip90_active == 0 { 1 } else { 0 }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.5", "F_BIP147PreActivationPass")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(bip147_active == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 1))]
pub(crate) fn _verify_f_bip147_pre_activation_pass(bip147_active: i64) -> i64 {
if bip147_active == 0 { 1 } else { 0 }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.9", "F_BIP54ActivationThreshold")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height >= threshold))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_bip54_activation_threshold(height: u64, threshold: u64) -> bool {
height >= threshold
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.5", "F_SequenceDisabledWhenBit31Set")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires((sequence & 0x80000000) != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_sequence_disabled_when_bit31_set(sequence: u32) -> bool {
(sequence & 0x80000000) != 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.5", "F_SequenceEnabledWhenBit31Clear")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires((sequence & 0x80000000) == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_sequence_enabled_when_bit31_clear(sequence: u32) -> bool {
(sequence & 0x80000000) != 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.5", "F_SequenceTypeTimeWhenBit22Set")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires((sequence & 0x00400000) != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_sequence_type_time_when_bit22_set(sequence: u32) -> bool {
(sequence & 0x00400000) != 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.5", "F_SequenceTypeHeightWhenBit22Clear")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires((sequence & 0x00400000) == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_sequence_type_height_when_bit22_clear(sequence: u32) -> bool {
(sequence & 0x00400000) != 0
}
#[cfg_attr(feature = "spec-lock", spec_locked("11.1.1", "F_WeightToVSizeFloor"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result >= weight / 4))]
pub(crate) fn _verify_f_weight_to_vsize_floor(weight: u64) -> u64 {
weight.div_ceil(4)
}
#[cfg_attr(feature = "spec-lock", spec_locked("11.1.1", "F_WeightToVSizeCeiling"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result <= weight / 4 + 1))]
pub(crate) fn _verify_f_weight_to_vsize_ceiling(weight: u64) -> u64 {
weight.div_ceil(4)
}
#[cfg_attr(feature = "spec-lock", spec_locked("11.1.1", "F_WeightEquiv"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(total == base + wit))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 4 * base + wit))]
pub(crate) fn _verify_f_weight_equiv(base: i64, wit: i64, total: i64) -> i64 {
3 * base + total
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.1", "F_StrippedSizeCountsScripts")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(script_sig >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(script_pubkey >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result >= script_sig + script_pubkey))]
pub(crate) fn _verify_f_stripped_size_counts_scripts(script_sig: i64, script_pubkey: i64) -> i64 {
script_sig + script_pubkey
}
#[cfg_attr(feature = "spec-lock", spec_locked("11.1.2", "F_WitnessEmptyByLength"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_witness_empty_by_length(len: u64) -> bool {
len == 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.3", "F_WitnessProgramLength20Valid")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(program_len == 20))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_witness_program_length_20_valid(program_len: u64) -> bool {
program_len == 20 || program_len == 32
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.3", "F_WitnessProgramLength32Valid")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(program_len == 32))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_witness_program_length_32_valid(program_len: u64) -> bool {
program_len == 20 || program_len == 32
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.3", "F_WitnessProgramLengthInvalid")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(program_len != 20))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(program_len != 32))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_witness_program_length_invalid(program_len: u64) -> bool {
program_len == 20 || program_len == 32
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.3", "F_WitnessVersionRejected")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(op == 79 || op == 80))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
#[allow(clippy::manual_range_contains)]
pub(crate) fn _verify_f_witness_version_rejected(op: i64) -> bool {
op == 0 || (op >= 81 && op <= 96)
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.3", "F_WitnessVersionAccepted")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(op == 0 || op == 81 || op == 96))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
#[allow(clippy::manual_range_contains)]
pub(crate) fn _verify_f_witness_version_accepted(op: i64) -> bool {
op == 0 || (op >= 81 && op <= 96)
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.2.4", "F_MinimalIfEmptyTrue"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_minimal_if_empty_true(len: u64) -> bool {
len == 0
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.2.4", "F_MinimalIfLongFalse"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len > 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_minimal_if_long_false(len: u64) -> bool {
len == 0 || len == 1
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.2.1", "F_TaprootOutputScriptLengthInvalid")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(script_len != 34))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_taproot_output_script_length_invalid(script_len: u64) -> bool {
script_len == 34
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.9", "F_Bip54SignalBit"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 15))]
pub(crate) fn _verify_f_bip54_signal_bit() -> u64 {
15
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.9", "F_Bip54StartTimeZero"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_bip54_start_time_zero() -> u64 {
0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.2", "F_TaprootActivationMainnet")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(network == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == TAPROOT_ACTIVATION_MAINNET))]
pub(crate) fn _verify_f_taproot_activation_mainnet(network: u64) -> u64 {
if network == 0 {
TAPROOT_ACTIVATION_MAINNET
} else if network == 1 {
TAPROOT_ACTIVATION_TESTNET
} else {
0
}
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.2", "F_TaprootActivationTestnet")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(network == 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == TAPROOT_ACTIVATION_TESTNET))]
pub(crate) fn _verify_f_taproot_activation_testnet(network: u64) -> u64 {
if network == 0 {
TAPROOT_ACTIVATION_MAINNET
} else if network == 1 {
TAPROOT_ACTIVATION_TESTNET
} else {
0
}
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.2", "F_TaprootActivationRegtest")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(network != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(network != 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_taproot_activation_regtest(network: u64) -> u64 {
if network == 0 {
TAPROOT_ACTIVATION_MAINNET
} else if network == 1 {
TAPROOT_ACTIVATION_TESTNET
} else {
0
}
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.7", "F_DecodeLocktimeNegativeZero")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(byte == 128))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_decode_locktime_negative_zero(byte: i64) -> i64 {
if byte >= 128 { -(byte - 128) } else { byte }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.7", "F_DecodeLocktimeNegativeOne")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(byte == 129))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == -1))]
pub(crate) fn _verify_f_decode_locktime_negative_one(byte: i64) -> i64 {
if byte >= 128 { -(byte - 128) } else { byte }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.7", "F_CltvRejectsNegative"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(n < 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_cltv_rejects_negative(n: i64) -> bool {
n >= 0
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.7", "F_CltvRejectsAboveU32"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(n > 4294967295))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
#[allow(clippy::manual_range_contains)]
pub(crate) fn _verify_f_cltv_rejects_above_u32(n: i64) -> bool {
n >= 0 && n <= 4294967295
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.2.2", "F_SigopCountPushOpcode"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(op >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(op <= 255))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((op <= 96) == result))]
pub(crate) fn _verify_f_sigop_count_push_opcode(op: i64) -> bool {
op <= 96
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.5", "F_CsvVersionBelowTwoFails"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(version < 2))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(disable_bit == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_csv_version_below_two_fails(version: i64, disable_bit: i64) -> bool {
disable_bit != 0 || version >= 2
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.5", "F_RelativeLockUnsignedVersion")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(version >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(version <= 4294967295))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == (version >= 2)))]
pub(crate) fn _verify_f_relative_lock_unsigned_version(version: i64) -> bool {
version >= 2
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.5", "F_CsvDisableBitSkipsVersion")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(disable_bit != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(version < 2))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_csv_disable_bit_skips_version(version: i64, disable_bit: i64) -> bool {
disable_bit != 0 || version >= 2
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.2.6", "F_TaprootSighashSingleMissingOutput")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(output_type == 3))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(n_outputs >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(input_index >= n_outputs))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_taproot_sighash_single_missing_output(
output_type: i64,
input_index: i64,
n_outputs: i64,
) -> bool {
output_type != 3 || input_index < n_outputs
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.2.7", "F_TapscriptSighashSingleMissingOutput")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(output_type == 3))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(n_outputs >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(input_index >= n_outputs))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_tapscript_sighash_single_missing_output(
output_type: i64,
input_index: i64,
n_outputs: i64,
) -> bool {
output_type != 3 || input_index < n_outputs
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.1", "F_InputSumWithinMaxMoney"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(sum > 2_100_000_000_000_000))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_input_sum_within_max_money(sum: i64) -> i64 {
if sum > 2_100_000_000_000_000 { 0 } else { 1 }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.2.8", "F_TapscriptTruncatedPushNotSuccess")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(header_fits == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_tapscript_truncated_push_not_success(header_fits: i64) -> bool {
header_fits != 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.2", "F_CheckMultisigCountsPubkeys")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(n_keys >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(n_keys <= 20))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(op_count + n_keys > 201))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
#[allow(clippy::manual_range_contains)]
pub(crate) fn _verify_f_checkmultisig_counts_pubkeys(op_count: i64, n_keys: i64) -> i64 {
if n_keys >= 0 && n_keys <= 20 && op_count + n_keys > 201 {
0
} else {
1
}
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.2", "F_FalseResultEmpty"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(is_true == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_false_result_empty(is_true: i64) -> i64 {
if is_true == 0 { 0 } else { 1 }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.1", "F_Bip30RepeatRetiresPriorOutputs")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(exception == 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_bip30_repeat_retires_prior_outputs(exception: i64) -> i64 {
if exception == 1 { 0 } else { 1 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.3", "F_NonDerAbortsScript"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(sig_len > 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(strict_der == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_non_der_aborts_script(sig_len: i64, strict_der: i64) -> i64 {
if sig_len > 0 && strict_der == 0 { 0 } else { 1 }
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.8", "F_NestedRedeemPushCanonical")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(canonical == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_nested_redeem_push_canonical(canonical: i64) -> bool {
canonical != 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.8", "F_P2shUnknownWitnessSucceeds")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(discourage == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(canonical == 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_p2sh_unknown_witness_succeeds(discourage: i64, canonical: i64) -> bool {
discourage == 0 && canonical == 1
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("7.2", "F_ProofNegativeCompactRejected")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(negative == 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == false))]
pub(crate) fn _verify_f_proof_negative_compact_rejected(negative: i64) -> bool {
negative == 0
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.2", "F_ProofEqualHashAccepted"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(hash_above == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(negative == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(target_zero == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_proof_equal_hash_accepted(
hash_above: i64,
negative: i64,
target_zero: i64,
) -> bool {
hash_above == 0 && negative == 0 && target_zero == 0
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("5.4.2", "F_BIP34SmallHeightOpcode")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height >= 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height <= 16))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == (80 + height)))]
pub(crate) fn _verify_f_bip34_small_height_opcode(height: i64) -> i64 {
80 + height
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.2", "F_BIP34HeightZero"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_bip34_height_zero(height: i64) -> i64 {
if height == 0 { 0 } else { 80 + height }
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.2", "F_BIP34HeightSeventeen"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height == 17))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 1))]
pub(crate) fn _verify_f_bip34_height_seventeen(height: i64) -> i64 {
#[allow(clippy::manual_range_contains)]
if height >= 1 && height <= 16 {
80 + height
} else {
1
}
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.6", "F_CtvTestnet4Inactive"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((height >= 0) == result))]
pub(crate) fn _verify_f_ctv_testnet4_inactive(height: i64) -> bool {
height >= 0
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.8", "F_CsfsTestnet4Inactive"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((height >= 0) == result))]
pub(crate) fn _verify_f_csfs_testnet4_inactive(height: i64) -> bool {
height >= 0
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.9", "F_Bip54CoinbaseLocktime"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height >= 1))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == (height - 1)))]
pub(crate) fn _verify_f_bip54_coinbase_locktime(height: i64) -> i64 {
height - 1
}
#[cfg_attr(feature = "spec-lock", spec_locked("5.4.9", "F_Bip54CoinbaseSequence"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((sequence != 4294967295) == result))]
pub(crate) fn _verify_f_bip54_coinbase_sequence(sequence: i64) -> bool {
sequence != 4294967295
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_Bip94BitsFromFirst"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(enforce != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == first_bits))]
pub(crate) fn _verify_f_bip94_bits_from_first(
enforce: i64,
first_bits: i64,
last_bits: i64,
) -> i64 {
if enforce != 0 { first_bits } else { last_bits }
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_Bip94BitsFromLast"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(enforce == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == last_bits))]
pub(crate) fn _verify_f_bip94_bits_from_last(enforce: i64, first_bits: i64, last_bits: i64) -> i64 {
if enforce != 0 { first_bits } else { last_bits }
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_Bip94Timewarp"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(parent_time >= 600))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(timestamp >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((timestamp + 600 >= parent_time) == result))]
pub(crate) fn _verify_f_bip94_timewarp(timestamp: i64, parent_time: i64) -> bool {
timestamp + 600 >= parent_time
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("7.1", "F_Bip94TimewarpOffBoundary")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(height % 2016 != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(parent_time >= 600))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(timestamp >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == true))]
pub(crate) fn _verify_f_bip94_timewarp_off_boundary(
height: i64,
timestamp: i64,
parent_time: i64,
) -> bool {
if height % 2016 == 0 {
timestamp + 600 >= parent_time
} else {
true
}
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_OffBoundaryParentBits"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(not_boundary != 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == parent_bits))]
pub(crate) fn _verify_f_off_boundary_parent_bits(not_boundary: i64, parent_bits: i64) -> i64 {
if not_boundary != 0 { parent_bits } else { 0 }
}
#[cfg_attr(feature = "spec-lock", spec_locked("7.1", "F_HeaderBitsMatchRequired"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((header_bits == required_bits) == result))]
pub(crate) fn _verify_f_header_bits_match_required(header_bits: i64, required_bits: i64) -> bool {
header_bits == required_bits
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.2", "F_WitnessStackNullByLength")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len >= 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures((len == 0) == result))]
pub(crate) fn _verify_f_witness_stack_null_by_length(len: i64) -> bool {
len == 0
}
#[cfg_attr(feature = "spec-lock", spec_locked("11.1.3", "F_WitnessPayloadByte"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == (byte * (byte - 128) != 0)))]
pub(crate) fn _verify_f_witness_payload_byte(byte: i64) -> bool {
byte != 0 && byte != 128
}
#[cfg_attr(feature = "spec-lock", spec_locked("11.1.3", "F_WitnessPayloadEmpty"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::requires(len == 0))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(result == 0))]
pub(crate) fn _verify_f_witness_payload_empty(len: i64) -> i64 {
if len == 0 { 0 } else { 1 }
}
#[allow(dead_code)]
pub(crate) fn implied_hash(root: i64, nonce: i64) -> i64 {
let _ = (root, nonce);
0
}
#[cfg_attr(feature = "spec-lock", spec_locked("11.1.3", "F_CastToBoolSummary"))]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(
result == (len >= 1 && (prefix_nonzero != 0 || (last != 0 && last != 128)))
))]
pub(crate) fn _verify_f_cast_to_bool_summary(len: i64, prefix_nonzero: i64, last: i64) -> bool {
len >= 1 && (prefix_nonzero != 0 || (last != 0 && last != 128))
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.3", "F_UpgradableProgramShape")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(
result
== (script_sig_len == 0
&& witness_flag != 0
&& discourage == 0
&& len >= 1
&& (prefix_nonzero != 0 || (last != 0 && last != 128)))
))]
pub(crate) fn _verify_f_upgradable_program_shape(
script_sig_len: i64,
witness_flag: i64,
discourage: i64,
len: i64,
prefix_nonzero: i64,
last: i64,
) -> bool {
script_sig_len == 0
&& witness_flag != 0
&& discourage == 0
&& len >= 1
&& (prefix_nonzero != 0 || (last != 0 && last != 128))
}
#[cfg_attr(
feature = "spec-lock",
spec_locked("11.1.5", "F_WitnessCommitmentShape")
)]
#[cfg_attr(feature = "spec-lock", blvm_spec_lock::ensures(
result
== ((has_commitment == 0 && any_witness == 0)
|| (has_commitment != 0
&& reserved_len == 32
&& stored == implied_hash(root, nonce)))
))]
pub(crate) fn _verify_f_witness_commitment_shape(
has_commitment: i64,
any_witness: i64,
reserved_len: i64,
stored: i64,
root: i64,
nonce: i64,
) -> bool {
if has_commitment == 0 {
any_witness == 0
} else {
reserved_len == 32 && stored == implied_hash(root, nonce)
}
}