Просмотр исходного кода

refactor: clean up and address feedback

swimricky 2 лет назад
Родитель
Сommit
561c5e2b88

+ 2 - 2
.pre-commit-config.yaml

@@ -99,13 +99,13 @@ repos:
         pass_filenames: false
         files: pythnet/pythnet_sdk
       # Hooks for solana receiver contract
-      - id: cargo-fmt-pyth_solana_receiver
+      - id: cargo-fmt-pyth-solana-receiver
         name: Cargo format for solana target chain contract
         language: "rust"
         entry: cargo +nightly-2023-03-01 fmt --manifest-path ./target_chains/solana/Cargo.toml --all -- --config-path rustfmt.toml
         pass_filenames: false
         files: target_chains/solana
-      - id: cargo-clippy-pyth_solana_receiver
+      - id: cargo-clippy-pyth-solana-receiver
         name: Cargo clippy for solana target chain contract
         language: "rust"
         entry: cargo +nightly-2023-03-01 clippy --manifest-path ./target_chains/solana/Cargo.toml --tests --fix --allow-dirty --allow-staged --features devnet -- -D warnings

+ 3 - 2
target_chains/solana/Anchor.toml

@@ -17,6 +17,7 @@ deploy = "anchor deploy --program-keypair program_address.json --program-name py
 cli_build = "cargo build --package pyth-solana-receiver-cli --features devnet"
 
 
