diff --git a/Cargo.toml b/Cargo.toml
index bd63057c..7f396cdf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,9 +14,9 @@ name = "simplicity"
path = "src/lib.rs"
[dependencies]
-bitcoin = { version = "0.28", optional = true }
-bitcoin_hashes = "0.10"
+bitcoin = { version = "0.29.2", optional = true }
+bitcoin_hashes = "0.11"
byteorder = "1.3"
-elements = { version = "0.19", optional = true }
-miniscript = "7.0"
+elements = { version = "0.21.1", optional = true }
+miniscript = "9.0.0"
simplicity_sys = { version = "0.1.0", path = "./simplicity-sys" }
diff --git a/src/jet/bitcoin/environment.rs b/src/jet/bitcoin/environment.rs
index 37958f68..f5dac9f7 100644
--- a/src/jet/bitcoin/environment.rs
+++ b/src/jet/bitcoin/environment.rs
@@ -12,6 +12,8 @@
// If not, see .
//
+use bitcoin::PackedLockTime;
+
/// Environment for Bitcoin Simplicity
pub struct BitcoinEnv {
pub tx: bitcoin::Transaction,
@@ -28,7 +30,7 @@ impl Default for BitcoinEnv {
// FIXME: Review and check if the defaults make sense
BitcoinEnv::new(bitcoin::Transaction {
version: 2,
- lock_time: 0,
+ lock_time: PackedLockTime::ZERO,
input: vec![],
output: vec![],
})
diff --git a/src/jet/bitcoin/exec.rs b/src/jet/bitcoin/exec.rs
index 24447fcb..96fa60d8 100644
--- a/src/jet/bitcoin/exec.rs
+++ b/src/jet/bitcoin/exec.rs
@@ -11,7 +11,7 @@ pub(crate) fn version(mac: &mut BitMachine, env: &BitcoinEnv) -> Result<(), JetF
}
pub(crate) fn lock_time(mac: &mut BitMachine, env: &BitcoinEnv) -> Result<(), JetFailed> {
- mac.write_u32(env.tx.lock_time);
+ mac.write_u32(env.tx.lock_time.0);
Ok(())
}
@@ -22,7 +22,7 @@ pub(crate) fn inputs_hash(mac: &mut BitMachine, env: &BitcoinEnv) -> Result<(),
eng.write_u32::(input.previous_output.vout)
.unwrap();
eng.write_u64::(99_998_000).unwrap(); // value FIXME
- eng.write_u32::(input.sequence).unwrap();
+ eng.write_u32::(input.sequence.0).unwrap();
}
mac.write_bytes(&sha256::Hash::from_engine(eng)[..]);
Ok(())
diff --git a/src/jet/elements/c_env.rs b/src/jet/elements/c_env.rs
index e0c19da7..4b45f63c 100644
--- a/src/jet/elements/c_env.rs
+++ b/src/jet/elements/c_env.rs
@@ -43,24 +43,43 @@ fn new_raw_input(
) -> CRawInput {
unsafe {
let mut raw_input = std::mem::MaybeUninit::::uninit();
+
+ let (issue_nonce_ptr, issue_entropy_ptr, issue_amt_ptr, issue_infl_key_ptr) =
+ if inp.has_issuance() {
+ (
+ inp.asset_issuance.asset_blinding_nonce.as_ptr(),
+ inp.asset_issuance.asset_entropy.as_ptr(),
+ value_ptr(inp.asset_issuance.amount, &inp_data.issuance_amount),
+ value_ptr(
+ inp.asset_issuance.inflation_keys,
+ &inp_data.issuance_inflation_keys,
+ ),
+ )
+ } else {
+ (
+ std::ptr::null(),
+ std::ptr::null(),
+ std::ptr::null(),
+ std::ptr::null(),
+ )
+ };
c_set_rawInput(
raw_input.as_mut_ptr(),
- opt_ptr(annex_ptr(&inp_data.annex).as_ref()), // FIXME: ACTUALLY STORE ANNEX
- std::ptr::null(), // FIXME: ACTUALLY STORE PEGIN
+ opt_ptr(annex_ptr(&inp_data.annex).as_ref()),
+ inp.pegin_data()
+ .map(|x| x.genesis_hash.as_ptr())
+ .unwrap_or(std::ptr::null()),
&script_ptr(&inp.script_sig),
inp.previous_output.txid.as_ptr(),
inp.previous_output.vout as c_uint,
asset_ptr(in_utxo.asset, &inp_data.asset),
value_ptr(in_utxo.value, &inp_data.value),
&script_ptr(&in_utxo.script_pubkey),
- inp.sequence as c_uint,
- inp.asset_issuance.asset_blinding_nonce.as_ptr(), // FIXME: CHECK ASSET ISSUANCE IS NOT NULL. EASIER WITH NEW ELEMENTS VERSION.
- inp.asset_issuance.asset_entropy.as_ptr(),
- value_ptr(inp.asset_issuance.amount, &inp_data.issuance_amount),
- value_ptr(
- inp.asset_issuance.inflation_keys,
- &inp_data.issuance_inflation_keys,
- ),
+ inp.sequence.0 as c_uint,
+ issue_nonce_ptr, // FIXME: CHECK ASSET ISSUANCE IS NOT NULL. EASIER WITH NEW ELEMENTS VERSION.
+ issue_entropy_ptr,
+ issue_amt_ptr,
+ issue_infl_key_ptr,
&range_proof_ptr(&inp_data.amount_range_proof),
&range_proof_ptr(&inp_data.inflation_keys_range_proof),
);
@@ -125,7 +144,7 @@ pub(super) fn new_tx(tx: &elements::Transaction, in_utxos: &[ElementsUtxo]) -> *
raw_inputs.len() as c_uint,
raw_outputs.as_ptr(),
raw_outputs.len() as c_uint,
- tx.lock_time as c_uint,
+ tx.lock_time.0 as c_uint,
);
let raw_tx = raw_tx.assume_init();
elements_simplicity_mallocTransaction(&raw_tx)
diff --git a/src/jet/elements/environment.rs b/src/jet/elements/environment.rs
index bb47fc54..c1e94646 100644
--- a/src/jet/elements/environment.rs
+++ b/src/jet/elements/environment.rs
@@ -312,7 +312,7 @@ impl SimplicityHash for elements::TxIn {
eng.input(&self.previous_output.txid);
eng.write_u32::(self.previous_output.vout)
.unwrap();
- eng.write_u32::(self.sequence).unwrap();
+ eng.write_u32::(self.sequence.0).unwrap();
if self.has_issuance() {
self.asset_issuance.simplicity_hash(eng);
} else {
diff --git a/src/jet/elements/exec.rs b/src/jet/elements/exec.rs
index 75b17039..8d3a6dff 100644
--- a/src/jet/elements/exec.rs
+++ b/src/jet/elements/exec.rs
@@ -27,7 +27,7 @@ pub(crate) fn version(mac: &mut BitMachine, env: &ElementsEnv) -> Result<(), Jet
}
pub(crate) fn lock_time(mac: &mut BitMachine, env: &ElementsEnv) -> Result<(), JetFailed> {
- mac.write_u32(env.tx.lock_time);
+ mac.write_u32(env.tx.lock_time.0);
Ok(())
}
@@ -118,7 +118,7 @@ pub(crate) fn input_sequence(mac: &mut BitMachine, env: &ElementsEnv) -> Result<
if is_valid_idx {
let seq = env.tx.input[idx].sequence;
- mac.write_u32(seq);
+ mac.write_u32(seq.0);
} else {
// 32 bits for sequence.
mac.skip(32);
@@ -347,7 +347,7 @@ pub(crate) fn current_script_hash(
pub(crate) fn current_sequence(mac: &mut BitMachine, env: &ElementsEnv) -> Result<(), JetFailed> {
let curr_idx = env.ix as usize;
let curr_inp = &env.tx.input[curr_idx];
- mac.write_u32(curr_inp.sequence);
+ mac.write_u32(curr_inp.sequence.0);
Ok(())
}
@@ -358,7 +358,7 @@ pub(crate) fn current_issuance_blinding(
let curr_idx = env.ix as usize;
let curr_inp = &env.tx.input[curr_idx];
- if curr_inp.has_issuance {
+ if curr_inp.has_issuance() {
blinding_issuance(mac, &curr_inp.asset_issuance);
Ok(())
} else {
@@ -373,7 +373,7 @@ pub(crate) fn current_issuance_contract(
let curr_idx = env.ix as usize;
let curr_inp = &env.tx.input[curr_idx];
- if curr_inp.has_issuance {
+ if curr_inp.has_issuance() {
contract_issuance(mac, &curr_inp.asset_issuance);
Ok(())
} else {
@@ -388,7 +388,7 @@ pub(crate) fn current_issuance_entropy(
let curr_idx = env.ix as usize;
let curr_inp = &env.tx.input[curr_idx];
- if curr_inp.has_issuance {
+ if curr_inp.has_issuance() {
entropy_issuance(mac, &curr_inp.asset_issuance);
Ok(())
} else {
@@ -412,7 +412,7 @@ pub(crate) fn current_issuance_token_amount(
let curr_idx = env.ix as usize;
let curr_inp = &env.tx.input[curr_idx];
- if curr_inp.has_issuance {
+ if curr_inp.has_issuance() {
inflation_amt_issuance(mac, &curr_inp.asset_issuance)
} else {
Err(JetFailed)
diff --git a/src/jet/elements/tests.rs b/src/jet/elements/tests.rs
index bbbfafa9..e96109d3 100644
--- a/src/jet/elements/tests.rs
+++ b/src/jet/elements/tests.rs
@@ -13,8 +13,8 @@ use bitcoin_hashes::Hash;
use elements::secp256k1_zkp::Tweak;
use elements::taproot::ControlBlock;
use elements::{
- confidential, AssetId, AssetIssuance, BlockHash, OutPoint, Transaction, TxIn, TxInWitness,
- TxOut, TxOutWitness,
+ confidential, AssetId, AssetIssuance, BlockHash, OutPoint, PackedLockTime, Sequence,
+ Transaction, TxIn, TxInWitness, TxOut, TxOutWitness,
};
#[test]
@@ -81,15 +81,14 @@ fn exec_sighash_all() {
let asset = confidential::Asset::Explicit(AssetId::from_inner(Midstate::from_inner(asset)));
let tx = Transaction {
version: 2,
- lock_time: 0,
+ lock_time: PackedLockTime::ZERO,
input: vec![TxIn {
previous_output: OutPoint {
txid: elements::Txid::from_inner(tx_id),
vout: 0,
},
- sequence: 0xfffffffe,
+ sequence: Sequence::ENABLE_LOCKTIME_NO_RBF,
is_pegin: false,
- has_issuance: false,
// perhaps make this an option in elements upstream?
asset_issuance: AssetIssuance {
asset_blinding_nonce: Tweak::from_inner([0; 32]).expect("tweak from inner"),
@@ -142,7 +141,7 @@ fn exec_sighash_all() {
script_cmr,
ctrl_block,
None,
- BlockHash::default(),
+ BlockHash::all_zeros(),
);
let mut bits: BitIter<_> = sighash_all::ELEMENTS_CHECK_SIGHASH_ALL
@@ -175,15 +174,14 @@ fn test_ffi_env() {
let asset = confidential::Asset::Explicit(AssetId::from_inner(Midstate::from_inner(asset)));
let tx = Transaction {
version: 2,
- lock_time: 100,
+ lock_time: PackedLockTime(100),
input: vec![TxIn {
previous_output: OutPoint {
txid: elements::Txid::from_inner(tx_id),
vout: 0,
},
- sequence: 0xfffffffe,
+ sequence: Sequence::ENABLE_LOCKTIME_NO_RBF,
is_pegin: false,
- has_issuance: false,
// perhaps make this an option in elements upstream?
asset_issuance: AssetIssuance {
asset_blinding_nonce: Tweak::from_inner([0; 32]).expect("tweak from inner"),
@@ -236,7 +234,7 @@ fn test_ffi_env() {
script_cmr,
ctrl_block,
None,
- BlockHash::default(),
+ BlockHash::all_zeros(),
);
let mut mac = BitMachine {