Browse Source

set up framework for contract initialization (i.e. constructor) and update all price feeds. some cargo build errors, but will fix in next commit

Ayush Suresh 5 months ago
parent
commit
e10d2d89ce

+ 1 - 0
target_chains/stylus/Cargo.lock

@@ -4853,6 +4853,7 @@ dependencies = [
  "pythnet-sdk",
  "stylus-sdk 0.9.0",
  "tokio",
+ "wormhole-contract",
 ]
 
 [[package]]

+ 1 - 0
target_chains/stylus/contracts/pyth-receiver/Cargo.toml

@@ -14,6 +14,7 @@ alloy-sol-types = "=0.8.20"
 stylus-sdk = "0.9.0"
 hex = { version = "0.4", default-features = false }
 pythnet-sdk = { path = "../../../../pythnet/pythnet_sdk" }
+wormhole-contract = { path = "../../contracts/wormhole" }
 
 [dev-dependencies]
 alloy-primitives = { version = "=0.8.20", features = ["sha3-keccak"] }

+ 16 - 11
target_chains/stylus/contracts/pyth-receiver/src/lib.rs

@@ -14,7 +14,7 @@ use stylus_sdk::{alloy_primitives::{U16, U32, U256, U64, I32, I64, FixedBytes, B
                 storage::{StorageAddress, StorageVec, StorageMap, StorageUint, StorageBool, StorageU256, StorageU16, StorageFixedBytes},
                 call::Call};
 
-use structs::{PriceInfoReturn, PriceInfoStorage};
+use structs::{PriceInfoReturn, PriceInfoStorage, DataSourceStorage};
 use error::{PythReceiverError};
 use pythnet_sdk::{wire::{v1::{
             AccumulatorUpdateData, Proof,
@@ -32,8 +32,7 @@ sol_interface! {
 #[entrypoint]
 pub struct PythReceiver {
     pub wormhole: StorageAddress,
-    pub valid_data_source_chain_ids: StorageVec<StorageU16>,
-    pub valid_data_source_emitter_addresses: StorageVec<StorageFixedBytes<32>>,
+    pub valid_data_sources: StorageVec<DataSourceStorage>,
     pub is_valid_data_source: StorageMap<FixedBytes<32>, StorageBool>,
     pub single_update_fee_in_wei: StorageU256,
     pub valid_time_period_seconds: StorageU256,
@@ -65,18 +64,15 @@ impl PythReceiver {
         for (i, chain_id) in data_source_emitter_chain_ids.iter().enumerate() {
             let emitter_address = FixedBytes::<32>::from(data_source_emitter_addresses[i]);
             
-            // Get a new storage slot in the vector and set its value
-            let mut chain_id_storage = self.valid_data_source_chain_ids.grow();
-            chain_id_storage.set(U16::from(*chain_id));
-            
-            let mut emitter_address_storage = self.valid_data_source_emitter_addresses.grow();
-            emitter_address_storage.set(emitter_address);
+            // Create a new data source storage slot
+            let mut data_source = self.valid_data_sources.grow();
+            data_source.chain_id.set(U16::from(*chain_id));
+            data_source.emitter_address.set(emitter_address);
             
             self.is_valid_data_source
                 .setter(emitter_address)
                 .set(true);
         }
-        
     }
     
     pub fn get_price_unsafe(&self, _id: [u8; 32]) -> Result<PriceInfoReturn, PythReceiverError> {
@@ -124,8 +120,17 @@ impl PythReceiver {
                 let config = Call::new_in(self);
                 let _parsed_vaa = wormhole.parse_and_verify_vm(config, Bytes::from(Vec::from(vaa))).map_err(|_| PythReceiverError::PriceUnavailable).unwrap();
 
+                if !self.is_valid_data_source.entry(_parsed_vaa.data_source()).read() {
+                    panic!("Update data source is not a valid data source.");
+                }
+
                 for update in updates {
-                    // fill in update processign logic.
+                    // fill in update processing logic.
+                    // update is a merkle price update
+                    let message = update.message;
+                    let proof = update.proof;
+
+                    
                 }
             }
         };

+ 25 - 2
target_chains/stylus/contracts/pyth-receiver/src/structs.rs

@@ -1,6 +1,29 @@
 use alloc::vec::Vec;
-use stylus_sdk::{prelude::*, storage::{StorageU16, StorageU64, StorageI32, StorageI64, StorageFixedBytes}};
-use stylus_sdk::alloy_primitives::{U64, I32, I64};
+use stylus_sdk::{prelude::*, storage::{StorageU64, StorageI32, StorageI64, StorageU16, StorageFixedBytes}};
+use stylus_sdk::alloy_primitives::{U64, I32, I64, U16, FixedBytes};
+use wormhole_contract::types::VerifiedVM;
+
+#[storage]
+pub struct DataSourceStorage {
+    pub chain_id: StorageU16,
+    pub emitter_address: StorageFixedBytes<32>,
+}
+
+pub trait GetDataSource {
+    fn data_source(&self) -> DataSourceStorage;
+}
+
+impl GetDataSource for VerifiedVM {
+    fn data_source(&self) -> DataSourceStorage {
+        let mut ds = DataSourceStorage {
+            chain_id: StorageU16::default(),
+            emitter_address: StorageFixedBytes::<32>::default(),
+        };
+        ds.chain_id.set(U16::from(self.emitter_chain_id));
+        ds.emitter_address.set(self.emitter_address);
+        ds
+    }
+}
 
 // PriceInfo struct storing price information
 #[storage]

+ 1 - 1
target_chains/stylus/contracts/wormhole/src/lib.rs

@@ -5,7 +5,7 @@ extern crate alloc;
 #[global_allocator]
 static ALLOC: mini_alloc::MiniAlloc = mini_alloc::MiniAlloc::INIT;
 
-#[cfg(not(any(feature = "std", feature = "export-abi")))]
+#[cfg(all(not(any(feature = "std", feature = "export-abi")), feature = "main"))]
 #[panic_handler]
 fn panic(_info: &core::panic::PanicInfo) -> ! {
     loop {}