-cli_test_mainnet = "cargo run --package pyth-solana-receiver-cli --features mainnet post-and-receive-vaa -v UE5BVQEAAAADuAEAAAADDQAbXgddtAJnEhoLE4JAxcuyokAmnoTS4qSvkw0gJpNC+TtBZApwDqsQbCXgmYOuygk6QVsV1JpKYAUa72h95m0EAQNrHPMh1kCYvYyA/6J0qOp8nrtpzVFFoAagmMqJzKDmAV8MCVvpFuy5EPu69UO95UUnZZhX/hk4y7wdTfhedTYdAQR6SL0tbSGSlWHLSzs2wpWVx8N0RFtFULp9EkCSUnxAnma3UI/hFz/78fvtRp/qx1HT8M4/8zSEuVbwd8pdeBsvAQZoD/eilZ2nvs1eHoXKz7FhW3UxVCYUZbNnJmY/Iqc6hw6+7yIJ9sh1cKvWkI+ug1ZC9KiOK90/cxipRcbaa+9+AQd5SGi5/En6R/jIoNF+iqza6YbJht0CZ02NkcGl1LOU23sptShlj3rV8NbiP8n9hV995zVDpO4j4lxJRgEyveoKAQgOwavPcVLbTn45goFiKWw7qN+MALLOP42/j8g4am+1GU8+pwEWqWvyJX0Ja+sINXYzDuCmkIVRcTQ0KW+M6tjrAQpJJe4E6+cuA59wmC7sVn5EB3zL/ILaAR00viSmrZFIeTZwmFu/WXQDnM6KRdAydalvfLCFp69w7PXTsRZ6qZdcAQyMDRjaChbqarjOW1xDU2xa2RT0ZgZEphCdWjxhbeet+hdsjsSlR/EYjBZWiEPJybOcEHb8fHb0/IXk9HUstIC6AQ18kAn8R1EHEdpYQ/d91dE/fAyFw2ZdsoazNIO4A1wNMipxpZyt31XLpkSZwnIUpt65VpOzPjnfvo13cEO0JBGyAQ6MCCPDol1OWtcXcTyVV4nhjbKXf1HPaWXXe4Z3Z+4AdEf+o+020qlbqgHlZ78m10S63E3+EodWXRcFsjCWtYsZAQ9FcKjBl86Adz+MsTtRp/ixSVFn1C3YLgcJ0WXOur1LrSFY1Vx0L0/LE8UTkJDXjxr/Vjw9MJ+MO7636omRNf3WABEkYX/9G+cTxfg6IZYYR346LVwb/2DzoeGK+2leGriR7Wl2XWnoCRLzXAvMXRYVCOXvThf/tKOKT9tSNXaHdqabARIKYMpsCs8G3LEfi9M8wizeExT5NknDMPN1SLwimmvSf2EKFfujir9nPpZQ1Xfm1ZmycoGNM2UZaMrtRomrM9NeAGVcy4MAAAAAABrhAfrtrFhR4yubI7X5QRqMK6xKrj7U3XuBHdGnLqSqcQAAAAABlfAvAUFVV1YAAAAAAAabjpgAACcQ4m9pYxIYDwWSb17+tMjLME6z1owBAFUA5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0MAAANQh+v0TQAAAABXLlbN////+AAAAABlXMuCAAAAAGVcy4IAAANY89SSgAAAAABcNVH+CnrtHqVfUZAj59jeC89ZKnqKwi74B/AarJjj0/XaRMzvndCZBCRp4O3CnbyoPb7CtEUsAMCzmXXT/QJrFiJoCVGC+Ept4uJzaIZi7gOgaefhMVFFe43MEVmHj17tWyDgL0yymOCPbv2+vINEkfK9P9PV2cjRGbo6LDGtSN9J0l3Ni3CwKjkpFlWw7/BQawHz7u8b9zgtwpVzkzQeWZr0UeJek937S8nxcNctJ8B2JyCzUY/1ocTDJTaia64Hha+JHscLjDj+BOOt"
-cli_test_devnet = "cargo run --package pyth-solana-receiver-cli --features devnet post-and-receive-vaa -v UE5BVQEAAAAAoAEAAAAAAQCeeKXuDxu9EGbfkvoMx8eN8NduvQcYMZGKG5uGIyGF1CNFK9Yer7XCnxtBKI7e4K+a1psXU7sf5FnoI8nx6vdzAWVeYaYAAAAAABrhAfrtrFhR4yubI7X5QRqMK6xKrj7U3XuBHdGnLqSqcQAAAAACQ0P8AUFVV1YAAAAAAAaxOqcAACcQOrsKoozp6g1+3rAM3jx7IZT5yucBAFUAY1TWhcJH8e/Db5Z2F77/ouvVqV2P/hfeRJhQXJIwZ7gAAAAAB7Qy1wAAAAAAApWk////+AAAAABlXmGlAAAAAGVeYaQAAAAAB7Ib2AAAAAAAAmiICj05zr0cjtpu9ob2FqfTCtiNsUeIYch4tEBsiPlkkG+oqxjxjZ+k/fCElwyv85cj7ZJUyTC7rQgq/SvRrH+FKjekRMlSt5vu27rfIL6TCnE3iK0DY5CDDTczidxcs7V1thabVZF2MeITDKEkTqpX5e/3CLomW+XAQ+MBQ78/zW0QnHOyG7gwhhjHVcIuHGlW9kNDIdM7C6GTT11Lq/N1eIDf63h3Vp0XdDtkZPRItrDAOYfOnDLobHufIirCf+lrGKNaj/gMjidf"
+cli_test_mainnet = "cargo run --package pyth-solana-receiver-cli --features mainnet post-and-receive-vaa -u https://api.mainnet-beta.solana.com -v UE5BVQEAAAADuAEAAAADDQAbXgddtAJnEhoLE4JAxcuyokAmnoTS4qSvkw0gJpNC+TtBZApwDqsQbCXgmYOuygk6QVsV1JpKYAUa72h95m0EAQNrHPMh1kCYvYyA/6J0qOp8nrtpzVFFoAagmMqJzKDmAV8MCVvpFuy5EPu69UO95UUnZZhX/hk4y7wdTfhedTYdAQR6SL0tbSGSlWHLSzs2wpWVx8N0RFtFULp9EkCSUnxAnma3UI/hFz/78fvtRp/qx1HT8M4/8zSEuVbwd8pdeBsvAQZoD/eilZ2nvs1eHoXKz7FhW3UxVCYUZbNnJmY/Iqc6hw6+7yIJ9sh1cKvWkI+ug1ZC9KiOK90/cxipRcbaa+9+AQd5SGi5/En6R/jIoNF+iqza6YbJht0CZ02NkcGl1LOU23sptShlj3rV8NbiP8n9hV995zVDpO4j4lxJRgEyveoKAQgOwavPcVLbTn45goFiKWw7qN+MALLOP42/j8g4am+1GU8+pwEWqWvyJX0Ja+sINXYzDuCmkIVRcTQ0KW+M6tjrAQpJJe4E6+cuA59wmC7sVn5EB3zL/ILaAR00viSmrZFIeTZwmFu/WXQDnM6KRdAydalvfLCFp69w7PXTsRZ6qZdcAQyMDRjaChbqarjOW1xDU2xa2RT0ZgZEphCdWjxhbeet+hdsjsSlR/EYjBZWiEPJybOcEHb8fHb0/IXk9HUstIC6AQ18kAn8R1EHEdpYQ/d91dE/fAyFw2ZdsoazNIO4A1wNMipxpZyt31XLpkSZwnIUpt65VpOzPjnfvo13cEO0JBGyAQ6MCCPDol1OWtcXcTyVV4nhjbKXf1HPaWXXe4Z3Z+4AdEf+o+020qlbqgHlZ78m10S63E3+EodWXRcFsjCWtYsZAQ9FcKjBl86Adz+MsTtRp/ixSVFn1C3YLgcJ0WXOur1LrSFY1Vx0L0/LE8UTkJDXjxr/Vjw9MJ+MO7636omRNf3WABEkYX/9G+cTxfg6IZYYR346LVwb/2DzoeGK+2leGriR7Wl2XWnoCRLzXAvMXRYVCOXvThf/tKOKT9tSNXaHdqabARIKYMpsCs8G3LEfi9M8wizeExT5NknDMPN1SLwimmvSf2EKFfujir9nPpZQ1Xfm1ZmycoGNM2UZaMrtRomrM9NeAGVcy4MAAAAAABrhAfrtrFhR4yubI7X5QRqMK6xKrj7U3XuBHdGnLqSqcQAAAAABlfAvAUFVV1YAAAAAAAabjpgAACcQ4m9pYxIYDwWSb17+tMjLME6z1owBAFUA5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0MAAANQh+v0TQAAAABXLlbN////+AAAAABlXMuCAAAAAGVcy4IAAANY89SSgAAAAABcNVH+CnrtHqVfUZAj59jeC89ZKnqKwi74B/AarJjj0/XaRMzvndCZBCRp4O3CnbyoPb7CtEUsAMCzmXXT/QJrFiJoCVGC+Ept4uJzaIZi7gOgaefhMVFFe43MEVmHj17tWyDgL0yymOCPbv2+vINEkfK9P9PV2cjRGbo6LDGtSN9J0l3Ni3CwKjkpFlWw7/BQawHz7u8b9zgtwpVzkzQeWZr0UeJek937S8nxcNctJ8B2JyCzUY/1ocTDJTaia64Hha+JHscLjDj+BOOt"
+cli_test_devnet = "cargo run --package pyth-solana-receiver-cli --features devnet post-and-receive-vaa -u https://api.devnet.solana.com -v UE5BVQEAAAAAoAEAAAAAAQCeeKXuDxu9EGbfkvoMx8eN8NduvQcYMZGKG5uGIyGF1CNFK9Yer7XCnxtBKI7e4K+a1psXU7sf5FnoI8nx6vdzAWVeYaYAAAAAABrhAfrtrFhR4yubI7X5QRqMK6xKrj7U3XuBHdGnLqSqcQAAAAACQ0P8AUFVV1YAAAAAAAaxOqcAACcQOrsKoozp6g1+3rAM3jx7IZT5yucBAFUAY1TWhcJH8e/Db5Z2F77/ouvVqV2P/hfeRJhQXJIwZ7gAAAAAB7Qy1wAAAAAAApWk////+AAAAABlXmGlAAAAAGVeYaQAAAAAB7Ib2AAAAAAAAmiICj05zr0cjtpu9ob2FqfTCtiNsUeIYch4tEBsiPlkkG+oqxjxjZ+k/fCElwyv85cj7ZJUyTC7rQgq/SvRrH+FKjekRMlSt5vu27rfIL6TCnE3iK0DY5CDDTczidxcs7V1thabVZF2MeITDKEkTqpX5e/3CLomW+XAQ+MBQ78/zW0QnHOyG7gwhhjHVcIuHGlW9kNDIdM7C6GTT11Lq/N1eIDf63h3Vp0XdDtkZPRItrDAOYfOnDLobHufIirCf+lrGKNaj/gMjidf"
+
 test = "anchor build -- --features devnet && cargo test-bpf --features devnet -- --show-output"

