Double hashing in Solana
Change-Id: I86769ae07cb28b38e00025b2f0bcf01919262c98
This commit is contained in:
parent
99c3e40968
commit
953ca87162
|
@ -72,6 +72,7 @@ use service::{
|
||||||
SubmitVaaRequest,
|
SubmitVaaRequest,
|
||||||
SubmitVaaResponse,
|
SubmitVaaResponse,
|
||||||
};
|
};
|
||||||
|
use sha3::Digest;
|
||||||
use solitaire::{
|
use solitaire::{
|
||||||
processors::seeded::Seeded,
|
processors::seeded::Seeded,
|
||||||
AccountState,
|
AccountState,
|
||||||
|
@ -238,6 +239,11 @@ fn pack_sig_verification_txs<'a>(
|
||||||
}
|
}
|
||||||
|
|
||||||
let vaa_body = serialize_vaa(vaa);
|
let vaa_body = serialize_vaa(vaa);
|
||||||
|
let body_hash: [u8; 32] = {
|
||||||
|
let mut h = sha3::Keccak256::default();
|
||||||
|
h.write(vaa_body.as_slice())?;
|
||||||
|
h.finalize().into()
|
||||||
|
};
|
||||||
|
|
||||||
let mut verify_txs: Vec<Transaction> = Vec::new();
|
let mut verify_txs: Vec<Transaction> = Vec::new();
|
||||||
for (_tx_index, chunk) in signature_items.chunks(6).enumerate() {
|
for (_tx_index, chunk) in signature_items.chunks(6).enumerate() {
|
||||||
|
@ -257,7 +263,7 @@ fn pack_sig_verification_txs<'a>(
|
||||||
secp_payload.write_u16::<LittleEndian>((data_offset + 85 * i + 65) as u16)?;
|
secp_payload.write_u16::<LittleEndian>((data_offset + 85 * i + 65) as u16)?;
|
||||||
secp_payload.write_u8(0)?;
|
secp_payload.write_u8(0)?;
|
||||||
secp_payload.write_u16::<LittleEndian>(message_offset as u16)?;
|
secp_payload.write_u16::<LittleEndian>(message_offset as u16)?;
|
||||||
secp_payload.write_u16::<LittleEndian>(vaa_body.len() as u16)?;
|
secp_payload.write_u16::<LittleEndian>(body_hash.len() as u16)?;
|
||||||
secp_payload.write_u8(0)?;
|
secp_payload.write_u8(0)?;
|
||||||
signature_status[s.index as usize] = i as i8;
|
signature_status[s.index as usize] = i as i8;
|
||||||
}
|
}
|
||||||
|
@ -269,7 +275,7 @@ fn pack_sig_verification_txs<'a>(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write body
|
// Write body
|
||||||
secp_payload.write(&vaa_body)?;
|
secp_payload.write(&body_hash)?;
|
||||||
|
|
||||||
let secp_ix = Instruction {
|
let secp_ix = Instruction {
|
||||||
program_id: solana_sdk::secp256k1_program::id(),
|
program_id: solana_sdk::secp256k1_program::id(),
|
||||||
|
@ -281,7 +287,6 @@ fn pack_sig_verification_txs<'a>(
|
||||||
|
|
||||||
let payload = VerifySignaturesData {
|
let payload = VerifySignaturesData {
|
||||||
signers: signature_status,
|
signers: signature_status,
|
||||||
hash: body_hash,
|
|
||||||
initial_creation: false,
|
initial_creation: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -289,6 +294,7 @@ fn pack_sig_verification_txs<'a>(
|
||||||
*bridge,
|
*bridge,
|
||||||
sender_keypair.pubkey(),
|
sender_keypair.pubkey(),
|
||||||
vaa.guardian_set_index,
|
vaa.guardian_set_index,
|
||||||
|
body_hash,
|
||||||
payload,
|
payload,
|
||||||
) {
|
) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
|
|
|
@ -16,13 +16,11 @@ use crate::{
|
||||||
MAX_LEN_GUARDIAN_KEYS,
|
MAX_LEN_GUARDIAN_KEYS,
|
||||||
};
|
};
|
||||||
use byteorder::ByteOrder;
|
use byteorder::ByteOrder;
|
||||||
use sha3::Digest;
|
|
||||||
use solana_program::program_error::ProgramError;
|
use solana_program::program_error::ProgramError;
|
||||||
use solitaire::{
|
use solitaire::{
|
||||||
processors::seeded::Seeded,
|
processors::seeded::Seeded,
|
||||||
CreationLamports::Exempt,
|
CreationLamports::Exempt,
|
||||||
};
|
};
|
||||||
use std::io::Write;
|
|
||||||
|
|
||||||
#[derive(FromAccounts)]
|
#[derive(FromAccounts)]
|
||||||
pub struct VerifySignatures<'b> {
|
pub struct VerifySignatures<'b> {
|
||||||
|
@ -58,8 +56,6 @@ impl From<[u8; 32]> for SignatureSetDerivationData {
|
||||||
|
|
||||||
#[derive(Default, BorshSerialize, BorshDeserialize)]
|
#[derive(Default, BorshSerialize, BorshDeserialize)]
|
||||||
pub struct VerifySignaturesData {
|
pub struct VerifySignaturesData {
|
||||||
/// Guardian set of the signatures
|
|
||||||
pub hash: [u8; 32],
|
|
||||||
/// instruction indices of signers (-1 for missing)
|
/// instruction indices of signers (-1 for missing)
|
||||||
pub signers: [i8; MAX_LEN_GUARDIAN_KEYS],
|
pub signers: [i8; MAX_LEN_GUARDIAN_KEYS],
|
||||||
}
|
}
|
||||||
|
@ -173,22 +169,18 @@ pub fn verify_signatures(
|
||||||
return Err(ProgramError::InvalidArgument.into());
|
return Err(ProgramError::InvalidArgument.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Data must be a hash
|
||||||
|
if secp_ixs[0].msg_size != 32 {
|
||||||
|
return Err(ProgramError::InvalidArgument.into());
|
||||||
|
}
|
||||||
|
|
||||||
// Extract message which is encoded in Solana Secp256k1 instruction data.
|
// Extract message which is encoded in Solana Secp256k1 instruction data.
|
||||||
let message = &secp_ix.data
|
let message = &secp_ix.data
|
||||||
[secp_ixs[0].msg_offset as usize..(secp_ixs[0].msg_offset + secp_ixs[0].msg_size) as usize];
|
[secp_ixs[0].msg_offset as usize..(secp_ixs[0].msg_offset + secp_ixs[0].msg_size) as usize];
|
||||||
|
|
||||||
// Hash the message part, which contains the serialized VAA body.
|
// Hash the message part, which contains the serialized VAA body.
|
||||||
let msg_hash: [u8; 32] = {
|
let mut msg_hash: [u8; 32] = [0u8; 32];
|
||||||
let mut h = sha3::Keccak256::default();
|
msg_hash.copy_from_slice(message);
|
||||||
if let Err(e) = h.write(message) {
|
|
||||||
return Err(e.into());
|
|
||||||
};
|
|
||||||
h.finalize().into()
|
|
||||||
};
|
|
||||||
|
|
||||||
if msg_hash != data.hash {
|
|
||||||
return Err(InvalidHash.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Confirm at this point that the derivation succeeds, we didn't have a signature set with the
|
// Confirm at this point that the derivation succeeds, we didn't have a signature set with the
|
||||||
// correct hash until this point.
|
// correct hash until this point.
|
||||||
|
@ -198,7 +190,7 @@ pub fn verify_signatures(
|
||||||
if !accs.signature_set.is_initialized() {
|
if !accs.signature_set.is_initialized() {
|
||||||
accs.signature_set.signatures = vec![[0u8; 65]; 19];
|
accs.signature_set.signatures = vec![[0u8; 65]; 19];
|
||||||
accs.signature_set.guardian_set_index = accs.guardian_set.index;
|
accs.signature_set.guardian_set_index = accs.guardian_set.index;
|
||||||
accs.signature_set.hash = data.hash;
|
accs.signature_set.hash = msg_hash;
|
||||||
accs.signature_set
|
accs.signature_set
|
||||||
.create(&msg_hash.into(), ctx, accs.payer.key, Exempt)?;
|
.create(&msg_hash.into(), ctx, accs.payer.key, Exempt)?;
|
||||||
} else {
|
} else {
|
||||||
|
@ -207,7 +199,7 @@ pub fn verify_signatures(
|
||||||
return Err(GuardianSetMismatch.into());
|
return Err(GuardianSetMismatch.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
if accs.signature_set.hash != data.hash {
|
if accs.signature_set.hash != msg_hash {
|
||||||
return Err(InvalidHash.into());
|
return Err(InvalidHash.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,6 +137,7 @@ pub fn verify_signatures(
|
||||||
program_id: Pubkey,
|
program_id: Pubkey,
|
||||||
payer: Pubkey,
|
payer: Pubkey,
|
||||||
guardian_set_index: u32,
|
guardian_set_index: u32,
|
||||||
|
hash: [u8; 32],
|
||||||
data: VerifySignaturesData,
|
data: VerifySignaturesData,
|
||||||
) -> solitaire::Result<Instruction> {
|
) -> solitaire::Result<Instruction> {
|
||||||
let guardian_set = GuardianSet::<'_, { AccountState::Uninitialized }>::key(
|
let guardian_set = GuardianSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
|
@ -147,7 +148,7 @@ pub fn verify_signatures(
|
||||||
);
|
);
|
||||||
|
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: data.hash },
|
&SignatureSetDerivationData { hash: hash },
|
||||||
&program_id,
|
&program_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ mod helpers {
|
||||||
nonce: u32,
|
nonce: u32,
|
||||||
guardian_set_index: u32,
|
guardian_set_index: u32,
|
||||||
emitter_chain: u16,
|
emitter_chain: u16,
|
||||||
) -> (PostVAAData, Vec<u8>, [u8; 32]) {
|
) -> (PostVAAData, [u8; 32], [u8; 32]) {
|
||||||
let mut vaa = PostVAAData {
|
let mut vaa = PostVAAData {
|
||||||
version: 0,
|
version: 0,
|
||||||
guardian_set_index,
|
guardian_set_index,
|
||||||
|
@ -226,12 +226,18 @@ mod helpers {
|
||||||
|
|
||||||
// Hash this body, which is expected to be the same as the hash currently stored in the
|
// Hash this body, which is expected to be the same as the hash currently stored in the
|
||||||
// signature account, binding that set of signatures to this VAA.
|
// signature account, binding that set of signatures to this VAA.
|
||||||
let body_hash: [u8; 32] = {
|
let body: [u8; 32] = {
|
||||||
let mut h = sha3::Keccak256::default();
|
let mut h = sha3::Keccak256::default();
|
||||||
h.write(body.as_slice()).unwrap();
|
h.write(body.as_slice()).unwrap();
|
||||||
h.finalize().into()
|
h.finalize().into()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let body_hash: [u8; 32] = {
|
||||||
|
let mut h = sha3::Keccak256::default();
|
||||||
|
h.write(&body).unwrap();
|
||||||
|
h.finalize().into()
|
||||||
|
};
|
||||||
|
|
||||||
(vaa, body, body_hash)
|
(vaa, body, body_hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,8 +324,7 @@ mod helpers {
|
||||||
client: &RpcClient,
|
client: &RpcClient,
|
||||||
program: &Pubkey,
|
program: &Pubkey,
|
||||||
payer: &Keypair,
|
payer: &Keypair,
|
||||||
body: Vec<u8>,
|
body: [u8; 32],
|
||||||
body_hash: [u8; 32],
|
|
||||||
secret_keys: &[SecretKey],
|
secret_keys: &[SecretKey],
|
||||||
guardian_set_version: u32,
|
guardian_set_version: u32,
|
||||||
) -> Result<(), ClientError> {
|
) -> Result<(), ClientError> {
|
||||||
|
@ -339,8 +344,8 @@ mod helpers {
|
||||||
*program,
|
*program,
|
||||||
payer.pubkey(),
|
payer.pubkey(),
|
||||||
guardian_set_version,
|
guardian_set_version,
|
||||||
|
body,
|
||||||
VerifySignaturesData {
|
VerifySignaturesData {
|
||||||
hash: body_hash,
|
|
||||||
signers,
|
signers,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -217,14 +217,13 @@ fn test_bridge_messages(context: &mut Context) {
|
||||||
|
|
||||||
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 0)
|
common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
|
||||||
.unwrap();
|
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::sync(client, payer);
|
common::sync(client, payer);
|
||||||
|
|
||||||
// Derive where we expect created accounts to be.
|
// Derive where we expect created accounts to be.
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: body_hash },
|
&SignatureSetDerivationData { hash: body},
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -246,7 +245,7 @@ fn test_bridge_messages(context: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify on chain Signatures
|
// Verify on chain Signatures
|
||||||
assert_eq!(signatures.hash, body_hash);
|
assert_eq!(signatures.hash, body);
|
||||||
assert_eq!(signatures.guardian_set_index, 0);
|
assert_eq!(signatures.guardian_set_index, 0);
|
||||||
|
|
||||||
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
||||||
|
@ -284,13 +283,13 @@ fn test_bridge_messages(context: &mut Context) {
|
||||||
|
|
||||||
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 0).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::sync(client, payer);
|
common::sync(client, payer);
|
||||||
|
|
||||||
// Derive where we expect created accounts to be.
|
// Derive where we expect created accounts to be.
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: body_hash },
|
&SignatureSetDerivationData { hash: body },
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -312,7 +311,7 @@ fn test_bridge_messages(context: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify on chain Signatures
|
// Verify on chain Signatures
|
||||||
assert_eq!(signatures.hash, body_hash);
|
assert_eq!(signatures.hash, body);
|
||||||
assert_eq!(signatures.guardian_set_index, 0);
|
assert_eq!(signatures.guardian_set_index, 0);
|
||||||
|
|
||||||
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
||||||
|
@ -375,13 +374,13 @@ fn test_persistent_bridge_messages(context: &mut Context) {
|
||||||
|
|
||||||
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 0).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::sync(client, payer);
|
common::sync(client, payer);
|
||||||
|
|
||||||
// Derive where we expect created accounts to be.
|
// Derive where we expect created accounts to be.
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: body_hash },
|
&SignatureSetDerivationData { hash: body },
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -403,7 +402,7 @@ fn test_persistent_bridge_messages(context: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify on chain Signatures
|
// Verify on chain Signatures
|
||||||
assert_eq!(signatures.hash, body_hash);
|
assert_eq!(signatures.hash, body);
|
||||||
assert_eq!(signatures.guardian_set_index, 0);
|
assert_eq!(signatures.guardian_set_index, 0);
|
||||||
|
|
||||||
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
||||||
|
@ -541,7 +540,7 @@ fn test_guardian_set_change(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 0).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::upgrade_guardian_set(
|
common::upgrade_guardian_set(
|
||||||
client,
|
client,
|
||||||
|
@ -598,13 +597,13 @@ fn test_guardian_set_change(context: &mut Context) {
|
||||||
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
// Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
|
||||||
let sequence = context.seq.next(emitter.pubkey().to_bytes());
|
let sequence = context.seq.next(emitter.pubkey().to_bytes());
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::sync(client, payer);
|
common::sync(client, payer);
|
||||||
|
|
||||||
// Derive where we expect created accounts to be.
|
// Derive where we expect created accounts to be.
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: body_hash },
|
&SignatureSetDerivationData { hash: body },
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -626,7 +625,7 @@ fn test_guardian_set_change(context: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify on chain Signatures
|
// Verify on chain Signatures
|
||||||
assert_eq!(signatures.hash, body_hash);
|
assert_eq!(signatures.hash, body);
|
||||||
assert_eq!(signatures.guardian_set_index, 1);
|
assert_eq!(signatures.guardian_set_index, 1);
|
||||||
|
|
||||||
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
||||||
|
@ -715,7 +714,7 @@ fn test_set_fees(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::set_fees(
|
common::set_fees(
|
||||||
client,
|
client,
|
||||||
|
@ -776,7 +775,7 @@ fn test_set_fees(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::sync(client, payer);
|
common::sync(client, payer);
|
||||||
|
|
||||||
|
@ -788,7 +787,7 @@ fn test_set_fees(context: &mut Context) {
|
||||||
|
|
||||||
// Derive where we expect created accounts to be.
|
// Derive where we expect created accounts to be.
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: body_hash },
|
&SignatureSetDerivationData { hash: body },
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -810,7 +809,7 @@ fn test_set_fees(context: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify on chain Signatures
|
// Verify on chain Signatures
|
||||||
assert_eq!(signatures.hash, body_hash);
|
assert_eq!(signatures.hash, body);
|
||||||
assert_eq!(signatures.guardian_set_index, 1);
|
assert_eq!(signatures.guardian_set_index, 1);
|
||||||
|
|
||||||
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
||||||
|
@ -857,7 +856,7 @@ fn test_set_fees_fails(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
assert!(common::set_fees(
|
assert!(common::set_fees(
|
||||||
client,
|
client,
|
||||||
|
@ -899,7 +898,7 @@ fn test_free_fees(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::set_fees(
|
common::set_fees(
|
||||||
client,
|
client,
|
||||||
|
@ -938,7 +937,7 @@ fn test_free_fees(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::sync(client, payer);
|
common::sync(client, payer);
|
||||||
|
|
||||||
|
@ -950,7 +949,7 @@ fn test_free_fees(context: &mut Context) {
|
||||||
|
|
||||||
// Derive where we expect created accounts to be.
|
// Derive where we expect created accounts to be.
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: body_hash },
|
&SignatureSetDerivationData { hash: body },
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -972,7 +971,7 @@ fn test_free_fees(context: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify on chain Signatures
|
// Verify on chain Signatures
|
||||||
assert_eq!(signatures.hash, body_hash);
|
assert_eq!(signatures.hash, body);
|
||||||
assert_eq!(signatures.guardian_set_index, 1);
|
assert_eq!(signatures.guardian_set_index, 1);
|
||||||
|
|
||||||
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
||||||
|
@ -1022,7 +1021,7 @@ fn test_transfer_fees(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::transfer_fees(
|
common::transfer_fees(
|
||||||
client,
|
client,
|
||||||
|
@ -1071,7 +1070,7 @@ fn test_transfer_fees_fails(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
|
|
||||||
assert!(common::transfer_fees(
|
assert!(common::transfer_fees(
|
||||||
|
@ -1118,7 +1117,7 @@ fn test_transfer_too_much(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
|
|
||||||
// Should fail to transfer.
|
// Should fail to transfer.
|
||||||
|
@ -1157,12 +1156,12 @@ fn test_foreign_bridge_messages(context: &mut Context) {
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 0).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::sync(client, payer);
|
common::sync(client, payer);
|
||||||
|
|
||||||
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
let signature_set = SignatureSet::<'_, { AccountState::Uninitialized }>::key(
|
||||||
&SignatureSetDerivationData { hash: body_hash },
|
&SignatureSetDerivationData { hash: body },
|
||||||
&program,
|
&program,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1183,7 +1182,7 @@ fn test_foreign_bridge_messages(context: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Verify on chain Signatures
|
// Verify on chain Signatures
|
||||||
assert_eq!(signatures.hash, body_hash);
|
assert_eq!(signatures.hash, body);
|
||||||
assert_eq!(signatures.guardian_set_index, 0);
|
assert_eq!(signatures.guardian_set_index, 0);
|
||||||
|
|
||||||
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
|
||||||
|
@ -1236,7 +1235,7 @@ fn test_transfer_total_fails(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 1).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
|
|
||||||
// Transferring total fees should fail, to prevent the account being de-allocated.
|
// Transferring total fees should fail, to prevent the account being de-allocated.
|
||||||
|
@ -1289,7 +1288,7 @@ fn test_upgrade_contract(context: &mut Context) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
|
||||||
common::verify_signatures(client, program, payer, body, body_hash, &context.secret, 0).unwrap();
|
common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
|
||||||
common::post_vaa(client, program, payer, vaa).unwrap();
|
common::post_vaa(client, program, payer, vaa).unwrap();
|
||||||
common::upgrade_contract(
|
common::upgrade_contract(
|
||||||
client,
|
client,
|
||||||
|
|
Loading…
Reference in New Issue