helium_api/models/transactions/
mod.rs

1mod add_gateway_v1;
2mod assert_location_v1;
3mod assert_location_v2;
4mod coinbase_v1;
5mod consensus_group_failure_v1;
6mod consensus_group_v1;
7mod create_htlc_v1;
8mod dc_coinbase_v1;
9mod gen_gateway_v1;
10mod gen_price_oracle_v1;
11mod oui_v1;
12mod payment_v1;
13mod payment_v2;
14mod pending_txn_status;
15mod poc_receipts_v1;
16mod poc_receipts_v2;
17mod poc_request_v1;
18mod price_oracle_v1;
19mod redeem_htlc_v1;
20mod reward;
21mod rewards_v1;
22mod rewards_v2;
23mod routing_v1;
24mod security_coinbase_v1;
25mod security_exchange_v1;
26mod stake_validator_v1;
27mod state_channel_close_v1;
28mod state_channel_open_v1;
29mod token_burn_v1;
30mod token_exchange_rate_v1;
31mod transfer_hotspot_v1;
32mod transfer_validator_stake_v1;
33mod unstake_validator_v1;
34mod update_gateway_oui_v1;
35mod validator_heartbeat_v1;
36mod vars_v1;
37
38pub use add_gateway_v1::*;
39pub use assert_location_v1::*;
40pub use assert_location_v2::*;
41pub use coinbase_v1::*;
42pub use consensus_group_failure_v1::*;
43pub use consensus_group_v1::*;
44pub use create_htlc_v1::*;
45pub use dc_coinbase_v1::*;
46pub use gen_gateway_v1::*;
47pub use gen_price_oracle_v1::*;
48pub use oui_v1::*;
49pub use payment_v1::*;
50pub use payment_v2::*;
51pub use pending_txn_status::*;
52pub use poc_receipts_v1::*;
53pub use poc_receipts_v2::*;
54pub use poc_request_v1::*;
55pub use price_oracle_v1::*;
56pub use redeem_htlc_v1::*;
57pub use reward::*;
58pub use rewards_v1::*;
59pub use rewards_v2::*;
60pub use routing_v1::*;
61pub use security_coinbase_v1::*;
62pub use security_exchange_v1::*;
63pub use stake_validator_v1::*;
64pub use state_channel_close_v1::*;
65pub use state_channel_open_v1::*;
66pub use token_burn_v1::*;
67pub use token_exchange_rate_v1::*;
68pub use transfer_hotspot_v1::*;
69pub use transfer_validator_stake_v1::*;
70pub use unstake_validator_v1::*;
71pub use update_gateway_oui_v1::*;
72pub use validator_heartbeat_v1::*;
73pub use vars_v1::*;
74
75use serde::{Deserialize, Serialize};
76
77#[derive(Clone, Serialize, Deserialize, Debug)]
78#[serde(tag = "type", rename_all = "snake_case")]
79/// Represents one of various transactions in a block on the chain.
80pub enum Transaction {
81    AddGatewayV1(AddGatewayV1),
82    AssertLocationV1(AssertLocationV1),
83    AssertLocationV2(AssertLocationV2),
84    CoinbaseV1(CoinbaseV1),
85    ConsensusGroupFailureV1(ConsensusGroupFailureV1),
86    ConsensusGroupV1(ConsensusGroupV1),
87    CreateHtlcV1(CreateHtlcV1),
88    DcCoinbaseV1(DcCoinbaseV1),
89    GenGatewayV1(GenGatewayV1),
90    GenPriceOracleV1(GenPriceOracleV1),
91    OuiV1(OuiV1),
92    PaymentV1(PaymentV1),
93    PaymentV2(PaymentV2),
94    PocReceiptsV1(PocReceiptsV1),
95    PocReceiptsV2(PocReceiptsV2),
96    PocRequestV1(PocRequestV1),
97    PriceOracleV1(PriceOracleV1),
98    RedeemHtlcV1(RedeemHtlcV1),
99    RewardsV1(RewardsV1),
100    RewardsV2(RewardsV2),
101    RoutingV1(RoutingV1),
102    SecurityCoinbaseV1(SecurityCoinbaseV1),
103    SecurityExchangeV1(SecurityExchangeV1),
104    StakeValidatorV1(StakeValidatorV1),
105    StateChannelCloseV1(StateChannelCloseV1),
106    StateChannelOpenV1(StateChannelOpenV1),
107    TokenBurnExchangeRateV1(TokenBurnExchangeRateV1),
108    TokenBurnV1(TokenBurnV1),
109    TransferHotspotV1(TransferHotspotV1),
110    TransferValidatorStakeV1(TransferValidatorStakeV1),
111    UnstakeValidatorV1(UnstakeValidatorV1),
112    UpdateGatewayOuiV1(UpdateGatewayOuiV1),
113    ValidatorHeartbeatV1(ValidatorHeartbeatV1),
114    VarsV1(VarsV1),
115    #[serde(other)]
116    Unknown, // Any other transaction not supported
117}
118#[cfg(test)]
119mod test {
120    use super::*;
121    use crate::*;
122    use tokio::test;
123
124    #[test]
125    async fn txn() {
126        let client = get_test_client();
127        let txn = transactions::get(&client, "1gidN7e6OKn405Fru_0sGhsqca3lTsrfGKrM4dwM_E8")
128            .await
129            .expect("PocRequestV1");
130        if let Transaction::PocRequestV1(poc) = txn {
131            assert_eq!(
132                poc.block_hash,
133                "RS2mBvd_4pbKCglkkyMroDQekPNO0xDdYx6Te3HGDGg"
134            )
135        } else {
136            assert!(false)
137        }
138    }
139    #[test]
140    async fn consensus_group_v1() {
141        let client = get_test_client();
142        let txn = transactions::get(&client, "yh01SJk8dvyqb-BGXxkHFUuLi6wF1pfL0VEFStJUt-E")
143            .await
144            .expect("ConsensusGroupV1");
145        if let Transaction::ConsensusGroupV1(cg) = txn {
146            assert_eq!(cg.hash, "yh01SJk8dvyqb-BGXxkHFUuLi6wF1pfL0VEFStJUt-E")
147        } else {
148            assert!(false)
149        }
150    }
151    #[test]
152    async fn payment_v2() {
153        //dosqfzzaYtoGx278w4Xu5dnYt7aSZIkD1-IbtiiLQQM
154        let client = get_test_client();
155        let txn = transactions::get(&client, "C_jJZLKBOv_gRQ6P6wEpZPiRVAjf44FOx1iHOFD4haA")
156            .await
157            .expect("PaymentV2");
158        if let Transaction::PaymentV2(p) = txn {
159            assert_eq!(p.payments.len(), 1)
160        } else {
161            assert!(false)
162        }
163    }
164    #[test]
165    async fn poc_receipts_v1() {
166        let client = get_test_client();
167        let txn = transactions::get(&client, "8RaF-G4pvMVuIXfBYhdqNuIlFSEHPm_rC8TH-h4JYdE")
168            .await
169            .expect("PocReceipt");
170        if let Transaction::PocReceiptsV1(pr) = txn {
171            assert_eq!(pr.hash, "8RaF-G4pvMVuIXfBYhdqNuIlFSEHPm_rC8TH-h4JYdE")
172        } else {
173            assert!(false)
174        }
175    }
176
177    #[test]
178    async fn poc_receipts_v2() {
179        let client = get_test_client();
180        let txn = transactions::get(&client, "077Y_ArUR90ptUMAkiKPp-9NIZfqol5TgGFkoJZa_K8")
181            .await
182            .expect("PocReceipt");
183        if let Transaction::PocReceiptsV2(pr) = txn {
184            assert_eq!(pr.hash, "077Y_ArUR90ptUMAkiKPp-9NIZfqol5TgGFkoJZa_K8")
185        } else {
186            assert!(false)
187        }
188    }
189
190    #[test]
191    async fn payment_v1() {
192        let client = get_test_client();
193        let txn = transactions::get(&client, "iMSckt_hUcMFY_d7W-QOupY0MGq_g3-CC2dq3P-HWIw")
194            .await
195            .expect("PaymentV1");
196        if let Transaction::PaymentV1(p) = txn {
197            assert_eq!(
198                p.payee,
199                "14YeKFGXE23yAdACj6hu5NWEcYzzKxptYbm5jHgzw9A1P1UQfMv"
200            )
201        } else {
202            assert!(false)
203        }
204    }
205    #[test]
206    async fn rewards_v2() {
207        let client = get_test_client();
208        let txn = transactions::get(&client, "X0HNRGZ1HAX51CR8qS6LTopAosjFkuaaKXl850IpNDE")
209            .await
210            .expect("RewardsV2");
211        if let Transaction::RewardsV2(r) = txn {
212            assert_eq!(r.rewards.len(), 10138)
213        } else {
214            assert!(false)
215        }
216    }
217    #[test]
218    async fn assert_location_v1() {
219        let client = get_test_client();
220        let txn = transactions::get(&client, "_I16bycHeltuOo7eyqa4uhv2Bc7awcztZflyvRkVZ24")
221            .await
222            .expect("AssertLocationV1");
223        if let Transaction::AssertLocationV1(al) = txn {
224            assert_eq!(al.hash, "_I16bycHeltuOo7eyqa4uhv2Bc7awcztZflyvRkVZ24")
225        } else {
226            assert!(false)
227        }
228    }
229    #[test]
230    async fn assert_location_v2() {
231        let client = get_test_client();
232        let txn = transactions::get(&client, "TfjRv733Q9FBQ1_unw1c9g5ewVmMBuyf7APuyxKEqrw")
233            .await
234            .expect("AssertLocationV2");
235        if let Transaction::AssertLocationV2(al) = txn {
236            assert_eq!(
237                al.gateway,
238                "112WVxXCrCjiKmmDXLDUJuhYGEHMbXobUZe8oJQkHoMHEFa149a"
239            )
240        } else {
241            assert!(false)
242        }
243    }
244    #[test]
245    async fn add_gateway_v1() {
246        let client = get_test_client();
247        let txn = transactions::get(&client, "aoTggHSgaBAamuUUrXnY42jDZ5WUBxE0k-tshvfn35E")
248            .await
249            .expect("AddGatewayV1");
250        if let Transaction::AddGatewayV1(ag) = txn {
251            assert_eq!(
252                ag.gateway,
253                "112uuvztDziVQyLVvBxMsovsSPV5ZXkN6uQ5hrWSaWwV1oEZTZtd"
254            )
255        } else {
256            assert!(false)
257        }
258    }
259
260    #[test]
261    async fn add_gateway_v1_error() {
262        let client = get_test_client();
263        let txn = transactions::get(&client, "ia3c386ZnlVJorvo60WtXEFxy_0w35ImoIdmnW5lpJ8")
264            .await
265            .expect("AddGatewayV1");
266        if let Transaction::AddGatewayV1(ag) = txn {
267            assert_eq!(
268                ag.gateway,
269                "11GPcDmZGniewReZCnpC3SM19Jcw1sQU8W8CUnd7TCh4A6RmEkV"
270            )
271        } else {
272            assert!(false)
273        }
274    }
275
276    #[test]
277    async fn state_channel_close_v1() {
278        let client = get_test_client();
279        let txn = transactions::get(&client, "vjtEQK0vn1w69fV3TMrlnN6L_qprsoWM_-7DVspmLL8")
280            .await
281            .expect("StateChannelCloseV1");
282        if let Transaction::StateChannelCloseV1(sc) = txn {
283            assert_eq!(
284                sc.closer,
285                "11QVeYckasapcrmqjZqtfGTjE154uHHUvYPPwW6EMwzrpsdr213"
286            )
287        } else {
288            assert!(false)
289        }
290    }
291
292    #[test]
293    async fn transfer_hotspot_v1() {
294        let client = get_test_client();
295        let txn = transactions::get(&client, "fSFua7A8G41K05QXAvJi5N2OB0QqmQ7xp7u-My4rYHc")
296            .await
297            .expect("TransferHotspotV1");
298        if let Transaction::TransferHotspotV1(th) = txn {
299            assert_eq!(
300                th.seller,
301                "14mo9fFGKYFaWh7xscpDLg7misWcuU5xqR8mc8gHr4c43nDnzeX"
302            )
303        } else {
304            assert!(false)
305        }
306    }
307
308    #[test]
309    async fn transfer_routing_v1_new_xor() {
310        let client = get_test_client();
311
312        let txn = transactions::get(&client, "EjL6nBsSxovJluW-kdAaPcEiRt0OPIATOmlHD1Lth4Y")
313            .await
314            .expect("RoutingV1_NewXor");
315
316        if let Transaction::RoutingV1(r) = txn {
317            assert_eq!(r.oui, 12);
318            assert_eq!(
319                r.owner,
320                "112ewJNEUfSg3Jvo276tMjzFC2JzmmZcJJ32CWz2fzYqbyCMMTe1",
321            );
322            if let RoutingAction::NewXor(nx) = r.action {
323                assert_eq!(nx.filter, "wVwCiewtCpELAAAAAAAAAAAAAAAAAAAAf2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
324            } else {
325                assert!(false)
326            }
327        } else {
328            assert!(false)
329        }
330    }
331
332    #[test]
333    async fn unstake_validator_v1() {
334        let client = get_test_client();
335
336        let txn = transactions::get(&client, "fMT-7_f2WQNKAYIQWX2-V258KsoI61HYbt_zAbN3A1I")
337            .await
338            .expect("UnstakeValidatorv1");
339
340        if let Transaction::UnstakeValidatorV1(uv) = txn {
341            assert_eq!(
342                uv.address,
343                "11cY9Ly5H3hU4Ai2k7G9niHLAxsKb1ragQYGLJ7E9vh4Vnx6Efb"
344            );
345            assert_eq!(uv.stake_amount, 1000000000000u64.into());
346            assert_eq!(uv.fee, 35000);
347        } else {
348            assert!(false)
349        }
350    }
351
352    #[test]
353    async fn vars_v1() {
354        let client = get_test_client();
355        let txn = transactions::get(&client, "SB47bwBKP3ud1KdASYAndxkoIhZCXgPtusLUIsS7Q2o")
356            .await
357            .expect("VarsV1");
358        if let Transaction::VarsV1(v) = txn {
359            assert_eq!(
360                v.proof,
361                "MEUCIAXq0Pi0bK_DutFRF7R7ItEVrdUW2rmY8Guut5bHRboxAiEA9-wrvs7z9QZNRCC7XTKm4sb1cpXFD6TGB8Re8GfOyyA"
362            );
363            assert!(v.vars.get("sc_max_actors").is_some())
364        } else {
365            assert!(false)
366        }
367    }
368}