Skip to main content

wormhole_solana_consts/
lib.rs

1/// Wormhole Chain ID identifying Solana's network. This ID is shared between Solana mainnet and
2/// devnet.
3pub const SOLANA_CHAIN: u16 = 1;
4
5pub const WRAPPED_MINT_MAX_DECIMALS: u8 = 8;
6
7use solana_program::{pubkey, pubkey::Pubkey};
8
9cfg_if::cfg_if! {
10    if #[cfg(feature = "mainnet")] {
11        /// Core Bridge program ID on Solana mainnet.
12        pub const CORE_BRIDGE_PROGRAM_ID: Pubkey = pubkey!("worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth");
13        pub const CORE_BRIDGE_FEE_COLLECTOR: Pubkey = pubkey!("9bFNrXNb2WTx8fMHXCheaZqkLZ3YCCaiqTftHxeintHy");
14        pub const CORE_BRIDGE_CONFIG: Pubkey = pubkey!("2yVjuQwpsvdsrywzsJJVs9Ueh4zayyo5DYJbBNc3DDpn");
15
16        /// Token Bridge program ID on Solana mainnet.
17        pub const TOKEN_BRIDGE_PROGRAM_ID: Pubkey = pubkey!("wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb");
18        pub const TOKEN_BRIDGE_EMITTER_AUTHORITY: Pubkey = pubkey!("Gv1KWf8DT1jKv5pKBmGaTmVszqa56Xn8YGx2Pg7i7qAk");
19        pub const TOKEN_BRIDGE_CUSTODY_AUTHORITY: Pubkey = pubkey!("GugU1tP7doLeTw9hQP51xRJyS8Da1fWxuiy2rVrnMD2m");
20        pub const TOKEN_BRIDGE_MINT_AUTHORITY: Pubkey = pubkey!("BCD75RNBHrJJpW4dXVagL5mPjzRLnVZq4YirJdjEYMV7");
21        pub const TOKEN_BRIDGE_TRANSFER_AUTHORITY: Pubkey = pubkey!("7oPa2PHQdZmjSPqvpZN7MQxnC7Dcf3uL4oLqknGLk2S3");
22
23        /// USDC mint address found on Solana mainnet.
24        pub const USDC_MINT: Pubkey = pubkey!("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
25    } else if #[cfg(feature = "testnet")] {
26        /// Core Bridge program ID on Solana devnet.
27        pub const CORE_BRIDGE_PROGRAM_ID: Pubkey = pubkey!("3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5");
28        pub const CORE_BRIDGE_FEE_COLLECTOR: Pubkey = pubkey!("7s3a1ycs16d6SNDumaRtjcoyMaTDZPavzgsmS3uUZYWX");
29        pub const CORE_BRIDGE_CONFIG: Pubkey = pubkey!("6bi4JGDoRwUs9TYBuvoA7dUVyikTJDrJsJU1ew6KVLiu");
30
31        /// Token Bridge program ID on Solana devnet.
32        pub const TOKEN_BRIDGE_PROGRAM_ID: Pubkey = pubkey!("DZnkkTmCiFWfYTfT41X3Rd1kDgozqzxWaHqsw6W4x2oe");
33        pub const TOKEN_BRIDGE_EMITTER_AUTHORITY: Pubkey = pubkey!("4yttKWzRoNYS2HekxDfcZYmfQqnVWpKiJ8eydYRuFRgs");
34        pub const TOKEN_BRIDGE_CUSTODY_AUTHORITY: Pubkey = pubkey!("H9pUTqZoRyFdaedRezhykA1aTMq7vbqRHYVhpHZK2QbC");
35        pub const TOKEN_BRIDGE_MINT_AUTHORITY: Pubkey = pubkey!("rRsXLHe7sBHdyKU3KY3wbcgWvoT1Ntqudf6e9PKusgb");
36        pub const TOKEN_BRIDGE_TRANSFER_AUTHORITY: Pubkey = pubkey!("3VFdJkFuzrcwCwdxhKRETGxrDtUVAipNmYcLvRBDcQeH");
37
38        /// USDC mint address found on Solana devnet.
39        pub const USDC_MINT: Pubkey = pubkey!("4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU");
40    } else if #[cfg(feature = "localnet")] {
41        /// Core Bridge program ID on Wormhole's Tilt (dev) network.
42        pub const CORE_BRIDGE_PROGRAM_ID: Pubkey = pubkey!("Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o");
43        pub const CORE_BRIDGE_FEE_COLLECTOR: Pubkey = pubkey!("GXBsgBD3LDn3vkRZF6TfY5RqgajVZ4W5bMAdiAaaUARs");
44        pub const CORE_BRIDGE_CONFIG: Pubkey = pubkey!("FKoMTctsC7vJbEqyRiiPskPnuQx2tX1kurmvWByq5uZP");
45
46        /// Token Bridge program ID on Wormhole's Tilt (dev) network.
47        pub const TOKEN_BRIDGE_PROGRAM_ID: Pubkey = pubkey!("B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE");
48        pub const TOKEN_BRIDGE_EMITTER_AUTHORITY: Pubkey = pubkey!("ENG1wQ7CQKH8ibAJ1hSLmJgL9Ucg6DRDbj752ZAfidLA");
49        pub const TOKEN_BRIDGE_CUSTODY_AUTHORITY: Pubkey = pubkey!("JCQ1JdJ3vgnvurNAqMvpwaiSwJXaoMFJN53F6sRKejxQ");
50        pub const TOKEN_BRIDGE_MINT_AUTHORITY: Pubkey = pubkey!("8P2wAnHr2t4pAVEyJftzz7k6wuCE7aP1VugNwehzCJJY");
51        pub const TOKEN_BRIDGE_TRANSFER_AUTHORITY: Pubkey = pubkey!("C1AVBd8PpfHGe1zW42XXVbHsAQf6q5khiRKuGPLbwHkh");
52
53        /// USDC mint address found on Solana devnet.
54        ///
55        /// NOTE: We expect an integrator to load this account by pulling it from Solana devnet.
56        pub const USDC_MINT: Pubkey = pubkey!("4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU");
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use std::str::FromStr;
63
64    use super::*;
65
66    #[test]
67    fn core_bridge_id() {
68        cfg_if::cfg_if! {
69            if #[cfg(feature = "mainnet")] {
70                let expected = "worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth";
71            } else if #[cfg(feature = "testnet")] {
72                let expected = "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5";
73            } else if #[cfg(feature = "localnet")] {
74                let expected = "Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o";
75            }
76        }
77
78        assert_eq!(CORE_BRIDGE_PROGRAM_ID, Pubkey::from_str(expected).unwrap());
79    }
80
81    #[test]
82    fn token_bridge_id() {
83        cfg_if::cfg_if! {
84            if #[cfg(feature = "mainnet")] {
85                let expected = "wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb";
86            } else if #[cfg(feature = "testnet")] {
87                let expected = "DZnkkTmCiFWfYTfT41X3Rd1kDgozqzxWaHqsw6W4x2oe";
88            } else if #[cfg(feature = "localnet")] {
89                let expected = "B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE";
90            }
91        }
92
93        assert_eq!(TOKEN_BRIDGE_PROGRAM_ID, Pubkey::from_str(expected).unwrap());
94    }
95
96    #[test]
97    fn core_bridge_fee_collector() {
98        let (expected, _) =
99            Pubkey::find_program_address(&[b"fee_collector"], &CORE_BRIDGE_PROGRAM_ID);
100        assert_eq!(CORE_BRIDGE_FEE_COLLECTOR, expected);
101    }
102
103    #[test]
104    fn core_bridge_config() {
105        let (expected, _) = Pubkey::find_program_address(&[b"Bridge"], &CORE_BRIDGE_PROGRAM_ID);
106        assert_eq!(CORE_BRIDGE_CONFIG, expected);
107    }
108
109    #[test]
110    fn token_bridge_emitter_authority() {
111        let (expected, _) = Pubkey::find_program_address(&[b"emitter"], &TOKEN_BRIDGE_PROGRAM_ID);
112        assert_eq!(TOKEN_BRIDGE_EMITTER_AUTHORITY, expected);
113    }
114
115    #[test]
116    fn token_bridge_custody_authority() {
117        let (expected, _) =
118            Pubkey::find_program_address(&[b"custody_signer"], &TOKEN_BRIDGE_PROGRAM_ID);
119        assert_eq!(TOKEN_BRIDGE_CUSTODY_AUTHORITY, expected);
120    }
121
122    #[test]
123    fn token_bridge_mint_authority() {
124        let (expected, _) =
125            Pubkey::find_program_address(&[b"mint_signer"], &TOKEN_BRIDGE_PROGRAM_ID);
126        assert_eq!(TOKEN_BRIDGE_MINT_AUTHORITY, expected);
127    }
128
129    #[test]
130    fn token_bridge_transfer_authority() {
131        let (expected, _) =
132            Pubkey::find_program_address(&[b"authority_signer"], &TOKEN_BRIDGE_PROGRAM_ID);
133        assert_eq!(TOKEN_BRIDGE_TRANSFER_AUTHORITY, expected);
134    }
135}