1use sp_runtime::traits::{Block as BlockT, Header as _, NumberFor};
20
21use crate::HeaderProvider;
22
23#[cfg(feature = "full-node")]
24use polkadot_primitives::{Block, Hash};
25
26pub(super) fn walk_backwards_to_target_block<Block, HP>(
29 backend: &HP,
30 target_number: NumberFor<Block>,
31 current_header: &Block::Header,
32) -> Result<(Block::Hash, NumberFor<Block>), sp_blockchain::Error>
33where
34 Block: BlockT,
35 HP: HeaderProvider<Block>,
36{
37 let mut target_hash = current_header.hash();
38 let mut target_header = current_header.clone();
39
40 loop {
41 if *target_header.number() < target_number {
42 unreachable!(
43 "we are traversing backwards from a known block; \
44 blocks are stored contiguously; \
45 qed"
46 );
47 }
48
49 if *target_header.number() == target_number {
50 return Ok((target_hash, target_number))
51 }
52
53 target_hash = *target_header.parent_hash();
54 target_header = backend
55 .header(target_hash)?
56 .expect("Header known to exist due to the existence of one of its descendants; qed");
57 }
58}
59
60#[cfg(feature = "full-node")]
67pub(crate) fn kusama_hard_forks() -> Vec<sc_consensus_grandpa::AuthoritySetHardFork<Block>> {
68 use sp_core::crypto::Ss58Codec;
69 use std::str::FromStr;
70
71 let forks = vec![
72 (623, "01e94e1e7e9cf07b3b0bf4e1717fce7448e5563901c2ef2e3b8e9ecaeba088b1", 1492283),
73 (624, "ddc4323c5e8966844dfaa87e0c2f74ef6b43115f17bf8e4ff38845a62d02b9a9", 1492436),
74 (625, "38ba115b296663e424e32d7b1655cd795719cef4fd7d579271a6d01086cf1628", 1492586),
75 (626, "f3172b6b8497c10fc772f5dada4eeb1f4c4919c97de9de2e1a439444d5a057ff", 1492955),
76 (627, "b26526aea299e9d24af29fdacd5cf4751a663d24894e3d0a37833aa14c58424a", 1493338),
77 (628, "3980d024327d53b8d01ef0d198a052cd058dd579508d8ed6283fe3614e0a3694", 1493913),
78 (629, "31f22997a786c25ee677786373368cae6fd501fd1bc4b212b8e267235c88179d", 1495083),
79 (630, "1c65eb250cf54b466c64f1a4003d1415a7ee275e49615450c0e0525179857eef", 1497404),
80 (631, "9e44116467cc9d7e224e36487bf2cf571698cae16b25f54a7430f1278331fdd8", 1498598),
81 ];
82
83 let authorities = vec![
84 "CwjLJ1zPWK5Ao9WChAFp7rWGEgN3AyXXjTRPrqgm5WwBpoS",
85 "Dp8FHpZTzvoKXztkfrUAkF6xNf6sjVU5ZLZ29NEGUazouou",
86 "DtK7YfkhNWU6wEPF1dShsFdhtosVAuJPLkoGhKhG1r5LjKq",
87 "FLnHYBuoyThzqJ45tdb8P6yMLdocM7ir27Pg1AnpYoygm1K",
88 "FWEfJ5UMghr52UopgYjawAg6hQg3ztbQek75pfeRtLVi8pB",
89 "ECoLHAu7HKWGTB9od82HAtequYj6hvNHigkGSB9g3ApxAwB",
90 "GL1Tg3Uppo8GYL9NjKj4dWKcS6tW98REop9G5hpu7HgFwTa",
91 "ExnjU5LZMktrgtQBE3An6FsQfvaKG1ukxPqwhJydgdgarmY",
92 "CagLpgCBu5qJqYF2tpFX6BnU4yHvMGSjc7r3Ed1jY3tMbQt",
93 "DsrtmMsD4ijh3n4uodxPoiW9NZ7v7no5wVvPVj8fL1dfrWB",
94 "HQB4EctrVR68ozZDyBiRJzLRAEGh1YKgCkAsFjJcegL9RQA",
95 "H2YTYbXTFkDY1cGnv164ecnDT3hsD2bQXtyiDbcQuXcQZUV",
96 "H5WL8jXmbkCoEcLfvqJkbLUeGrDFsJiMXkhhRWn3joct1tE",
97 "DpB37GDrJDYcmg2df2eqsrPKMay1u8hyZ6sQi2FuUiUeNLu",
98 "FR8yjKRA9MTjvFGK8kfzrdC23Fr6xd7rfBvZXSjAsmuxURE",
99 "DxHPty3B9fpj3duu6Gc6gCSCAvsydJHJEY5G3oVYT8S5BYJ",
100 "DbVKC8ZJjevrhqSnZyJMMvmPL7oPPL4ed1roxawYnHVgyin",
101 "DVJV81kab2J6oTyRJ9T3NCwW2DSrysbWCssvMcE6cwZHnAd",
102 "Fg4rDAyzoVzf39Zo8JFPo4W314ntNWNwm3shr4xKe8M1fJg",
103 "GUaNcnAruMVxHGTs7gGpSUpigRJboQYQBBQyPohkFcP6NMH",
104 "J4BMGF4W9yWiJz4pkhQW73X6QMGpKUzmPppVnqzBCqw5dQq",
105 "E1cR61L1tdDEop4WdWVqcq1H1x6VqsDpSHvFyUeC41uruVJ",
106 "GoWLzBsj1f23YtdDpyntnvN1LwXKhF5TEeZvBeTVxofgWGR",
107 "CwHwmbogSwtRbrkajVBNubPvWmHBGU4bhMido54M9CjuKZD",
108 "FLT63y9oVXJnyiWMAL4RvWxsQx21Vymw9961Z7NRFmSG7rw",
109 "FoQ2y6JuHuHTG4rHFL3f2hCxfJMvtrq8wwPWdv8tsdkcyA8",
110 "D7QQKqqs8ocGorRA12h4QoBSHDia1DkHeXT4eMfjWQ483QH",
111 "J6z7FP35F9DiiU985bhkDTS3WxyeTBeoo9MtLdLoD3GiWPj",
112 "EjapydCK25AagodRbDECavHAy8yQY1tmeRhwUXhVWx4cFPv",
113 "H8admATcRkGCrF1dTDDBCjQDsYjMkuPaN9YwR2mSCj4DWMQ",
114 "FtHMRU1fxsoswJjBvyCGvECepC7gP2X77QbNpyikYSqqR6k",
115 "DzY5gwr45GVRUFzRMmeg8iffpqYF47nm3XbJhmjG97FijaE",
116 "D3HKWAihSUmg8HrfeFrftSwNK7no261yA9RNr3LUUdsuzuJ",
117 "D82DwwGJGTcSvtB3SmNrZejnSertbPzpkYvDUp3ibScL3ne",
118 "FTPxLXLQvMDQYFA6VqNLGwWPKhemMYP791XVj8TmDpFuV3b",
119 "FzGfKmS7N8Z1tvCBU5JH1eBXZQ9pCtRNoMUnNVv38wZNq72",
120 "GDfm1MyLAQ7Rh8YPtF6FtMweV4hz91zzeDy2sSABNNqAbmg",
121 "DiVQbq7sozeKp7PXPM1HLFc2m7ih8oepKLRK99oBY3QZak1",
122 "HErWh7D2RzrjWWB2fTJfcAejD9MJpadeWWZM2Wnk7LiNWfG",
123 "Es4DbDauYZYyRJbr6VxrhdcM1iufP9GtdBYf3YtSEvdwNyb",
124 "EBgXT6FaVo4WsN2LmfnB2jnpDFf4zay3E492RGSn6v1tY99",
125 "Dr9Zg4fxZurexParztL9SezFeHsPwdP8uGgULeRMbk8DDHJ",
126 "JEnSTZJpLh91cSryptj57RtFxq9xXqf4U5wBH3qoP91ZZhN",
127 "DqtRkrmtPANa8wrYR7Ce2LxJxk2iNFtiCxv1cXbx54uqdTN",
128 "GaxmF53xbuTFKopVEseWiaCTa8fC6f99n4YfW8MGPSPYX3s",
129 "EiCesgkAaighBKMpwFSAUdvwE4mRjBjNmmd5fP6d4FG8DAx",
130 "HVbwWGUx7kCgUGap1Mfcs37g6JAZ5qsfsM7TsDRcSqvfxmd",
131 "G45bc8Ajrd6YSXav77gQwjjGoAsR2qiGd1aLzkMy7o1RLwd",
132 "Cqix2rD93Mdf7ytg8tBavAig2TvhXPgPZ2mejQvkq7qgRPq",
133 "GpodE2S5dPeVjzHB4Drm8R9rEwcQPtwAspXqCVz1ooFWf5K",
134 "CwfmfRmzPKLj3ntSCejuVwYmQ1F9iZWY4meQrAVoJ2G8Kce",
135 "Fhp5NPvutRCJ4Gx3G8vCYGaveGcU3KgTwfrn5Zr8sLSgwVx",
136 "GeYRRPkyi23wSF3cJGjq82117fKJZUbWsAGimUnzb5RPbB1",
137 "DzCJ4y5oT611dfKQwbBDVbtCfENTdMCjb4KGMU3Mq6nyUMu",
138 ];
139
140 let authorities = authorities
141 .into_iter()
142 .map(|address| {
143 (
144 sp_consensus_grandpa::AuthorityId::from_ss58check(address)
145 .expect("hard fork authority addresses are static and they should be carefully defined; qed."),
146 1,
147 )
148 })
149 .collect::<Vec<_>>();
150
151 forks
152 .into_iter()
153 .map(|(set_id, hash, number)| {
154 let hash = Hash::from_str(hash)
155 .expect("hard fork hashes are static and they should be carefully defined; qed.");
156
157 sc_consensus_grandpa::AuthoritySetHardFork {
158 set_id,
159 block: (hash, number),
160 authorities: authorities.clone(),
161 last_finalized: None,
162 }
163 })
164 .collect()
165}