This commit is contained in:
Guillermo Bescos 2024-01-23 19:36:25 +00:00
parent 6917c84b0e
commit e6954be4cc
7 changed files with 177 additions and 23 deletions

View File

@ -10,6 +10,9 @@ edition = "2021"
crate-type = ["lib"]
name = "pythnet_sdk"
[features]
gen = ["dep:wormhole-sdk", "dep:serde_wormhole"]
[dependencies]
bincode = "1.3.1"
borsh = "0.10.3"
@ -23,6 +26,12 @@ quickcheck = { version = "1", optional = true}
sha3 = "0.10.4"
slow_primes = "0.1.14"
thiserror = "1.0.40"
serde_wormhole = { git = "https://github.com/wormhole-foundation/wormhole", optional = true }
wormhole-sdk = { git = "https://github.com/wormhole-foundation/wormhole", optional = true }
[patch.crates-io]
serde_wormhole = { git = "https://github.com/wormhole-foundation/wormhole"}
[dev-dependencies]
base64 = "0.21.0"

View File

@ -0,0 +1,114 @@
use {
crate::{
accumulators::{
merkle::MerkleTree,
Accumulator,
},
hashers::keccak256_160::Keccak160,
messages::Message,
wire::{
to_vec,
v1::{
AccumulatorUpdateData,
MerklePriceUpdate,
Proof,
WormholeMerkleRoot,
WormholeMessage,
WormholePayload,
},
PrefixedVec,
},
},
byteorder::BigEndian,
serde_wormhole::RawMessage,
wormhole_sdk::{
Address,
Chain,
Vaa,
},
};
fn default_emitter_addr() -> [u8; 32] {
[0u8; 32]
}
const EMITTER_CHAIN: u16 = 3;
pub fn create_accumulator_message(
all_feeds: &[Message],
updates: &[Message],
corrupt_wormhole_message: bool,
) -> Vec<u8> {
let all_feeds_bytes: Vec<_> = all_feeds
.iter()
.map(|f| to_vec::<_, BigEndian>(f).unwrap())
.collect();
let all_feeds_bytes_refs: Vec<_> = all_feeds_bytes.iter().map(|f| f.as_ref()).collect();
let tree = MerkleTree::<Keccak160>::new(all_feeds_bytes_refs.as_slice()).unwrap();
let mut price_updates: Vec<MerklePriceUpdate> = vec![];
for update in updates {
let proof = tree
.prove(&to_vec::<_, BigEndian>(update).unwrap())
.unwrap();
price_updates.push(MerklePriceUpdate {
message: PrefixedVec::from(to_vec::<_, BigEndian>(update).unwrap()),
proof,
});
}
create_accumulator_message_from_updates(
price_updates,
tree,
corrupt_wormhole_message,
default_emitter_addr(),
EMITTER_CHAIN,
)
}
fn create_accumulator_message_from_updates(
price_updates: Vec<MerklePriceUpdate>,
tree: MerkleTree<Keccak160>,
corrupt_wormhole_message: bool,
emitter_address: [u8; 32],
emitter_chain: u16,
) -> Vec<u8> {
let mut root_hash = [0u8; 20];
root_hash.copy_from_slice(&to_vec::<_, BigEndian>(&tree.root).unwrap()[..20]);
let wormhole_message = WormholeMessage::new(WormholePayload::Merkle(WormholeMerkleRoot {
slot: 0,
ring_size: 0,
root: root_hash,
}));
let mut vaa = create_zero_vaa();
vaa.emitter_address = Address(emitter_address);
vaa.emitter_chain = Chain::from(emitter_chain);
let mut payload = to_vec::<_, BigEndian>(&wormhole_message).unwrap();
if corrupt_wormhole_message {
payload[0] = 0;
}
vaa.payload = <Box<RawMessage>>::from(payload);
let vaa_binary = serde_wormhole::to_vec(&vaa).unwrap();
let accumulator_update_data = AccumulatorUpdateData::new(Proof::WormholeMerkle {
vaa: PrefixedVec::from(vaa_binary.to_vec()),
updates: price_updates,
});
to_vec::<_, BigEndian>(&accumulator_update_data).unwrap()
}
fn create_zero_vaa() -> Vaa<Box<RawMessage>> {
Vaa {
version: 1,
guardian_set_index: 0,
signatures: vec![],
timestamp: 0,
nonce: 0,
emitter_chain: Chain::Any,
emitter_address: Address([0u8; 32]),
sequence: 0,
consistency_level: 0,
payload: <Box<RawMessage>>::from(vec![]),
}
}

