Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions checksums.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
a7762721ef239b15adbdddca8d772db6e1c001d9f81e23ccc74e1392329931d7 build/release/commitment-lock
ecf31c4c024d5f7339f56e19f0e7c2bdce6188b6c069752faefa5313f7ae534d build/release/commitment-lock.debug
cd44265503d53937865cae53a4e8e3ff8800aed667806d630c3f4cb4f65b9772 build/release/commitment-lock
1a962b0db2d899a7d9159305f3b505dc887a8c38a13a1db4bf054a79f6c22fc5 build/release/commitment-lock.debug
831f164aad1509db5483dd50c50bf4ed5cb6601f941600287ffdb5e79a29cf9e build/release/funding-lock
291bdd4a48783ce75012a6e21935090806014d33bf6c52b1b2374e8feeaa91f0 build/release/funding-lock.debug
5 changes: 5 additions & 0 deletions contracts/commitment-lock/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,11 @@ fn auth() -> Result<(), Error> {
}
}
None => {
// A CKB successor must not acquire a type script.
if load_cell_type(0, Source::Output)?.is_some() {
return Err(Error::OutputTypeError);
}

// verify the first output cell's capacity is correct
let output_capacity = load_cell_capacity(0, Source::Output)? as u128;
if output_capacity != new_amount {
Expand Down
39 changes: 38 additions & 1 deletion tests/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ fn test_commitment_lock_no_pending_htlcs() {
.build();
let auth_dep = CellDep::new_builder().out_point(auth_out_point).build();
let always_success_dep = CellDep::new_builder()
.out_point(always_success_out_point)
.out_point(always_success_out_point.clone())
.build();
let cell_deps = vec![commitment_lock_dep, auth_dep, always_success_dep].pack();

Expand Down Expand Up @@ -595,6 +595,43 @@ fn test_commitment_lock_no_pending_htlcs() {
.expect("pass verification");
println!("consume cycles: {}", cycles);

// A CKB successor must not gain an unexpected type script.
let unexpected_type = context
.build_script(&always_success_out_point, Bytes::new())
.expect("type script");
let typed_output = outputs[0]
.clone()
.as_builder()
.type_(Some(unexpected_type).pack())
.build();
let typed_tx = tx
.as_advanced_builder()
.set_outputs(vec![typed_output])
.build();
let typed_signature = local_settlement_key
.0
.sign_recoverable(&compute_tx_message(&typed_tx).into())
.unwrap()
.serialize();
let typed_witness = [
EMPTY_WITNESS_ARGS.to_vec(),
vec![0x01],
settlement_script.clone(),
vec![0xFF, 0x00],
typed_signature,
]
.concat();
let typed_tx = typed_tx
.as_advanced_builder()
.witness(typed_witness.pack())
.build();
assert_script_error_code(
&context,
&typed_tx,
20,
"CKB successor with unexpected type script",
);

// test with settlement unlock logic (remote settlement key)
let input_out_point = context.create_cell(outputs[0].clone(), Bytes::new());

Expand Down
Loading