Files
sol-trade-sdk/src/constants/swqos.rs
T

523 lines
25 KiB
Rust
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
use solana_program::pubkey;
use solana_sdk::pubkey::Pubkey;
pub const JITO_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5"),
pubkey!("HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe"),
pubkey!("Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY"),
pubkey!("ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49"),
pubkey!("DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh"),
pubkey!("ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt"),
pubkey!("DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL"),
pubkey!("3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT"),
];
/// Helius Sender tip accounts (fee recipient addresses).
pub const HELIUS_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("4ACfpUFoaSD9bfPdeu6DBt89gB6ENTeHBXCAi87NhDEE"),
pubkey!("D2L6yPZ2FmmmTKPgzaMKdhu6EWZcTpLy1Vhx8uvZe7NZ"),
pubkey!("9bnz4RShgq1hAnLnZbP8kbgBg1kEmcJBYQq3gQbmnSta"),
pubkey!("5VY91ws6B2hMmBFRsXkoAAdsPHBJwRfBht4DXox3xkwn"),
pubkey!("2nyhqdwKcJZR2vcqCyrYsaPVdAnFoJjiksCXJ7hfEYgD"),
pubkey!("2q5pghRs6arqVjRvT5gfgWfWcHWmw1ZuCzphgd5KfWGJ"),
pubkey!("wyvPkWjVZz1M8fHQnMMCDTQDbkManefNNhweYk5WkcF"),
pubkey!("3KCKozbAaF75qEU33jtzozcJ29yJuaLJTy2jFdzUY8bT"),
pubkey!("4vieeGHPYPG2MmyPRcYjdiDmmhN3ww7hsFNap8pVN3Ey"),
pubkey!("4TQLFNWK8AovT1gFvda5jfw2oJeRMKEmw7aH6MGBJ3or"),
];
pub const NEXTBLOCK_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("NextbLoCkVtMGcV47JzewQdvBpLqT9TxQFozQkN98pE"),
pubkey!("NexTbLoCkWykbLuB1NkjXgFWkX9oAtcoagQegygXXA2"),
pubkey!("NeXTBLoCKs9F1y5PJS9CKrFNNLU1keHW71rfh7KgA1X"),
pubkey!("NexTBLockJYZ7QD7p2byrUa6df8ndV2WSd8GkbWqfbb"),
pubkey!("neXtBLock1LeC67jYd1QdAa32kbVeubsfPNTJC1V5At"),
pubkey!("nEXTBLockYgngeRmRrjDV31mGSekVPqZoMGhQEZtPVG"),
pubkey!("NEXTbLoCkB51HpLBLojQfpyVAMorm3zzKg7w9NFdqid"),
pubkey!("nextBLoCkPMgmG8ZgJtABeScP35qLa2AMCNKntAP7Xc"),
];
pub const ZEROSLOT_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("Eb2KpSC8uMt9GmzyAEm5Eb1AAAgTjRaXWFjKyFXHZxF3"),
pubkey!("FCjUJZ1qozm1e8romw216qyfQMaaWKxWsuySnumVCCNe"),
pubkey!("ENxTEjSQ1YabmUpXAdCgevnHQ9MHdLv8tzFiuiYJqa13"),
pubkey!("6rYLG55Q9RpsPGvqdPNJs4z5WTxJVatMB8zV3WJhs5EK"),
pubkey!("Cix2bHfqPcKcM233mzxbLk14kSggUUiz2A87fJtGivXr"),
];
pub const NOZOMI_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("TEMPaMeCRFAS9EKF53Jd6KpHxgL47uWLcpFArU1Fanq"),
pubkey!("noz3jAjPiHuBPqiSPkkugaJDkJscPuRhYnSpbi8UvC4"),
pubkey!("noz3str9KXfpKknefHji8L1mPgimezaiUyCHYMDv1GE"),
pubkey!("noz6uoYCDijhu1V7cutCpwxNiSovEwLdRHPwmgCGDNo"),
pubkey!("noz9EPNcT7WH6Sou3sr3GGjHQYVkN3DNirpbvDkv9YJ"),
pubkey!("nozc5yT15LazbLTFVZzoNZCwjh3yUtW86LoUyqsBu4L"),
pubkey!("nozFrhfnNGoyqwVuwPAW4aaGqempx4PU6g6D9CJMv7Z"),
pubkey!("nozievPk7HyK1Rqy1MPJwVQ7qQg2QoJGyP71oeDwbsu"),
pubkey!("noznbgwYnBLDHu8wcQVCEw6kDrXkPdKkydGJGNXGvL7"),
pubkey!("nozNVWs5N8mgzuD3qigrCG2UoKxZttxzZ85pvAQVrbP"),
pubkey!("nozpEGbwx4BcGp6pvEdAh1JoC2CQGZdU6HbNP1v2p6P"),
pubkey!("nozrhjhkCr3zXT3BiT4WCodYCUFeQvcdUkM7MqhKqge"),
pubkey!("nozrwQtWhEdrA6W8dkbt9gnUaMs52PdAv5byipnadq3"),
pubkey!("nozUacTVWub3cL4mJmGCYjKZTnE9RbdY5AP46iQgbPJ"),
pubkey!("nozWCyTPppJjRuw2fpzDhhWbW355fzosWSzrrMYB1Qk"),
pubkey!("nozWNju6dY353eMkMqURqwQEoM3SFgEKC6psLCSfUne"),
pubkey!("nozxNBgWohjR75vdspfxR5H9ceC7XXH99xpxhVGt3Bb"),
];
pub const BLOX_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("HWEoBxYs7ssKuudEjzjmpfJVX7Dvi7wescFsVx2L5yoY"),
pubkey!("95cfoy472fcQHaw4tPGBTKpn6ZQnfEPfBgDQx6gcRmRg"),
pubkey!("3UQUKjhMKaY2S6bjcQD6yHB7utcZt5bfarRCmctpRtUd"),
pubkey!("FogxVNs6Mm2w9rnGL1vkARSwJxvLE8mujTv3LK8RnUhF"),
];
pub const NODE1_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("node1PqAa3BWWzUnTHVbw8NJHC874zn9ngAkXjgWEej"),
pubkey!("node1UzzTxAAeBTpfZkQPJXBAqixsbdth11ba1NXLBG"),
pubkey!("node1Qm1bV4fwYnCurP8otJ9s5yrkPq7SPZ5uhj3Tsv"),
pubkey!("node1PUber6SFmSQgvf2ECmXsHP5o3boRSGhvJyPMX1"),
pubkey!("node1AyMbeqiVN6eoQzEAwCA6Pk826hrdqdAHR7cdJ3"),
pubkey!("node1YtWCoTwwVYTFLfS19zquRQzYX332hs1HEuRBjC"),
];
pub const FLASHBLOCK_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("FLaShB3iXXTWE1vu9wQsChUKq3HFtpMAhb8kAh1pf1wi"),
pubkey!("FLashhsorBmM9dLpuq6qATawcpqk1Y2aqaZfkd48iT3W"),
pubkey!("FLaSHJNm5dWYzEgnHJWWJP5ccu128Mu61NJLxUf7mUXU"),
pubkey!("FLaSHR4Vv7sttd6TyDF4yR1bJyAxRwWKbohDytEMu3wL"),
pubkey!("FLASHRzANfcAKDuQ3RXv9hbkBy4WVEKDzoAgxJ56DiE4"),
pubkey!("FLasHstqx11M8W56zrSEqkCyhMCCpr6ze6Mjdvqope5s"),
pubkey!("FLAShWTjcweNT4NSotpjpxAkwxUr2we3eXQGhpTVzRwy"),
pubkey!("FLasHXTqrbNvpWFB6grN47HGZfK6pze9HLNTgbukfPSk"),
pubkey!("FLAshyAyBcKb39KPxSzXcepiS8iDYUhDGwJcJDPX4g2B"),
pubkey!("FLAsHZTRcf3Dy1APaz6j74ebdMC6Xx4g6i9YxjyrDybR"),
];
pub const BLOCKRAZOR_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("FjmZZrFvhnqqb9ThCuMVnENaM3JGVuGWNyCAxRJcFpg9"),
pubkey!("6No2i3aawzHsjtThw81iq1EXPJN6rh8eSJCLaYZfKDTG"),
pubkey!("A9cWowVAiHe9pJfKAj3TJiN9VpbzMUq6E4kEvf5mUT22"),
pubkey!("Gywj98ophM7GmkDdaWs4isqZnDdFCW7B46TXmKfvyqSm"),
pubkey!("68Pwb4jS7eZATjDfhmTXgRJjCiZmw1L7Huy4HNpnxJ3o"),
pubkey!("4ABhJh5rZPjv63RBJBuyWzBK3g9gWMUQdTZP2kiW31V9"),
pubkey!("B2M4NG5eyZp5SBQrSdtemzk5TqVuaWGQnowGaCBt8GyM"),
pubkey!("5jA59cXMKQqZAVdtopv8q3yyw9SYfiE3vUCbt7p8MfVf"),
pubkey!("5YktoWygr1Bp9wiS1xtMtUki1PeYuuzuCF98tqwYxf61"),
pubkey!("295Avbam4qGShBYK7E9H5Ldew4B3WyJGmgmXfiWdeeyV"),
pubkey!("EDi4rSy2LZgKJX74mbLTFk4mxoTgT6F7HxxzG2HBAFyK"),
pubkey!("BnGKHAC386n4Qmv9xtpBVbRaUTKixjBe3oagkPFKtoy6"),
pubkey!("Dd7K2Fp7AtoN8xCghKDRmyqr5U169t48Tw5fEd3wT9mq"),
pubkey!("AP6qExwrbRgBAVaehg4b5xHENX815sMabtBzUzVB4v8S"),
];
/// Astralane tip wallets. Extended with new addresses for improved routing and reduced write-lock contention (see portal.astralane.io/blockline).
pub const ASTRALANE_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("astrazznxsGUhWShqgNtAdfrzP2G83DzcWVJDxwV9bF"),
pubkey!("astra4uejePWneqNaJKuFFA8oonqCE1sqF6b45kDMZm"),
pubkey!("astra9xWY93QyfG6yM8zwsKsRodscjQ2uU2HKNL5prk"),
pubkey!("astraRVUuTHjpwEVvNBeQEgwYx9w9CFyfxjYoobCZhL"),
pubkey!("astraEJ2fEj8Xmy6KLG7B3VfbKfsHXhHrNdCQx7iGJK"),
pubkey!("astraubkDw81n4LuutzSQ8uzHCv4BhPVhfvTcYv8SKC"),
pubkey!("astraZW5GLFefxNPAatceHhYjfA1ciq9gvfEg2S47xk"),
pubkey!("astrawVNP4xDBKT7rAdxrLYiTSTdqtUr63fSMduivXK"),
// New tip wallets (2025) for improved performance and reduced write-lock delays
pubkey!("AstrA1ejL4UeXC2SBP4cpeEmtcFPZVLxx3XGKXyCW6to"),
pubkey!("AsTra79FET4aCKWspPqeSFvjJNyp96SvAnrmyAxqg5b7"),
pubkey!("AstrABAu8CBTyuPXpV4eSCJ5fePEPnxN8NqBaPKQ9fHR"),
pubkey!("AsTRADtvb6tTmrsqULQ9Wji9PigDMjhfEMza6zkynEvV"),
pubkey!("AsTRAEoyMofR3vUPpf9k68Gsfb6ymTZttEtsAbv8Bk4d"),
pubkey!("AStrAJv2RN2hKCHxwUMtqmSxgdcNZbihCwc1mCSnG83W"),
pubkey!("Astran35aiQUF57XZsmkWMtNCtXGLzs8upfiqXxth2bz"),
pubkey!("AStRAnpi6kFrKypragExgeRoJ1QnKH7pbSjLAKQVWUum"),
pubkey!("ASTRaoF93eYt73TYvwtsv6fMWHWbGmMUZfVZPo3CRU9C"),
];
pub const STELLIUM_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("ste11JV3MLMM7x7EJUM2sXcJC1H7F4jBLnP9a9PG8PH"),
pubkey!("ste11MWPjXCRfQryCshzi86SGhuXjF4Lv6xMXD2AoSt"),
pubkey!("ste11p5x8tJ53H1NbNQsRBg1YNRd4GcVpxtDw8PBpmb"),
pubkey!("ste11p7e2KLYou5bwtt35H7BM6uMdo4pvioGjJXKFcN"),
pubkey!("ste11TMV68LMi1BguM4RQujtbNCZvf1sjsASpqgAvSX"),
];
// Lightspeed (Solana Vibe Station) tip accounts
pub const LIGHTSPEED_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("53PhM3UTdMQWu5t81wcd35AHGc5xpmHoRjem7GQPvXjA"),
pubkey!("9tYF5yPDC1NP8s6diiB3kAX6ZZnva9DM3iDwJkBRarBB"),
];
pub const SOYAS_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("soyas4s6L8KWZ8rsSk1mF3d1mQScoTGGAgjk98bF8nP"),
pubkey!("soyascXFW5wEEYiwfEmHy2pNwomqzvggJosGVD6TJdY"),
pubkey!("soyasDBdKjADwPz3xk82U3TNPRDKEWJj7wWLajNHZ1L"),
pubkey!("soyasE2abjBAynmHbGWgEwk4ctBy7JMTUCNrMbjcnyH"),
pubkey!("soyasi59njacMUPvo3TM5paHjeK8pYSdovXgFi32gRt"),
pubkey!("soyasQYhJxv8uZgWDxhg72td6piAf7XTkoyWHtSATEz"),
pubkey!("soyastP66xyYC8XADXZjdMM5BAVGD2YRvz8dwtLsqb8"),
pubkey!("soyasvdgUJWYcUCzDxpmjUnNjH7KamXLXTzLwFvdVPE"),
pubkey!("soyasvxAunisNxaoRxkKGjNir7KmbwYnr37JmefkX9G"),
pubkey!("soyas5doVFUwH8s5zK8gEvCL5KR5ogDmf52LsrJEZ9h"),
];
pub const SPEEDLANDING_TIP_ACCOUNTS: &[Pubkey] = &[
pubkey!("SpEEdz8S1KorkMZqjMUxfxrmWwofmp6ReNP2Nx6CUmq"),
pubkey!("SpeeDy3GJM4wcrQmk1itRFWgidvxX4rwjTLMv78wwjE"),
pubkey!("SPeEdva37vW8vRtqgYjprQs1g3965icfVN5Rt7SMAyh"),
pubkey!("speEdrSEpox5GUfHWcBc7tQjRuSfUin2yvB7qoYvvJh"),
pubkey!("SPeEDmkHkN3A2roSZf6aZyEMsmrGqTHKqwP51y2Y4rV"),
pubkey!("SpeedLdTJXh2RKpXEaP8JCxkWoUVXhtdPQ1EnxBJMxc"),
pubkey!("SpEediGKLbbXndSYTzwmz6Z3NDgHQLDcTDEvGFkSMH9"),
pubkey!("speede8xCcUq2Tiv1efXeTuE3k9TDNq8TnGKaKSc6J4"),
];
// `SwqosRegion` 与下列各 `SWQOS_ENDPOINTS_*` 下标严格对应(共 10 项):
// 0 NewYork, 1 Frankfurt, 2 Amsterdam, 3 Dublin, 4 SLC, 5 Tokyo, 6 Singapore, 7 London, 8 LosAngeles, 9 Default。
//
// **地理就近(用户语义)**:当某枚举区域没有该服务商**独立公布**的 PoP 时,在**该服务商已出现的端点集合内**,按真实地理位置选**大圆距离最近**的一项作为填充;行尾注释说明依据。
// **例外**`SwqosRegion::Default`(下标 9)不表示地球上的点,表中为全局 URL 或文档默认枢纽,**不适用**地理就近,仅表示「未指定区域时的回退」。
// 若某区域仅有一种「大区」级入口(例如全美只有一个美东 PoP),则地理上非最优但只能复用,注释会标明「受服务商可用区限制」。
/// Jito mainnet block engines (`https://<region>.mainnet.block-engine.jito.wtf`).
/// There is no Los Angeles engine → use Salt Lake City for `LosAngeles`; `SwqosRegion::Default` uses the global mainnet URL.
pub const SWQOS_ENDPOINTS_JITO: [&str; 10] = [
"https://ny.mainnet.block-engine.jito.wtf",
"https://frankfurt.mainnet.block-engine.jito.wtf",
"https://amsterdam.mainnet.block-engine.jito.wtf",
"https://dublin.mainnet.block-engine.jito.wtf",
"https://slc.mainnet.block-engine.jito.wtf",
"https://tokyo.mainnet.block-engine.jito.wtf",
"https://singapore.mainnet.block-engine.jito.wtf",
"https://london.mainnet.block-engine.jito.wtf",
"https://slc.mainnet.block-engine.jito.wtf", // LosAngeles: no LA PoP; nearest US-West is SLC
"https://mainnet.block-engine.jito.wtf",
];
/// NextBlock regional HTTP hosts (see provider docs). `SwqosRegion` order; no dedicated LA PoP → SLC as US-West fallback.
pub const SWQOS_ENDPOINTS_NEXTBLOCK: [&str; 10] = [
"http://ny.nextblock.io",
"http://fra.nextblock.io",
"http://ams.nextblock.io",
"http://dublin.nextblock.io",
"http://slc.nextblock.io",
"http://tokyo.nextblock.io",
"http://sgp.nextblock.io",
"http://london.nextblock.io",
"http://slc.nextblock.io",
"http://fra.nextblock.io", // Default: 非地理区域;服务商无「全局」主机名时用 EU 枢纽作未选区回退
];
pub const SWQOS_ENDPOINTS_ZERO_SLOT: [&str; 10] = [
"http://ny.0slot.trade",
"http://de2.0slot.trade", // Use de2 for TSW, and de1 for OVH
"http://ams.0slot.trade",
"http://ams.0slot.trade", // Dublin: 无 IE 专用;在已公布 EU 点中选距爱尔兰最近的 ams(相对 de2 等)
"http://la.0slot.trade", // SLC: no UT PoP; nearest US-West published host
"http://jp.0slot.trade",
"http://jp.0slot.trade", // SG: 无本地 PoP;已公布 APAC 仅 jp,为表中离新加坡最近的大圆距离
"http://ams.0slot.trade", // London: 无 UK 专用;已公布 EU 点中 ams 距伦敦最近之一
"http://la.0slot.trade",
"http://de2.0slot.trade", // Default: 非地理区域;EU 枢纽 de2 作未选区回退
];
/// Nozomi Direct regions: ewr1, fra2, ams1, lon1, lax1, tyo1, sgp1, …
pub const SWQOS_ENDPOINTS_TEMPORAL: [&str; 10] = [
"http://ewr1.nozomi.temporal.xyz", // NewYork → Newark
"http://fra2.nozomi.temporal.xyz",
"http://ams1.nozomi.temporal.xyz",
"http://lon1.nozomi.temporal.xyz", // Dublin: no IE host; UK nearest Direct PoP
"http://lax1.nozomi.temporal.xyz", // SLC: US-West
"http://tyo1.nozomi.temporal.xyz",
"http://sgp1.nozomi.temporal.xyz",
"http://lon1.nozomi.temporal.xyz",
"http://lax1.nozomi.temporal.xyz",
"http://fra2.nozomi.temporal.xyz", // Default: 非地理区域;EU Direct 枢纽
];
pub const SWQOS_ENDPOINTS_BLOX: [&str; 10] = [
"https://ny.solana.dex.blxrbdn.com",
"https://germany.solana.dex.blxrbdn.com",
"https://amsterdam.solana.dex.blxrbdn.com",
"https://uk.solana.dex.blxrbdn.com", // Dublin: IE/UK edge
"https://la.solana.dex.blxrbdn.com", // SLC: no Mountain PoP; US-West LA
"https://tokyo.solana.dex.blxrbdn.com",
"https://tokyo.solana.dex.blxrbdn.com", // SG: 文档无 SGP 区域;已公布 APAC 仅 Tokyo,为距 SG 最近选项
"https://uk.solana.dex.blxrbdn.com",
"https://la.solana.dex.blxrbdn.com",
"https://global.solana.dex.blxrbdn.com", // Default: 非地理区域;全球任播
];
pub const SWQOS_ENDPOINTS_NODE1: [&str; 10] = [
"http://ny.node1.me",
"http://fra.node1.me",
"http://ams.node1.me",
"http://lon.node1.me", // Dublin: 已公布中英爱区域用 lon(地理上近爱尔兰)
"http://ny.node1.me", // SLC: 已公布美国仅 ny;美西无 PoP,受可用区限制复用美东
"http://tk.node1.me",
"http://tk.node1.me", // SG: 已公布 APAC 仅 tk;地理上为表中离 SG 最近
"http://lon.node1.me",
"http://ny.node1.me", // LosAngeles: 同上,美国仅 ny 入口
"http://fra.node1.me", // Default: 非地理区域;与 QUIC 对齐为 EU 枢纽
];
/// Node1 QUIC: port 16666. Region order matches [`SwqosRegion`].
/// server_name = host part (e.g. ny.node1.me). Auth: first bi stream = 16-byte UUID; each tx = new bi stream, bincode body.
pub const SWQOS_ENDPOINTS_NODE1_QUIC: [&str; 10] = [
"ny.node1.me:16666",
"fra.node1.me:16666",
"ams.node1.me:16666",
"lon.node1.me:16666",
"ny.node1.me:16666",
"tk.node1.me:16666",
"tk.node1.me:16666",
"lon.node1.me:16666",
"ny.node1.me:16666",
"fra.node1.me:16666", // Default: 非地理区域;与 HTTP 对齐为 EU 枢纽
];
/// Published: ny, slc, ams, fra, singapore, london, tokyo (no IE/UK split → london for Dublin).
pub const SWQOS_ENDPOINTS_FLASHBLOCK: [&str; 10] = [
"http://ny.flashblock.trade",
"http://fra.flashblock.trade",
"http://ams.flashblock.trade",
"http://london.flashblock.trade", // Dublin: no IE host; UK nearest
"http://slc.flashblock.trade",
"http://tokyo.flashblock.trade",
"http://singapore.flashblock.trade",
"http://london.flashblock.trade",
"http://slc.flashblock.trade",
"http://fra.flashblock.trade", // Default: 非地理区域;EU 枢纽
];
/// BlockRazor Send Transaction v2: plain-text Base64 body, auth in URI, Content-Type: text/plain. Keep-alive: POST /v2/health.
/// 若 HTTP 返回 500,可尝试 HTTPShttps://<region>.solana.blockrazor.io/v2/sendTransactionFrankfurt/NewYork/Tokyo),通过 custom_url 覆盖。
pub const SWQOS_ENDPOINTS_BLOCKRAZOR: [&str; 10] = [
"http://newyork.solana.blockrazor.xyz:443/v2/sendTransaction",
"http://frankfurt.solana.blockrazor.xyz:443/v2/sendTransaction",
"http://amsterdam.solana.blockrazor.xyz:443/v2/sendTransaction",
"http://london.solana.blockrazor.xyz:443/v2/sendTransaction", // Dublin: UK nearest published
"http://newyork.solana.blockrazor.xyz:443/v2/sendTransaction", // SLC: 文档无美西;美国仅 NY,受可用区限制
"http://tokyo.solana.blockrazor.xyz:443/v2/sendTransaction",
"http://tokyo.solana.blockrazor.xyz:443/v2/sendTransaction", // SG: 已公布 APAC 仅 Tokyo,为距 SG 最近
"http://london.solana.blockrazor.xyz:443/v2/sendTransaction",
"http://newyork.solana.blockrazor.xyz:443/v2/sendTransaction", // LosAngeles: 无美西入口;美国仅 NY
"http://frankfurt.solana.blockrazor.xyz:443/v2/sendTransaction", // Default: 非地理区域;EU 枢纽
];
/// BlockRazor gRPC endpoints. Region order matches [`SwqosRegion`].
/// Port 80 for gRPC protocol. Auth: apikey metadata in gRPC headers.
pub const SWQOS_ENDPOINTS_BLOCKRAZOR_GRPC: [&str; 10] = [
"http://newyork.solana-grpc.blockrazor.xyz:80",
"http://frankfurt.solana-grpc.blockrazor.xyz:80",
"http://amsterdam.solana-grpc.blockrazor.xyz:80",
"http://london.solana-grpc.blockrazor.xyz:80",
"http://newyork.solana-grpc.blockrazor.xyz:80", // SLC: 与 HTTP 一致;美国仅 NY
"http://tokyo.solana-grpc.blockrazor.xyz:80",
"http://tokyo.solana-grpc.blockrazor.xyz:80",
"http://london.solana-grpc.blockrazor.xyz:80",
"http://newyork.solana-grpc.blockrazor.xyz:80", // LosAngeles: 与 HTTP 一致
"http://frankfurt.solana-grpc.blockrazor.xyz:80", // Default: 非地理区域
];
/// Plain HTTP API path (`/iris?api-key=…&method=…`).
pub const ASTRALANE_PATH_IRIS: &str = "iris";
/// Binary HTTP API path (`/irisb?api-key=…&method=sendTransaction`, raw bincode body).
pub const ASTRALANE_PATH_IRISB: &str = "irisb";
/// Astralane **Plain** HTTP gateways (`/iris`). Pair with [`ASTRALANE_PATH_IRIS`].
pub const SWQOS_ENDPOINTS_ASTRALANE_PLAIN: [&str; 10] = [
"http://ny.gateway.astralane.io/iris",
"http://fr.gateway.astralane.io/iris",
"http://ams.gateway.astralane.io/iris",
"http://ams.gateway.astralane.io/iris", // Dublin: 无 IE 专用;在已公布 EU 点中选距爱尔兰最近的 ams
"http://la.gateway.astralane.io/iris",
"http://jp.gateway.astralane.io/iris",
"http://sg.gateway.astralane.io/iris",
"http://ams.gateway.astralane.io/iris", // London: 无 UK 专用;在已公布 EU 点中选距英国最近的 ams
"http://la.gateway.astralane.io/iris",
"https://edge.astralane.io/iris", // Default: 非地理区域;全局任播边缘
];
/// Astralane **Binary** HTTP gateways (`/irisb`). Pair with [`ASTRALANE_PATH_IRISB`].
pub const SWQOS_ENDPOINTS_ASTRALANE_BINARY: [&str; 10] = [
"http://ny.gateway.astralane.io/irisb",
"http://fr.gateway.astralane.io/irisb",
"http://ams.gateway.astralane.io/irisb",
"http://ams.gateway.astralane.io/irisb", // Dublin: 同 Plain
"http://la.gateway.astralane.io/irisb",
"http://jp.gateway.astralane.io/irisb",
"http://sg.gateway.astralane.io/irisb",
"http://ams.gateway.astralane.io/irisb", // London: 同 Plain
"http://la.gateway.astralane.io/irisb",
"https://edge.astralane.io/irisb", // Default: 同 Plain
];
/// Astralane QUIC endpoints (port 7000). Region order matches [`SwqosRegion`].
/// See: https://github.com/Astralane/astralane-quic-client.
pub const SWQOS_ENDPOINTS_ASTRALANE_QUIC: [&str; 10] = [
"ny.gateway.astralane.io:7000",
"fr.gateway.astralane.io:7000",
"ams.gateway.astralane.io:7000",
"ams.gateway.astralane.io:7000", // Dublin: 同 HTTP
"la.gateway.astralane.io:7000", // SLC: 美西 la 为最近已公布美区入口
"jp.gateway.astralane.io:7000",
"sg.gateway.astralane.io:7000",
"ams.gateway.astralane.io:7000", // London: 同 HTTP
"la.gateway.astralane.io:7000",
"lim.gateway.astralane.io:7000", // Default: 非地理区域;全局边缘
];
/// Astralane QUIC MEV-protected endpoints (port 9000). Same region order as SWQOS_ENDPOINTS_ASTRALANE_QUIC.
pub const SWQOS_ENDPOINTS_ASTRALANE_QUIC_MEV: [&str; 10] = [
"ny.gateway.astralane.io:9000",
"fr.gateway.astralane.io:9000",
"ams.gateway.astralane.io:9000",
"ams.gateway.astralane.io:9000",
"la.gateway.astralane.io:9000",
"jp.gateway.astralane.io:9000",
"sg.gateway.astralane.io:9000",
"ams.gateway.astralane.io:9000",
"la.gateway.astralane.io:9000",
"lim.gateway.astralane.io:9000",
];
pub const SWQOS_ENDPOINTS_STELLIUM: [&str; 10] = [
"http://ewr1.flashrpc.com",
"http://fra1.flashrpc.com",
"http://ams1.flashrpc.com",
"http://lhr1.flashrpc.com", // Dublin: 已公布 UK 用 lhr;地理上近爱尔兰
"http://ewr1.flashrpc.com", // SLC: 已公布美国仅 ewr;无美西 PoP,受可用区限制
"http://tyo1.flashrpc.com",
"http://tyo1.flashrpc.com", // SG: 表中无 SGPAPAC 仅 tyo,为距 SG 最近
"http://lhr1.flashrpc.com",
"http://ewr1.flashrpc.com", // LosAngeles: 同上,美国仅 ewr
"http://fra1.flashrpc.com", // Default: 非地理区域;EU 枢纽
];
pub const SWQOS_ENDPOINTS_SOYAS: [&str; 10] = [
"nyc.landing.soyas.xyz:9000",
"fra.landing.soyas.xyz:9000",
"ams.landing.soyas.xyz:9000",
"lon.landing.soyas.xyz:9000", // Dublin: 已公布用 lon;地理近爱尔兰
"nyc.landing.soyas.xyz:9000", // SLC: 已公布美国仅 nyc;无美西
"tyo.landing.soyas.xyz:9000",
"tyo.landing.soyas.xyz:9000", // SG: 表中 APAC 仅 tyo
"lon.landing.soyas.xyz:9000",
"nyc.landing.soyas.xyz:9000", // LosAngeles: 同上
"fra.landing.soyas.xyz:9000", // Default: 非地理区域;EU 枢纽
];
pub const SWQOS_ENDPOINTS_SPEEDLANDING: [&str; 10] = [
"nyc.speedlanding.trade:17778",
"fra.speedlanding.trade:17778",
"ams.speedlanding.trade:17778",
"ams.speedlanding.trade:17778", // Dublin: 已公布 EU 点中 ams 地理近爱尔兰
"nyc.speedlanding.trade:17778", // SLC: 表中美国仅 nyc;无美西 PoP,受可用区限制
"tyo.speedlanding.trade:17778",
"sgp.speedlanding.trade:17778",
"ams.speedlanding.trade:17778", // London: 已公布 EU 中 ams 距英国最近之一
"nyc.speedlanding.trade:17778", // LosAngeles: 同上,美国仅 nyc
"fra.speedlanding.trade:17778", // Default: 非地理区域;EU 枢纽
];
/// Helius Sender: POST /fast, dual routing to validators and Jito. API key optional (custom TPS only).
pub const SWQOS_ENDPOINTS_HELIUS: [&str; 10] = [
"http://ewr-sender.helius-rpc.com/fast",
"http://fra-sender.helius-rpc.com/fast",
"http://ams-sender.helius-rpc.com/fast",
"http://lon-sender.helius-rpc.com/fast", // Dublin: IE → UK/EU routing
"http://slc-sender.helius-rpc.com/fast",
"http://tyo-sender.helius-rpc.com/fast",
"http://sg-sender.helius-rpc.com/fast",
"http://lon-sender.helius-rpc.com/fast",
"http://slc-sender.helius-rpc.com/fast",
"https://sender.helius-rpc.com/fast", // Default: 非地理区域;全局 Sender
];
pub const SWQOS_MIN_TIP_DEFAULT: f64 = 0.00001; // 其它SWQOS默认最低小费
pub const SWQOS_MIN_TIP_JITO: f64 = 0.00001;
pub const SWQOS_MIN_TIP_NEXTBLOCK: f64 = 0.001;
pub const SWQOS_MIN_TIP_ZERO_SLOT: f64 = 0.0001;
pub const SWQOS_MIN_TIP_TEMPORAL: f64 = 0.0001;
pub const SWQOS_MIN_TIP_BLOXROUTE: f64 = 0.0001;
pub const SWQOS_MIN_TIP_NODE1: f64 = 0.0001; // 如需更高阈值可调整
pub const SWQOS_MIN_TIP_FLASHBLOCK: f64 = 0.0001;
pub const SWQOS_MIN_TIP_BLOCKRAZOR: f64 = 0.0001;
pub const SWQOS_MIN_TIP_ASTRALANE: f64 = 0.00001;
pub const SWQOS_MIN_TIP_STELLIUM: f64 = 0.0001; // Stellium requires minimum 0.001 SOL tip
pub const SWQOS_MIN_TIP_LIGHTSPEED: f64 = 0.0001; // Lightspeed requires minimum 0.001 SOL tip
pub const SWQOS_MIN_TIP_SOYAS: f64 = 0.001; // Soyas requires minimum 0.001 SOL tip
pub const SWQOS_MIN_TIP_SPEEDLANDING: f64 = 0.001; // Speedlanding requires minimum 0.001 SOL tip
/// Helius Sender: 0.0002 SOL when not swqos_only; use SWQOS_MIN_TIP_HELIUS_SWQOS_ONLY when swqos_only=true.
pub const SWQOS_MIN_TIP_HELIUS: f64 = 0.0002;
/// Helius Sender with swqos_only: minimum 0.000005 SOL (much lower tip allowed).
pub const SWQOS_MIN_TIP_HELIUS_SWQOS_ONLY: f64 = 0.000005;
#[cfg(test)]
mod tests {
use super::*;
const SWQOS_REGION_ENDPOINT_TABLES: &[&[&str]] = &[
&SWQOS_ENDPOINTS_JITO,
&SWQOS_ENDPOINTS_NEXTBLOCK,
&SWQOS_ENDPOINTS_ZERO_SLOT,
&SWQOS_ENDPOINTS_TEMPORAL,
&SWQOS_ENDPOINTS_BLOX,
&SWQOS_ENDPOINTS_NODE1,
&SWQOS_ENDPOINTS_NODE1_QUIC,
&SWQOS_ENDPOINTS_FLASHBLOCK,
&SWQOS_ENDPOINTS_BLOCKRAZOR,
&SWQOS_ENDPOINTS_BLOCKRAZOR_GRPC,
&SWQOS_ENDPOINTS_ASTRALANE_PLAIN,
&SWQOS_ENDPOINTS_ASTRALANE_BINARY,
&SWQOS_ENDPOINTS_ASTRALANE_QUIC,
&SWQOS_ENDPOINTS_ASTRALANE_QUIC_MEV,
&SWQOS_ENDPOINTS_STELLIUM,
&SWQOS_ENDPOINTS_SOYAS,
&SWQOS_ENDPOINTS_SPEEDLANDING,
&SWQOS_ENDPOINTS_HELIUS,
];
#[test]
fn all_swqos_endpoint_tables_align_with_swqos_region() {
const EXPECT: usize = 10;
for (idx, table) in SWQOS_REGION_ENDPOINT_TABLES.iter().enumerate() {
assert_eq!(
table.len(),
EXPECT,
"SWQOS endpoint table index {} length must match SwqosRegion (10 variants)",
idx
);
}
}
#[test]
fn astralane_quic_hosts_match_mev_row_by_row() {
for i in 0..10 {
let base = SWQOS_ENDPOINTS_ASTRALANE_QUIC[i].trim_end_matches(":7000");
let mev = SWQOS_ENDPOINTS_ASTRALANE_QUIC_MEV[i].trim_end_matches(":9000");
assert_eq!(base, mev, "Astralane QUIC vs MEV host mismatch at index {}", i);
}
}
#[test]
fn node1_http_host_matches_quic_without_port() {
for i in 0..10 {
let http_host =
SWQOS_ENDPOINTS_NODE1[i].strip_prefix("http://").expect("NODE1 HTTP URL");
let quic_host =
SWQOS_ENDPOINTS_NODE1_QUIC[i].strip_suffix(":16666").expect("NODE1 QUIC endpoint");
assert_eq!(http_host, quic_host, "Node1 HTTP vs QUIC host mismatch at index {}", i);
}
}
#[test]
fn astralane_plain_and_binary_same_origin_per_region() {
for i in 0..10 {
let plain = SWQOS_ENDPOINTS_ASTRALANE_PLAIN[i].trim_end_matches("/iris");
let binary = SWQOS_ENDPOINTS_ASTRALANE_BINARY[i].trim_end_matches("/irisb");
assert_eq!(plain, binary, "Astralane Plain vs Binary base URL mismatch at index {}", i);
}
}
}