Browse Source

checking whether this works

Ayush Suresh 4 tháng trước cách đây
mục cha
commit
04906de2e1

+ 89 - 10
target_chains/fuel/contracts/Cargo.lock

@@ -1,6 +1,6 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "Inflector"
@@ -62,6 +62,17 @@ dependencies = [
  "subtle",
 ]
 
+[[package]]
+name = "ahash"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
 [[package]]
 name = "ahash"
 version = "0.8.11"
@@ -599,29 +610,63 @@ dependencies = [
  "generic-array",
 ]
 
+[[package]]
+name = "borsh"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa"
+dependencies = [
+ "borsh-derive 0.9.3",
+ "hashbrown 0.11.2",
+]
+
 [[package]]
 name = "borsh"
 version = "0.10.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b"
 dependencies = [
- "borsh-derive",
+ "borsh-derive 0.10.3",
  "hashbrown 0.13.2",
 ]
 
+[[package]]
+name = "borsh-derive"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775"
+dependencies = [
+ "borsh-derive-internal 0.9.3",
+ "borsh-schema-derive-internal 0.9.3",
+ "proc-macro-crate 0.1.5",
+ "proc-macro2",
+ "syn 1.0.109",
+]
+
 [[package]]
 name = "borsh-derive"
 version = "0.10.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7"
 dependencies = [
- "borsh-derive-internal",
- "borsh-schema-derive-internal",
+ "borsh-derive-internal 0.10.3",
+ "borsh-schema-derive-internal 0.10.3",
  "proc-macro-crate 0.1.5",
  "proc-macro2",
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "borsh-derive-internal"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
 [[package]]
 name = "borsh-derive-internal"
 version = "0.10.3"
@@ -633,6 +678,17 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "borsh-schema-derive-internal"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
 [[package]]
 name = "borsh-schema-derive-internal"
 version = "0.10.3"
@@ -2717,6 +2773,15 @@ dependencies = [
  "byteorder",
 ]
 
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+dependencies = [
+ "ahash 0.7.8",
+]
+
 [[package]]
 name = "hashbrown"
 version = "0.12.3"
@@ -2729,7 +2794,7 @@ version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
 dependencies = [
- "ahash",
+ "ahash 0.8.11",
 ]
 
 [[package]]
@@ -2738,7 +2803,7 @@ version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 dependencies = [
- "ahash",
+ "ahash 0.8.11",
  "allocator-api2",
  "serde",
 ]
@@ -4762,6 +4827,19 @@ dependencies = [
  "psl-types",
 ]
 
+[[package]]
+name = "pyth-sdk"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5c805ba3dfb5b7ed6a8ffa62ec38391f485a79c7cf6b3b11d3bd44fb0325824"
+dependencies = [
+ "borsh 0.9.3",
+ "borsh-derive 0.9.3",
+ "hex",
+ "schemars",
+ "serde",
+]
+
 [[package]]
 name = "pyth_sdk"
 version = "0.1.0"
@@ -4784,15 +4862,16 @@ dependencies = [
 
 [[package]]
 name = "pythnet-sdk"
-version = "2.3.0"
+version = "2.3.1"
 dependencies = [
  "bincode",
- "borsh",
+ "borsh 0.10.3",
  "bytemuck",
  "byteorder",
  "fast-math",
  "hex",
  "libsecp256k1",
+ "pyth-sdk",
  "rand",
  "rustc_version",
  "serde",
@@ -6559,7 +6638,7 @@ version = "0.212.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8d28bc49ba1e5c5b61ffa7a2eace10820443c4b7d1c0b144109261d14570fdf8"
 dependencies = [
- "ahash",
+ "ahash 0.8.11",
  "bitflags 2.6.0",
  "hashbrown 0.14.5",
  "indexmap 2.4.0",
@@ -7261,4 +7340,4 @@ checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
 dependencies = [
  "cc",
  "pkg-config",
-]
+]

+ 14 - 24
target_chains/fuel/contracts/Forc.lock

@@ -1,44 +1,34 @@
 [[package]]
-name = "core"
-source = "path+from-root-8357A6DDC5F39D14"
+name = "ownership"
+version = "0.26.0"
+source = "registry+ownership?0.26.0#QmbVoNUrvCTyQTdE8ZP83XxTQQVzhrevfMqk1rAJAkMFVo!"
+dependencies = [
+    "src5",
+    "std",
+]
 
 [[package]]
 name = "pyth-contract"
 source = "member"
 dependencies = [
+    "ownership",
     "pyth_interface",
-    "standards git+https://github.com/FuelLabs/sway-standards?tag=v0.4.4#a001d3c248595112aae67e5633a06ef9bc0536ae",
+    "src5",
     "std",
-    "sway_libs",
 ]
 
 [[package]]
 name = "pyth_interface"
 source = "path+from-root-555D3D27A908977B"
-dependencies = [
-    "standards git+https://github.com/FuelLabs/sway-standards?tag=v0.4.4#a001d3c248595112aae67e5633a06ef9bc0536ae",
-    "std",
-]
-
-[[package]]
-name = "standards"
-source = "git+https://github.com/FuelLabs/sway-standards?tag=v0.4.3#6f63eb7dff2458a7d976184e565b5cbf26f61da2"
 dependencies = ["std"]
 
 [[package]]
-name = "standards"
-source = "git+https://github.com/FuelLabs/sway-standards?tag=v0.4.4#a001d3c248595112aae67e5633a06ef9bc0536ae"
+name = "src5"
+version = "0.8.0"
+source = "registry+src5?0.8.0#QmNRPZrPHFBiEAyWPU8gesdPsD2zb3cMKwEgxJwV1ZEjyD!"
 dependencies = ["std"]
 
 [[package]]
 name = "std"
-source = "git+https://github.com/fuellabs/sway?tag=v0.65.2#66bb430395daf5b8f7205f7b9d8d008e2e812d54"
-dependencies = ["core"]
-
-[[package]]
-name = "sway_libs"
-source = "git+https://github.com/FuelLabs/sway-libs?tag=v0.21.0#6a227ed34c86fe1ebd334dbdfeccf66c43e3915b"
-dependencies = [
-    "standards git+https://github.com/FuelLabs/sway-standards?tag=v0.4.3#6f63eb7dff2458a7d976184e565b5cbf26f61da2",
-    "std",
-]
+version = "0.68.9"
+source = "registry+std?0.68.9#QmUaBxMs2JvY1bXgRCdeCsG3o6TN82ftRgv4Tq7ytqUGUT!"

+ 3 - 3
target_chains/fuel/contracts/fuel-toolchain.toml

@@ -1,6 +1,6 @@
 [toolchain]
-channel = "latest-aarch64-apple-darwin"
+channel = "mainnet"
 
 [components]
-forc = "0.65.2"
-fuel-core = "0.37.1"
+forc = "0.68.9"
+fuel-core = "0.43.2"

+ 2 - 2
target_chains/fuel/contracts/pyth-contract/Forc.toml

@@ -5,6 +5,6 @@ license = "Apache-2.0"
 name = "pyth-contract"
 
 [dependencies]
-sway_libs = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.21.0" }
 pyth_interface = { path = "../pyth-interface" }
-standards = { git = "https://github.com/FuelLabs/sway-standards", tag = "v0.4.4" }
+ownership = "0.26.0"
+src5 = "0.8.0"

+ 103 - 59
target_chains/fuel/contracts/pyth-contract/src/main.sw

@@ -53,8 +53,8 @@ use pyth_interface::{
     WormholeGuardians,
 };
 
-use sway_libs::ownership::*;
-use standards::src5::{SRC5, State};
+use ownership::*;
+use src5::{SRC5, State};
 
 const GUARDIAN_SET_EXPIRATION_TIME_SECONDS: u64 = 86400; // 24 hours in seconds
 configurable {
@@ -209,7 +209,7 @@ impl PythCore for Contract {
                     while i_2 < number_of_attestations {
                         let (_, slice) = vm.payload.split_at(attestation_index + 32);
                         let (price_feed_id, _) = slice.split_at(32);
-                        let price_feed_id: PriceFeedId = price_feed_id.into();
+                        let price_feed_id: PriceFeedId = b256::from_le_bytes(price_feed_id.clone());
 
                         if price_feed_id.is_target(target_price_feed_ids) == false {
                             attestation_index += attestation_size_u16;
@@ -272,7 +272,56 @@ impl PythCore for Contract {
 
     #[storage(read, write), payable]
     fn update_price_feeds(update_data: Vec<Bytes>) {
-        update_price_feeds(update_data)
+        require(
+            msg_asset_id() == AssetId::base(),
+            PythError::FeesCanOnlyBePaidInTheBaseAsset,
+        );
+
+        let mut total_number_of_updates = 0;
+
+        // let mut updated_price_feeds: Vec<PriceFeedId> = Vec::new(); // TODO: requires append for Vec
+        let mut i = 0;
+        while i < update_data.len() {
+            let data = update_data.get(i).unwrap();
+
+            match UpdateType::determine_type(data) {
+                UpdateType::Accumulator(accumulator_update) => {
+                    let (number_of_updates, _updated_ids) = accumulator_update.update_price_feeds(
+                        current_guardian_set_index(),
+                        storage
+                            .wormhole_guardian_sets,
+                        storage
+                            .latest_price_feed,
+                        storage
+                            .is_valid_data_source,
+                    );
+                    // updated_price_feeds.append(updated_ids); // TODO: requires append for Vec
+                    total_number_of_updates += number_of_updates;
+                },
+                UpdateType::BatchAttestation(batch_attestation_update) => {
+                    let _updated_ids = batch_attestation_update.update_price_feeds(
+                        current_guardian_set_index(),
+                        storage
+                            .wormhole_guardian_sets,
+                        storage
+                            .latest_price_feed,
+                        storage
+                            .is_valid_data_source,
+                    );
+                    // updated_price_feeds.append(updated_ids); // TODO: requires append for Vec
+                    total_number_of_updates += 1;
+                },
+            }
+
+            i += 1;
+        }
+
+        let required_fee = total_fee(total_number_of_updates, storage.single_update_fee);
+        require(msg_amount() >= required_fee, PythError::InsufficientFee);
+
+        // log(UpdatedPriceFeedsEvent { // TODO: requires append for Vec
+        //     updated_price_feeds,
+        // })
     }
 
     #[storage(read, write), payable]
@@ -292,7 +341,56 @@ impl PythCore for Contract {
         while i < price_feed_ids.len() {
             if latest_publish_time(price_feed_ids.get(i).unwrap()) < publish_times.get(i).unwrap()
             {
-                update_price_feeds(update_data);
+                require(
+                    msg_asset_id() == AssetId::base(),
+                    PythError::FeesCanOnlyBePaidInTheBaseAsset,
+                );
+
+                let mut total_number_of_updates = 0;
+
+                // let mut updated_price_feeds: Vec<PriceFeedId> = Vec::new(); // TODO: requires append for Vec
+                let mut i = 0;
+                while i < update_data.len() {
+                    let data = update_data.get(i).unwrap();
+
+                    match UpdateType::determine_type(data) {
+                        UpdateType::Accumulator(accumulator_update) => {
+                            let (number_of_updates, _updated_ids) = accumulator_update.update_price_feeds(
+                                current_guardian_set_index(),
+                                storage
+                                    .wormhole_guardian_sets,
+                                storage
+                                    .latest_price_feed,
+                                storage
+                                    .is_valid_data_source,
+                            );
+                            // updated_price_feeds.append(updated_ids); // TODO: requires append for Vec
+                            total_number_of_updates += number_of_updates;
+                        },
+                        UpdateType::BatchAttestation(batch_attestation_update) => {
+                            let _updated_ids = batch_attestation_update.update_price_feeds(
+                                current_guardian_set_index(),
+                                storage
+                                    .wormhole_guardian_sets,
+                                storage
+                                    .latest_price_feed,
+                                storage
+                                    .is_valid_data_source,
+                            );
+                            // updated_price_feeds.append(updated_ids); // TODO: requires append for Vec
+                            total_number_of_updates += 1;
+                        },
+                    }
+
+                    i += 1;
+                }
+
+                let required_fee = total_fee(total_number_of_updates, storage.single_update_fee);
+                require(msg_amount() >= required_fee, PythError::InsufficientFee);
+
+                // log(UpdatedPriceFeedsEvent { // TODO: requires append for Vec
+                //     updated_price_feeds,
+                // })
                 return;
             }
 
@@ -374,60 +472,6 @@ fn update_fee(update_data: Vec<Bytes>) -> u64 {
     total_fee(total_number_of_updates, storage.single_update_fee)
 }
 
-#[storage(read, write), payable]
-fn update_price_feeds(update_data: Vec<Bytes>) {
-    require(
-        msg_asset_id() == AssetId::base(),
-        PythError::FeesCanOnlyBePaidInTheBaseAsset,
-    );
-
-    let mut total_number_of_updates = 0;
-
-    // let mut updated_price_feeds: Vec<PriceFeedId> = Vec::new(); // TODO: requires append for Vec
-    let mut i = 0;
-    while i < update_data.len() {
-        let data = update_data.get(i).unwrap();
-
-        match UpdateType::determine_type(data) {
-            UpdateType::Accumulator(accumulator_update) => {
-                let (number_of_updates, _updated_ids) = accumulator_update.update_price_feeds(
-                    current_guardian_set_index(),
-                    storage
-                        .wormhole_guardian_sets,
-                    storage
-                        .latest_price_feed,
-                    storage
-                        .is_valid_data_source,
-                );
-                // updated_price_feeds.append(updated_ids); // TODO: requires append for Vec
-                total_number_of_updates += number_of_updates;
-            },
-            UpdateType::BatchAttestation(batch_attestation_update) => {
-                let _updated_ids = batch_attestation_update.update_price_feeds(
-                    current_guardian_set_index(),
-                    storage
-                        .wormhole_guardian_sets,
-                    storage
-                        .latest_price_feed,
-                    storage
-                        .is_valid_data_source,
-                );
-                // updated_price_feeds.append(updated_ids); // TODO: requires append for Vec
-                total_number_of_updates += 1;
-            },
-        }
-
-        i += 1;
-    }
-
-    let required_fee = total_fee(total_number_of_updates, storage.single_update_fee);
-    require(msg_amount() >= required_fee, PythError::InsufficientFee);
-
-    // log(UpdatedPriceFeedsEvent { // TODO: requires append for Vec
-    //     updated_price_feeds,
-    // })
-}
-
 #[storage(read)]
 fn valid_time_period() -> u64 {
     storage.valid_time_period_seconds.read()

+ 0 - 3
target_chains/fuel/contracts/pyth-interface/Forc.toml

@@ -3,6 +3,3 @@ authors = ["Fuel Labs <contact@fuel.sh>"]
 entry = "interface.sw"
 license = "Apache-2.0"
 name = "pyth_interface"
-
-[dependencies]
-standards = { git = "https://github.com/FuelLabs/sway-standards", tag = "v0.4.4" }

+ 1 - 1
target_chains/fuel/contracts/pyth-interface/src/data_structures/governance_instruction.sw

@@ -139,7 +139,7 @@ impl GovernanceInstruction {
             index += 2;
             let (_, slice) = encoded_payload.split_at(index);
             let (slice, _) = slice.split_at(32);
-            let emitter_address: b256 = slice.into();
+            let emitter_address: b256 = b256::from_le_bytes(slice.clone());
             index += 32;
 
             data_sources.push(DataSource {

+ 4 - 4
target_chains/fuel/contracts/pyth-interface/src/data_structures/price.sw

@@ -1,6 +1,6 @@
 library;
 
-use std::{bytes::Bytes, block::timestamp};
+use std::{bytes::Bytes, block::timestamp, bytes_conversions::b256::*};
 
 use ::errors::PythError;
 use ::utils::absolute_of_exponent;
@@ -99,7 +99,7 @@ impl PriceFeed {
         let mut offset = 1u64;
         let (_, slice) = encoded_price_feed.split_at(offset);
         let (price_feed_id, _) = slice.split_at(32);
-        let price_feed_id: PriceFeedId = price_feed_id.into();
+        let price_feed_id: PriceFeedId = b256::from_le_bytes(price_feed_id.clone());
         offset += 32;
         let price = u64::from_be_bytes([
             encoded_price_feed.get(offset).unwrap(),
@@ -186,7 +186,7 @@ impl PriceFeed {
         let mut attestation_index = index + 32;
         let (_, slice) = encoded_payload.split_at(attestation_index);
         let (price_feed_id, _) = slice.split_at(32);
-        let price_feed_id: PriceFeedId = price_feed_id.into();
+        let price_feed_id: PriceFeedId = b256::from_le_bytes(price_feed_id.clone());
         attestation_index += 32;
         let mut price = u64::from_be_bytes([
             encoded_payload.get(attestation_index).unwrap(),
@@ -321,7 +321,7 @@ impl PriceFeed {
 }
 
 impl PriceFeed {
-    pub fn extract_from_merkle_proof(digest: Bytes, encoded_proof: Bytes, offset: u64) -> (u64, self) {
+    pub fn extract_from_merkle_proof(digest: Bytes, encoded_proof: Bytes, offset: u64) -> (u64, Self) {
         // In order to avoid `ref mut` param related MemoryWriteOverlap error
         let mut current_offset = offset;
 

+ 7 - 6
target_chains/fuel/contracts/pyth-interface/src/data_structures/wormhole_light.sw

@@ -12,6 +12,7 @@ use std::{
     b512::B512,
     block::timestamp,
     bytes::Bytes,
+    bytes_conversions::b256::*,
     constants::ZERO_B256,
     hash::{
         Hash,
@@ -85,7 +86,7 @@ impl GuardianSetUpgrade {
         let mut index = 0;
         let (_, slice) = encoded_upgrade.split_at(index);
         let (module, _) = slice.split_at(32);
-        let module: b256 = module.into();
+        let module: b256 = b256::from_le_bytes(module.clone());
         require(module == UPGRADE_MODULE, WormholeError::InvalidModule);
         index += 32;
         let action = encoded_upgrade.get(index).unwrap();
@@ -114,7 +115,7 @@ impl GuardianSetUpgrade {
         while i < guardian_length {
             let (_, slice) = encoded_upgrade.split_at(index);
             let (key, _) = slice.split_at(20);
-            let key: b256 = key.into();
+            let key: b256 = b256::from_le_bytes(key.clone());
             new_guardian_set.keys.push(key.rsh(96));
             index += 20;
             i += 1;
@@ -352,10 +353,10 @@ impl WormholeVM {
             index += 1;
             let (_, slice) = encoded_vm.split_at(index);
             let (slice, remainder) = slice.split_at(32);
-            let r: b256 = slice.into();
+            let r: b256 = b256::from_le_bytes(slice.clone());
             index += 32;
             let (slice, remainder) = remainder.split_at(32);
-            let s: b256 = slice.into();
+            let s: b256 = b256::from_le_bytes(slice.clone());
             index += 32;
             let v = remainder.get(0);
             require(v.is_some(), WormholeError::SignatureVIrretrievable);
@@ -408,7 +409,7 @@ impl WormholeVM {
         index += 2;
         let (_, slice) = encoded_vm.split_at(index);
         let (slice, _) = slice.split_at(32);
-        let emitter_address: b256 = slice.into();
+        let emitter_address: b256 = b256::from_le_bytes(slice.clone());
         index += 32;
         let (_, slice) = encoded_vm.split_at(index);
         let (slice, _) = slice.split_at(8);
@@ -511,7 +512,7 @@ impl WormholeVM {
         index += 2;
         let (_, slice) = encoded_vm.split_at(index);
         let (slice, _) = slice.split_at(32);
-        let emitter_address: b256 = slice.into();
+        let emitter_address: b256 = b256::from_le_bytes(slice.clone());
         index += 32;
         let (_, slice) = encoded_vm.split_at(index);
         let (slice, _) = slice.split_at(8);

+ 9 - 5
target_chains/fuel/contracts/pyth-interface/src/pyth_merkle_proof.sw

@@ -1,6 +1,6 @@
 library;
 
-use std::{bytes::Bytes, hash::{Hash, keccak256}};
+use std::{bytes::Bytes, hash::{Hash, keccak256}, bytes_conversions::b256::*};
 use ::errors::PythError;
 
 pub const MERKLE_LEAF_PREFIX = 0u8;
@@ -20,8 +20,12 @@ fn node_hash(child_a: Bytes, child_b: Bytes) -> Bytes {
     let mut bytes = Bytes::with_capacity(41);
     bytes.push(MERKLE_NODE_PREFIX);
 
-    let a: b256 = child_a.into();
-    let b: b256 = child_b.into();
+    // let a: b256 = child_a.into();
+    // let b: b256 = child_b.into();
+
+    let a: b256 = b256::from_le_bytes(child_a.clone());
+    let b: b256 = b256::from_le_bytes(child_b.clone());
+
     if a > b {
         bytes.append(child_b);
         bytes.append(child_a);
@@ -54,8 +58,8 @@ pub fn validate_proof(
         i += 1;
     }
 
-    let current_digest_b256: b256 = current_digest.into();
-    let root_b256: b256 = root.into();
+    let current_digest_b256: b256 = b256::from_le_bytes(current_digest.clone());
+    let root_b256: b256 = b256::from_le_bytes(root.clone());
 
     require(current_digest_b256 == root_b256, PythError::InvalidProof);