+ 2 - 2
target_chains/solana/README.md

@@ -6,8 +6,8 @@ The receiver program verifies that the VAA comes from wormhole (through the `own
 ```shell
 # Generate the program key
 # and use the key to replace the following two places
-#     "pyth_solana_receiver" in Anchor.toml
-#     "declare_id!()" in programs/pyth_solana_receiver/src/lib.rs
+#     "pyth-solana-receiver" in Anchor.toml
+#     "declare_id!()" in programs/pyth-solana-receiver/src/lib.rs
 > solana-keygen new -o program_address.json
 
 # Build and deploy the receiver program

+ 1 - 1
target_chains/solana/cli/Cargo.toml

@@ -17,7 +17,7 @@ solana-sdk = "1.16.20"
 solana-client = "1.16.20"
 anchor-client = "0.28.0"
 clap = {version ="3.2.22", features = ["derive"]}
-pyth-solana-receiver = {path = "../programs/pyth_solana_receiver" }
+pyth-solana-receiver = {path = "../programs/pyth-solana-receiver" }
 wormhole-core = { git = "https://github.com/guibescos/wormhole", branch = "reisen/sdk-solana"}
 wormhole-solana = { git = "https://github.com/guibescos/wormhole", branch = "reisen/sdk-solana"}
 pythnet-sdk = { git = "https://github.com/pyth-network/pyth-crosschain", version = "2.0.0", features = ["strum"] }

+ 7 - 0
target_chains/solana/cli/src/cli.rs

@@ -26,5 +26,12 @@ pub enum Action {
             help = "Keypair of the payer of transactions"
         )]
         keypair: String,
