diff --git a/testnet/stacks-node/src/mockamoto.rs b/testnet/stacks-node/src/mockamoto.rs index 9f11a872e..7b570b1e3 100644 --- a/testnet/stacks-node/src/mockamoto.rs +++ b/testnet/stacks-node/src/mockamoto.rs @@ -69,6 +69,7 @@ use stacks::net::atlas::{AtlasConfig, AtlasDB}; use stacks::net::relay::Relayer; use stacks::net::stackerdb::StackerDBs; use stacks::util_lib::db::Error as DBError; +use stacks::util_lib::signed_structured_data::{make_structured_data_domain, sign_structured_data}; use stacks_common::address::{AddressHashMode, C32_ADDRESS_VERSION_TESTNET_SINGLESIG}; use stacks_common::bitvec::BitVec; use stacks_common::codec::StacksMessageCodec; @@ -81,7 +82,7 @@ use stacks_common::types::chainstate::{ }; use stacks_common::types::{PrivateKey, StacksEpochId}; use stacks_common::util::hash::{to_hex, Hash160, MerkleTree, Sha512Trunc256Sum}; -use stacks_common::util::secp256k1::{MessageSignature, Secp256k1PublicKey}; +use stacks_common::util::secp256k1::{MessageSignature, Secp256k1PrivateKey, Secp256k1PublicKey}; use stacks_common::util::vrf::{VRFPrivateKey, VRFProof, VRFPublicKey, VRF}; use self::signer::SelfSigner; @@ -832,8 +833,18 @@ impl MockamotoNode { Some(AddressHashMode::SerializeP2PKH), ); - let mut signer_key = miner_nonce.to_be_bytes().to_vec(); - signer_key.resize(33, 0); + let signer_sk = Secp256k1PrivateKey::from_seed(&miner_nonce.to_be_bytes()); + let signer_key = Secp256k1PublicKey::from_private(&signer_sk).to_bytes_compressed(); + + let block_height = sortition_tip.block_height; + let reward_cycle = self + .sortdb + .pox_constants + .block_height_to_reward_cycle(self.sortdb.first_block_height, block_height) + .unwrap(); + + let signature = + make_signer_key_signature(&pox_address, &signer_sk, reward_cycle.into(), chain_id); let stack_stx_payload = if parent_chain_length < 2 { TransactionPayload::ContractCall(TransactionContractCall { @@ -845,6 +856,7 @@ impl MockamotoNode { pox_address.as_clarity_tuple().unwrap().into(), ClarityValue::UInt(u128::from(parent_burn_height)), ClarityValue::UInt(12), + ClarityValue::buff_from(signature).unwrap(), ClarityValue::buff_from(signer_key).unwrap(), ], }) @@ -858,6 +870,7 @@ impl MockamotoNode { function_args: vec![ ClarityValue::UInt(5), pox_address.as_clarity_tuple().unwrap().into(), + ClarityValue::buff_from(signature).unwrap(), ClarityValue::buff_from(signer_key).unwrap(), ], }) @@ -1019,3 +1032,28 @@ impl MockamotoNode { Ok(chain_length) } } + +fn make_signer_key_signature( + pox_addr: &PoxAddress, + signer_key: &StacksPrivateKey, + reward_cycle: u128, + chain_id: u32, +) -> Vec { + let domain_tuple = make_structured_data_domain("pox-4-signer", "1.0.0", chain_id); + + let data_tuple = clarity::vm::types::TupleData::from_data(vec![ + ( + "pox-addr".into(), + pox_addr.clone().as_clarity_tuple().unwrap().into(), + ), + ( + "reward-cycle".into(), + clarity::vm::Value::UInt(reward_cycle), + ), + ]) + .unwrap(); + + let signature = sign_structured_data(data_tuple.into(), domain_tuple, signer_key).unwrap(); + + signature.to_rsv() +}