View File

@ -5,6 +5,9 @@ pub mod messages;
pub mod wire;
pub mod wormhole;
#[cfg(feature = "gen")]
pub mod gen;
pub(crate) type Pubkey = [u8; 32];
/// Official Message Buffer Program Id

View File

@ -213,6 +213,17 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "bstr"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05"
dependencies = [
"memchr",
"regex-automata",
"serde",
]
[[package]]
name = "bumpalo"
version = "3.12.0"
@ -1546,9 +1557,11 @@ dependencies = [
"hex",
"rustc_version",
"serde",
"serde_wormhole",
"sha3 0.10.8",
"slow_primes",
"thiserror",
"wormhole-sdk",
]
[[package]]
@ -1617,6 +1630,12 @@ dependencies = [
"smallvec",
]
[[package]]
name = "regex-automata"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9"
[[package]]
name = "region"
version = "3.0.0"
@ -1857,6 +1876,18 @@ dependencies = [
"syn 2.0.15",
]
[[package]]
name = "serde_wormhole"
version = "0.1.0"
source = "git+https://github.com/wormhole-foundation/wormhole#ded305ffab3ac6b55fe85cb0431626a176baf8bb"
dependencies = [
"base64",
"itoa",
"serde",
"serde_bytes",
"thiserror",
]
[[package]]
name = "sha2"
version = "0.9.9"
@ -2658,6 +2689,20 @@ dependencies = [
"schemars",
"serde",
"sha3 0.9.1",
"thiserror",
]
[[package]]s
name = "wormhole-sdk"
version = "0.1.0"
source = "git+https://github.com/wormhole-foundation/wormhole#ded305ffab3ac6b55fe85cb0431626a176baf8bb"
dependencies = [
"anyhow",
"bstr",
"schemars",
"serde",
"serde_wormhole",
"sha3 0.10.8",
"thiserror",
]

View File

@ -14,3 +14,6 @@ codegen-units = 1
panic = 'abort'
incremental = false
overflow-checks = true
[patch.crates-io]
serde_wormhole = { git = "https://github.com/wormhole-foundation/wormhole" }

View File

@ -45,3 +45,4 @@ wormhole-cosmwasm = {git = "https://github.com/wormhole-foundation/wormhole", t
[dev-dependencies]
cosmwasm-vm = { version = "1.0.0", default-features = false }
serde_json = "1.0"
pythnet-sdk = { path = "../../../../pythnet/pythnet_sdk", features = ["gen"] }

View File

@ -831,6 +831,7 @@ mod test {
merkle::MerkleTree,
Accumulator,
},
gen::create_accumulator_message as create_accumulator_message_v1,
messages::{
PriceFeedMessage,
TwapMessage,
@ -1235,29 +1236,7 @@ mod test {
updates: &[Message],
corrupt_wormhole_message: bool,
) -> Binary {
let all_feeds_bytes: Vec<_> = all_feeds
.iter()
.map(|f| to_vec::<_, BigEndian>(f).unwrap())
.collect();
let all_feeds_bytes_refs: Vec<_> = all_feeds_bytes.iter().map(|f| f.as_ref()).collect();
let tree = MerkleTree::<Keccak160>::new(all_feeds_bytes_refs.as_slice()).unwrap();
let mut price_updates: Vec<MerklePriceUpdate> = vec![];
for update in updates {
let proof = tree
.prove(&to_vec::<_, BigEndian>(update).unwrap())
.unwrap();
price_updates.push(MerklePriceUpdate {
message: PrefixedVec::from(to_vec::<_, BigEndian>(update).unwrap()),
proof,
});
}
create_accumulator_message_from_updates(
price_updates,
tree,
corrupt_wormhole_message,
default_emitter_addr(),
EMITTER_CHAIN,
)
create_accumulator_message_v1(all_feeds, updates, corrupt_wormhole_message).into()
}