+        #[clap(
+            short = 'u',
+            long,
+            default_value = "http://localhost:8899",
+            help = "RPC endpoint of the solana"
+        )]
+        url:     String,
     },
 }

+ 95 - 86
target_chains/solana/cli/src/main.rs

@@ -67,15 +67,6 @@ use {
     },
 };
 
-cfg_if::cfg_if! {
-    if #[cfg(feature = "mainnet")] {
-        fn rpc_endpoint() -> &'static str { "https://api.mainnet-beta.solana.com" }
-    } else if #[cfg(feature = "devnet")] {
-        fn rpc_endpoint() -> &'static str { "https://api.devnet.solana.com"}
-    } else {
-        fn rpc_endpoint() -> &'static str { "http://localhost:8899" }
-    }
-}
 fn main() -> Result<()> {
     let cli = Cli::parse();
 
@@ -83,9 +74,10 @@ fn main() -> Result<()> {
         Action::PostAndReceiveVAA {
             vaa: accumulator_update_data_str,
             keypair,
+            url,
         } => {
             let wormhole = wormhole_anchor_sdk::wormhole::program::id();
-            let rpc_client = RpcClient::new(rpc_endpoint());
+            let rpc_client = RpcClient::new(url);
 
             println!("[1/5] Decode the AccumulatorUpdateData");
             let accumulator_update_data_bytes: Vec<u8> =
@@ -95,6 +87,10 @@ fn main() -> Result<()> {
 
             match &accumulator_update_data.proof {
                 Proof::WormholeMerkle { vaa, updates } => {
+                    let parsed_vaa: Vaa<&RawMessage> =
+                        serde_wormhole::from_slice(vaa.as_ref()).unwrap();
+                    let (_, body): (Header, Body<&RawMessage>) = parsed_vaa.into();
+
                     println!("[2/5] Get wormhole guardian set configuration");
                     let wormhole_config = WormholeConfig::key(&wormhole, ());
 
@@ -113,92 +109,105 @@ fn main() -> Result<()> {
                     let guardian_set_data =
                         GuardianSet::try_from_slice(&rpc_client.get_account_data(&guardian_set)?)?;
 
-                    println!("[3/5] Invoke wormhole on solana to verify the signatures on the VAA");
                     let payer = read_keypair_file(&*shellexpand::tilde(&keypair))
                         .expect("Keypair not found");
-                    let signature_set_keypair = Keypair::new();
-                    println!("signature_set_pubkey: {}", signature_set_keypair.pubkey());
-                    let verify_txs = verify_signatures_txs(
-                        vaa.as_ref(),
-                        WormholeSolanaGuardianSet {
-                            index:           guardian_set_data.index,
-                            keys:            guardian_set_data.keys,
-                            creation_time:   guardian_set_data.creation_time,
-                            expiration_time: guardian_set_data.expiration_time,
-                        },
-                        wormhole,
-                        payer.pubkey(),
-                        wormhole_config_data.guardian_set_index,
-                        signature_set_keypair.pubkey(),
-                    )?;
 
-                    for tx in verify_txs {
-                        process_transaction(
-                            &rpc_client,
-                            tx,
-                            &vec![&payer, &signature_set_keypair],
-                        )?;
-                    }
+                    let vaa_hash = body.digest().unwrap().hash;
+                    let vaa_pubkey = WormholeSolanaVAA::key(&wormhole, vaa_hash);
+                    let vaa_account = match rpc_client.get_account_data(&vaa_pubkey) {
+                        Ok(account_data) => {
+                            println!("[3/5] VAA already posted on solana. Skipping verifying signatures step");
+                            println!("[4/5] VAA already posted on solana. Skipping posting the VAA data onto a solana account using pyth-solana-receiver::PostAccumulatorUpdateVaa");
+                            Some(account_data)
+                        }
+                        Err(_) => {
+                            println!("[3/5] Invoke wormhole on solana to verify the signatures on the VAA");
+                            let signature_set_keypair = Keypair::new();
+                            println!("signature_set_pubkey: {}", signature_set_keypair.pubkey());
 
-                    println!("[4/5] Post the VAA data onto a solana account using pyth_solana_receiver::PostAccumulatorUpdateVaa");
+                            let verify_txs = verify_signatures_txs(
+                                vaa.as_ref(),
+                                WormholeSolanaGuardianSet {
+                                    index:           guardian_set_data.index,
+                                    keys:            guardian_set_data.keys,
+                                    creation_time:   guardian_set_data.creation_time,
+                                    expiration_time: guardian_set_data.expiration_time,
+                                },
+                                wormhole,
+                                payer.pubkey(),
+                                wormhole_config_data.guardian_set_index,
+                                signature_set_keypair.pubkey(),
+                            )?;
 
-                    let mut accumulator_update_data_vaa_only = accumulator_update_data.clone();
-                    accumulator_update_data_vaa_only.proof =
-                        match accumulator_update_data_vaa_only.proof {
-                            Proof::WormholeMerkle { vaa, updates: _ } => Proof::WormholeMerkle {
-                                vaa,
-                                updates: vec![],
-                            },
-                        };
-                    let mut accumulator_update_data_only_vaa_bytes = Vec::new();
-                    let mut cursor =
-                        std::io::Cursor::new(&mut accumulator_update_data_only_vaa_bytes);
-                    let mut serializer: Serializer<_, byteorder::BE> = Serializer::new(&mut cursor);
-                    accumulator_update_data_vaa_only
-                        .serialize(&mut serializer)
-                        .unwrap();
-                    let parsed_vaa: Vaa<&RawMessage> =
-                        serde_wormhole::from_slice(vaa.as_ref()).unwrap();
-                    let (_, body): (Header, Body<&RawMessage>) = parsed_vaa.into();
+                            for tx in verify_txs {
+                                process_transaction(
+                                    &rpc_client,
+                                    tx,
+                                    &vec![&payer, &signature_set_keypair],
+                                )?;
+                            }
 
-                    let vaa_hash = body.digest().unwrap().hash;
-                    let vaa_pubkey = WormholeSolanaVAA::key(&wormhole, vaa_hash);
+                            println!("[4/5] Post the VAA data onto a solana account using pyth-solana-receiver::PostAccumulatorUpdateVaa");
 
-                    let post_acc_update_data_vaa_accounts =
-                        pyth_solana_receiver::accounts::PostAccUpdateDataVaa {
-                            guardian_set,
-                            bridge_config: wormhole_config,
-                            signature_set: signature_set_keypair.pubkey(),
-                            vaa: vaa_pubkey,
-                            payer: payer.pubkey(),
-                            rent: Rent::id(),
-                            clock: Clock::id(),
-                            system_program: system_program::ID,
-                            wormhole_program: wormhole,
-                        }
-                        .to_account_metas(None);
-                    let post_acc_update_data_vaa_ix_data =
-                        pyth_solana_receiver::instruction::PostAccumulatorUpdateVaa {
-                            data: accumulator_update_data_only_vaa_bytes,
-                        }
-                        .data();
-                    let post_acc_update_data_vaa_ix = Instruction::new_with_bytes(
-                        pyth_solana_receiver::ID,
-                        &post_acc_update_data_vaa_ix_data,
-                        post_acc_update_data_vaa_accounts,
-                    );
-                    println!("Sending txn with PostAccumulatorUpdateVaa ix");
+                            let mut accumulator_update_data_vaa_only =
+                                accumulator_update_data.clone();
+                            accumulator_update_data_vaa_only.proof =
+                                match accumulator_update_data_vaa_only.proof {
+                                    Proof::WormholeMerkle { vaa, updates: _ } => {
+                                        Proof::WormholeMerkle {
+                                            vaa,
+                                            updates: vec![],
+                                        }
+                                    }
+                                };
+                            let mut accumulator_update_data_only_vaa_bytes = Vec::new();
+                            let mut cursor =
+                                std::io::Cursor::new(&mut accumulator_update_data_only_vaa_bytes);
+                            let mut serializer: Serializer<_, byteorder::BE> =
+                                Serializer::new(&mut cursor);
+                            accumulator_update_data_vaa_only
+                                .serialize(&mut serializer)
+                                .unwrap();
 
-                    process_transaction(
-                        &rpc_client,
-                        vec![post_acc_update_data_vaa_ix],
-                        &vec![&payer],
-                    )?;
+                            let post_acc_update_data_vaa_accounts =
+                                pyth_solana_receiver::accounts::PostAccUpdateDataVaa {
+                                    guardian_set,
+                                    bridge_config: wormhole_config,
+                                    signature_set: signature_set_keypair.pubkey(),
+                                    vaa: vaa_pubkey,
+                                    payer: payer.pubkey(),
+                                    rent: Rent::id(),
+                                    clock: Clock::id(),
+                                    system_program: system_program::ID,
+                                    wormhole_program: wormhole,
+                                }
+                                .to_account_metas(None);
+                            let post_acc_update_data_vaa_ix_data =
+                                pyth_solana_receiver::instruction::PostAccumulatorUpdateVaa {
+                                    data: accumulator_update_data_only_vaa_bytes,
+                                }
+                                .data();
+                            let post_acc_update_data_vaa_ix = Instruction::new_with_bytes(
+                                pyth_solana_receiver::ID,
+                                &post_acc_update_data_vaa_ix_data,
+                                post_acc_update_data_vaa_accounts,
+                            );
+                            println!("Sending txn with PostAccumulatorUpdateVaa ix");
+
+                            process_transaction(
+                                &rpc_client,
+                                vec![post_acc_update_data_vaa_ix],
+                                &vec![&payer],
+                            )?;
+
+                            rpc_client.get_account_data(&vaa_pubkey).ok()
+                        }
+                    };
 
                     println!("Verifying updates using PostedVAA account");
 
-                    let vaa_account = rpc_client.get_account_data(&vaa_pubkey)?;
-                    let posted_vaa_data = AnchorVaa::try_deserialize(&mut vaa_account.as_slice())?;
+                    let posted_vaa_data =
+                        AnchorVaa::try_deserialize(&mut vaa_account.unwrap().as_slice())?;
                     let wormhole_message =
                         WormholeMessage::try_from_bytes(&posted_vaa_data.payload)?;
                     println!("wormhole_message: {wormhole_message:?}");
@@ -218,7 +227,7 @@ fn main() -> Result<()> {
                     }
                     println!("verified {verify_count}/{} updates", updates.len());
 
-                    println!("[5/5] Post updates from AccumulatorUpdateData and use the PostedVAA on solana using pyth_solana_receiver::PostUpdates");
+                    println!("[5/5] Post updates from AccumulatorUpdateData and use the PostedVAA on solana using pyth-solana-receiver::PostUpdates");
                     // TODO need to figure out max number of updates that can be sent in 1 txn
 
                     // update_bytes_len: 288 (1 price feed)

+ 0 - 0
target_chains/solana/programs/pyth_solana_receiver/Cargo.toml → target_chains/solana/programs/pyth-solana-receiver/Cargo.toml


+ 0 - 0
target_chains/solana/programs/pyth_solana_receiver/Xargo.toml → target_chains/solana/programs/pyth-solana-receiver/Xargo.toml


+ 1 - 1
target_chains/solana/programs/pyth_solana_receiver/src/error.rs → target_chains/solana/programs/pyth-solana-receiver/src/error.rs

@@ -3,7 +3,7 @@ use anchor_lang::prelude::*;
 #[error_code]
 pub enum ReceiverError {
     #[msg("The emitter of the VAA is not Solana or Pythnet.")]
-    EmitterChainNotSolanaOrPythnet,
+    InvalidEmitterChain,
     #[msg("The posted VAA has wrong magic number.")]
     PostedVaaHeaderWrongMagicNumber,
     #[msg("An error occured when deserializing the VAA.")]

+ 2 - 94
target_chains/solana/programs/pyth_solana_receiver/src/lib.rs → target_chains/solana/programs/pyth-solana-receiver/src/lib.rs

@@ -1,7 +1,6 @@
 pub mod error;
 pub mod state;
 
-// official wormhole sdk
 use {
     crate::error::ReceiverError,
     anchor_lang::{
@@ -11,8 +10,6 @@ use {
             sysvar::SysvarId,
         },
     },
-    hex::ToHex,
-    pyth_wormhole_attester_sdk::BatchPriceAttestation,
     pythnet_sdk::{
         accumulators::merkle::MerkleRoot,
         hashers::keccak256_160::Keccak160,
@@ -28,16 +25,11 @@ use {
     },
     serde::Deserialize,
     sha3::Digest,
-    solana_program::{
-        keccak,
-        secp256k1_recover::secp256k1_recover,
-    },
     state::AnchorVaa,
     std::io::Write,
     wormhole::Chain::{
         self,
         Pythnet,
-        Solana,
     },
     wormhole_anchor_sdk::{
         wormhole as wormhole_anchor,
@@ -59,71 +51,12 @@ pub mod pyth_solana_receiver {
         },
         serde_wormhole::RawMessage,
         solana_program::program::invoke,
-        std::hash::Hash,
         wormhole_sdk::vaa::{
             Body,
             Header,
         },
     };
 
-    pub fn decode_posted_vaa(ctx: Context<DecodePostedVaa>) -> Result<()> {
-        let posted_vaa = &ctx.accounts.posted_vaa.payload;
-        let batch: BatchPriceAttestation =
-            BatchPriceAttestation::deserialize(posted_vaa.as_slice())
-                .map_err(|_| ReceiverError::DeserializeVAAFailed)?;
-
-        msg!(
-            "There are {} attestations in this batch.",
-            batch.price_attestations.len()
-        );
-
-        for attestation in batch.price_attestations {
-            msg!("product_id: {}", attestation.product_id);
-            msg!("price_id: {}", attestation.price_id);
-            msg!("price: {}", attestation.price);
-            msg!("conf: {}", attestation.conf);
-            msg!("ema_price: {}", attestation.ema_price);
-            msg!("ema_conf: {}", attestation.ema_conf);
-            msg!("num_publishers: {}", attestation.num_publishers);
-            msg!("publish_time: {}", attestation.publish_time);
-            msg!("attestation_time: {}", attestation.attestation_time);
-        }
-
-        Ok(())
-    }
-
-    pub fn update(
-        _ctx: Context<Update>,
-        data: Vec<u8>,
-        recovery_id: u8,
-        signature: [u8; 64],
-    ) -> Result<()> {
-        // This costs about 10k compute units
-        let message_hash = {
-            let mut hasher = keccak::Hasher::default();
-            hasher.hash(&data);
-            hasher.result()
-        };
-
-        // This costs about 25k compute units
-        let recovered_pubkey = secp256k1_recover(&message_hash.0, recovery_id, &signature)
-            .map_err(|_| ProgramError::InvalidArgument)?;
-
-        msg!(
-            "Recovered key: {}",
-            recovered_pubkey.0.encode_hex::<String>()
-        );
-
-        // TODO: Check the pubkey is an expected value.
-        // Here we are checking the secp256k1 pubkey against a known authorized pubkey.
-        //
-        // if recovered_pubkey.0 != AUTHORIZED_PUBLIC_KEY {
-        //  return Err(ProgramError::InvalidArgument);
-        // }
-
-        Ok(())
-    }
-
     /// Verifies the accumulator update data header then invokes a CPI call to wormhole::postVAA
     ///
     /// * `data` - Bytes of the AccumulatorUpdateData response from hermes with the updates omitted
@@ -178,7 +111,7 @@ pub mod pyth_solana_receiver {
         vaa_hash: [u8; 32], // used for pda seeds
         price_updates: Vec<Vec<u8>>,
     ) -> Result<()> {
-        let vaa = &ctx.accounts.posted_vaa; // let posted_vaa_data = PostedVaaData::try_deserialize_unchecked(&mut &**vaa.try_borrow_data()?)?;
+        let vaa = &ctx.accounts.posted_vaa;
         let wh_message = WormholeMessage::try_from_bytes(vaa.payload.as_slice())
             .map_err(|_| ReceiverError::InvalidWormholeMessage)?;
         msg!("constructed wh_message {:?}", wh_message);
@@ -217,38 +150,13 @@ pub mod pyth_solana_receiver {
     }
 }
 
-#[derive(Accounts)]
-pub struct DecodePostedVaa<'info> {
-    #[account(mut)]
-    pub payer:      Signer<'info>,
-    #[account(
-        constraint = (Chain::from(posted_vaa.emitter_chain()) == Solana || Chain::from(posted_vaa.emitter_chain()) == Pythnet) @ ReceiverError::EmitterChainNotSolanaOrPythnet,
-    )]
-    pub posted_vaa: Account<'info, AnchorVaa>,
-}
-
-impl crate::accounts::DecodePostedVaa {
-    pub fn populate(payer: &Pubkey, posted_vaa: &Pubkey) -> Self {
-        crate::accounts::DecodePostedVaa {
-            payer:      *payer,
-            posted_vaa: *posted_vaa,
-        }
-    }
-}
-
-#[derive(Accounts)]
-pub struct Update<'info> {
-    #[account(mut)]
-    pub payer: Signer<'info>,
-}
-
 #[derive(Accounts)]
 #[instruction(vaa_hash: [u8; 32])]
 pub struct PostUpdates<'info> {
     #[account(mut)]
     pub payer:      Signer<'info>,
     #[account(
-        constraint = Chain::from(posted_vaa.emitter_chain()) == Pythnet @ ReceiverError::EmitterChainNotSolanaOrPythnet,
+        constraint = Chain::from(posted_vaa.emitter_chain()) == Pythnet @ ReceiverError::InvalidEmitterChain,
         seeds = [
             SEED_PREFIX_POSTED_VAA,
             &vaa_hash

+ 0 - 0
target_chains/solana/programs/pyth_solana_receiver/src/state.rs → target_chains/solana/programs/pyth-solana-receiver/src/state.rs


+ 0 - 2
target_chains/solana/programs/pyth_solana_receiver/tests/cases/mod.rs → target_chains/solana/programs/pyth-solana-receiver/tests/cases/mod.rs

@@ -1,3 +1 @@
 pub use super::program_test::*;
-
-mod test_update_price;

+ 0 - 0
target_chains/solana/programs/pyth_solana_receiver/tests/program_test/mod.rs → target_chains/solana/programs/pyth-solana-receiver/tests/program_test/mod.rs


+ 0 - 0
target_chains/solana/programs/pyth_solana_receiver/tests/test_all.rs → target_chains/solana/programs/pyth-solana-receiver/tests/test_all.rs


+ 0 - 51
target_chains/solana/programs/pyth_solana_receiver/tests/cases/test_update_price.rs

@@ -1,51 +0,0 @@
-use {
-    crate::program_test::ProgramSimulator,
-    anchor_lang::{
-        prelude::*,
-        InstructionData,
-        ToAccountMetas,
-    },
-    pyth_solana_receiver::{
-        accounts as receiver_accounts,
-        instruction as receiver_instruction,
-    },
-    rand::rngs::OsRng,
-    solana_program::instruction::Instruction,
-    solana_sdk::{
-        keccak,
-        signature::Signer,
-    },
-};
-
-#[tokio::test]
-async fn test_update_price() {
-    let mut sim = ProgramSimulator::new().await;
-
-    let message = b"hello world";
-    let message_hash = {
-        let mut hasher = keccak::Hasher::default();
-        hasher.hash(message);
-        hasher.result()
-    };
-
-    let secp256k1_secret_key = libsecp256k1::SecretKey::random(&mut OsRng);
-    let secp_message = libsecp256k1::Message::parse(&message_hash.0);
-    let (signature, recovery_id) = libsecp256k1::sign(&secp_message, &secp256k1_secret_key);
-
-    let accounts = receiver_accounts::Update {
-        payer: sim.genesis_keypair.pubkey(),
-    }
-    .to_account_metas(None);
-    let instruction_data = receiver_instruction::Update {
-        data:        message.to_vec(),
-        recovery_id: recovery_id.serialize(),
-        signature:   signature.serialize(),
-    }
-    .data();
-
-    let inst = Instruction::new_with_bytes(sim.program_id, &instruction_data, accounts);
-
-    sim.process_ix(inst, &vec![], &sim.genesis_keypair.insecure_clone())
-        .await
-        .unwrap();
-}